1. 前置准备:清理历史实验资源
- 清理此前实验创建的Deployment、Service、Ingress资源,避免历史配置干扰当前实验流程
- 观察测试Pod状态:此前创建的Bacon Pod初始处于ContainerCreating状态,因需从镜像仓库拉取镜像,拉取完成后自动进入Running状态
2. Ingress默认错误行为与自定义错误页
2.1 默认行为验证
- 基于此前学习的rewrite(路径重写)实验资源(Rewind地址跳转、路径重写规则)进行验证:
- 访问正常路径可正常转发到后端服务,请求正常处理
- 访问不存在的路径时,默认返回Ingress-nginx的通用错误页(如视频中的“权力修复 万万猜数游戏”页面)
- 关键结论:默认情况下,仅后端服务返回502/503等网关类错误时,Ingress-nginx才会捕获并返回默认错误页;若后端服务正常处理请求但返回404(如访问了后端不存在的路由,但服务本身运行正常),Ingress-nginx会判定为正常请求,不会触发默认错误页,这类低级别错误需要自定义错误页捕获
2.2 自定义错误页配置
- 支持两种配置维度:全局默认自定义错误页(对所有Ingress生效)、单Ingress定制化错误页
- 配置示例资源:
- Deployment
errtest:镜像为nginx:latest,标签app=errtest - Service:匹配
errcodeDeployment - Deployment
errcode:镜像为wangyanglinux/tools:errweb1.0,用于测试定制化错误页效果 - Ingress资源
err.xinxianghf.com(命名空间default):- 默认后端为
errtest对应的Service(端口80) - 自定义404、415错误码的返回页面,由
errcodeDeployment提供
- 默认后端为
- Deployment
- 验证效果:访问
err.xinxianghf.com的不存在路径时,会返回自定义错误页,而非后端原始404响应 - 补充实验:猜数游戏场景下,后端随机数为52,提交错误答案51时,Ingress-nginx会捕获后端返回的错误,返回自定义错误页,验证自定义错误页可捕获后端特定错误码
3. Snippet配置实现UA感知路由跳转
- Snippet是Ingress-nginx提供的扩展配置能力,支持写入原生nginx兼容的配置片段,实现复杂路由逻辑
- 本节演示场景:移动端(Android/iPhone)与PC端访问同一域名,跳转到不同服务
3.1 前置配置
- Snippet功能默认关闭,需要先修改Ingress-nginx控制器的ConfigMap,开启snippet配置,保存后重建Ingress-nginx的Pod让配置生效
3.2 配置示例资源
- Deployment
snippet:镜像为nginx:latest - Service:匹配
snippetDeployment - Ingress资源
snippet.xinxianghf.com(命名空间default):- 配置Snippet规则:
- 定义变量
agentflag,默认值为0 - 若请求的User-Agent(UA)匹配Android或iPhone,将
agentflag置为1 - 若
agentflag为1,则302跳转到www.baidu.com
- 定义变量
- 默认规则:访问根路径时,后端指向
snippet对应的Service(端口80)
- 配置Snippet规则:
3.3 验证效果
- PC端访问
snippet.xinxianghf.com,正常返回后端服务的Hallormide页面 - 移动端(UA标识为Android/iPhone)访问同一域名,自动跳转到
www.baidu.com - 结论:Snippet可复用nginx原生高级参数,实现复杂的流量路由逻辑
4. Ingress黑白名单配置
- 黑白名单是基于IP的访问控制能力,核心优先级规则:作用域越小,优先级越高
4.1 基础概念
- 白名单:默认拒绝所有请求,仅允许白名单中的IP访问
- 黑名单:默认放行所有请求,仅拒绝黑名单中的IP访问
4.2 配置方式与适用场景
| 配置方式 | 生效范围 | 优先级 | 适用场景 |
|---|---|---|---|
Ingress Annotations(注解) |
仅当前Ingress资源生效 | 高 | 白名单:需求较少,仅允许特定IP访问的场景 |
Ingress-nginx ConfigMap |
全局所有Ingress资源生效 | 低 | 黑名单:全局拒绝风险IP的场景 |
4.3 实验演示:黑名单ConfigMap全局配置
- 编辑Ingress-nginx控制器的ConfigMap(命名空间
ingress-nginx,名称ingress-nginx-controller),添加黑名单规则:deny 192.168.66.12;(拒绝该IP的所有访问) - 为快速生效,删除所有已有Ingress资源,Ingress-nginx会自动重新生成配置
- 验证:从192.168.66.12的机器访问Ingress服务,返回403 Forbidden,其他IP访问正常,黑名单生效
4.4 实验演示:黑名单Annotations局部配置
- 清理ConfigMap中的黑名单配置,删除所有Ingress资源
- 创建测试资源:Deployment
black-service、对应Service、Ingress资源,在Ingress的Annotations中添加nginx.ingress.kubernetes.io/deny: "192.168.10.101",拒绝该IP访问 - 添加域名解析到Ingress Service的地址,验证:192.168.10.101访问返回403,其他IP访问正常,Annotations配置的黑名单生效
4.5 注意事项
- 修改ConfigMap后,Ingress-nginx支持热更新,但速度较慢,直接删除Ingress资源让控制器重新生成配置是更快的生效方式
- 白名单需求较少,建议用Annotations配置,灵活性更高,无需全局修改控制器配置
AI 总结
本节核心讲解了Ingress-nginx的3类高阶流量治理能力:自定义错误页可捕获后端低级别错误(如404)并返回定制化页面;Snippet扩展配置支持复用原生nginx能力,实现UA感知等复杂路由逻辑;黑白名单基于IP实现访问控制,通过Annotations和ConfigMap两种配置方式分别满足局部和全局的访问控制需求,同时明确了不同配置方式的优先级和适用场景,为生产环境的Ingress流量管理提供了实用方案。