13-Ingress 生产实战

📅 2026/8/2 3:58:19
13-Ingress 生产实战
Ingress 生产实战概念引入文章 09 里你学了一个最简单的 Ingress按域名路径把流量分到不同 Service。但生产环境远比这复杂基础 Ingress#09 生产 Ingress本篇 ───────────────── ───────────────── http://app.com → web https://app.com → web ← TLS 加密 http://app.com/api → api /api(/.*) → /$1 ← rewrite 重写 同一 Service 按 header 分流 ← 金丝雀灰度 每个 IP 每秒最多 10 请求 ← 限流保护本文将同时展示传统 Ingress 注解方式和Gateway API 等效实现帮你理解两者的联系。HTTPSTLS 终止后明文转发/api 请求重写到 /header: versionv2→ 金丝雀版本客户端Ingress Controller(Nginx)web Serviceapi Servicecanary Service原理讲解TLS 终止TLS 终止在 Ingress 层面完成——客户端到 Ingress 是 HTTPSIngress 到后端 Pod 是 HTTPapiVersion:networking.k8s.io/v1kind:Ingressmetadata:name:app-tlsspec:tls:-hosts:-app.example.comsecretName:app-tls-secret# 包含证书和私钥的 Secretrules:-host:app.example.comhttp:paths:-path:/pathType:Prefixbackend:service:name:webport:number:80K8s 集群公网 HTTPS明文 HTTP浏览器Ingress持有 TLS 证书web PodHTTP证书管理生产中用 cert-manager 自动申请/续期 Let’s Encrypt 证书# cert-manager 自动管理证书注解metadata:annotations:cert-manager.io/cluster-issuer:letsencrypt-prodRewrite路径重写后端服务通常不关心路由路径——/api/users对后端来说就是/usersmetadata:annotations:nginx.ingress.kubernetes.io/rewrite-target:/$2spec:rules:-http:paths:-path:/api(/|$)(.*)# 捕获组pathType:ImplementationSpecificbackend:service:name:api-serviceport:number:8080请求路径 → 到达后端的路径 ───────────────────────────────────────── /api/users → /users /api/orders/123 → /orders/123 / → /不走 rewriteGateway API 等效HTTPRoute 通过filters实现filters:-type:URLRewriteurlRewrite:path:type:ReplacePrefixMatchreplacePrefixMatch:/金丝雀灰度基于 Header 分流不切流量到新版本仅让特定用户带 header看到新版本# 主 Ingress稳定版本——所有流量默认走这里apiVersion:networking.k8s.io/v1kind:Ingressmetadata:name:app-stablespec:rules:-host:app.example.comhttp:paths:-path:/pathType:Prefixbackend:service:name:app-v1port:number:80---# 金丝雀 Ingress紧带特定 header 的请求走 v2apiVersion:networking.k8s.io/v1kind:Ingressmetadata:name:app-canaryannotations:nginx.ingress.kubernetes.io/canary:truenginx.ingress.kubernetes.io/canary-by-header:x-versionnginx.ingress.kubernetes.io/canary-by-header-value:v2spec:rules:-host:app.example.comhttp:paths:-path:/pathType:Prefixbackend:service:name:app-v2port:number:80✅ 是❌ 否请求到达有 headerx-version: v2?app-v2 (金丝雀)app-v1 (稳定版)Gateway API 等效直接在 HTTPRoute 中使用weightbackendRefs:-name:app-v1port:80weight:90-name:app-v2port:80weight:10限流保护后端服务metadata:annotations:# 每秒每 IP 最多 2 次请求nginx.ingress.kubernetes.io/limit-rps:2# burst rate × multiplier设为 1 即 burst2nginx.ingress.kubernetes.io/limit-burst-multiplier:1超过限制后返回503 Service Temporarily Unavailable。Ingress 注解 vs Gateway API 对照表功能Ingress 注解Gateway APITLSspec.tls SecretGatewaylisteners.tls HTTPRouteRewriterewrite-targetannotationHTTPRoutefilters.URLRewrite金丝雀headercanary-by-headerannotationHTTPRoutematches.headers金丝雀权重canary-weightannotationHTTPRoutebackendRefs.weight限流limit-rpsannotation需 Controller 特定扩展动手实验配套实验位于docs/labs/beginner/ingress-production/步骤 1部署实验环境cddocs/labs/beginner/ingress-productionbashsetup.sh步骤 2验证 TLS 终止# 查看 TLS 配置kubectl describe ingress app-tls# 用 -k 忽略自签名证书验证curl-khttps://localhost/步骤 3验证 Rewrite# 请求 /app/api/hello → 后端收到 /hello用 -k 跳过自签名证书验证curl-khttps://localhost/app/api/hello# 预期输出API Response步骤 4验证金丝雀灰度# 不带 header → v1稳定版curl-khttps://localhost/# 预期输出Hello from v1# 带 header → v2金丝雀版本curl-k-Hx-version: v2https://localhost/# 预期输出Hello from v2 (Canary!)步骤 5验证限流# 快速发送 20 个请求限流配置每秒 2 次burst2foriin$(seq120);docurl-k-s-o/dev/null-w%{http_code} https://localhost/;doneecho# 预期前几个返回 200后面的返回 503限流步骤 6清理bashteardown.sh自检问题[基础]Ingress 上配置 TLS 后流量从客户端到后端的加密范围是什么[理解]rewrite-target: /$2中$2是什么意思如果不加 rewrite 注解/api/users的请求到了后端路径是什么[应用]你需要发布一个新版本只想让 QA 团队验证。用什么方式做灰度最合适为什么查看答案TLS 的加密范围是客户端到 Ingress Controller边缘终止 / Edge Termination。Ingress 持有证书解密 TLS 后以明文 HTTP 转发给后端 Pod。后端 Pod 不需要处理 TLS。这就是TLS 终止——加密在 Ingress 这里终止了。如果需要端到端加密客户端 → Ingress → Pod 全程 HTTPS可以配置 SSL Passthrough 或让后端也配置 TLS。$2是正则表达式的第二个捕获组。在path: /api(/|$)(.*)中(/|$)是$1匹配/或结尾(.*)是$2匹配路径剩余部分。例如/api/users$1/$2usersrewrite 后变成/users。如果不加 rewrite 注解/api/users到达后端的路径就是/api/users——后端需要在路由中处理/api前缀不方便。基于 header 的金丝雀灰度最合适。让 QA 团队在浏览器或测试工具中带上特定 header如x-team: qa只有他们的请求路由到新版本其他用户完全不受影响。这比基于权重的金丝雀更精确——QA 可以反复测试新版本而不用担心把普通用户随机分流到可能不稳定版本。 本文来自 K8s Guide —— 开源免费的 Kubernetes 中文学习指南️ 初学者轨道 面试轨道从零基础到拿 Offer 一站式覆盖 每篇文章配套 Kind 实验脚本本地一键运行 本文源码docs/beginner/20-gateway-api.md⭐ 如果对你有帮助欢迎 Star github.com/callmebg/k8s-guide