2026-01-05 16:11:37

k8s灰度的一种实现方式

一,实现方式

通过ingress-nginx做转发

二,实验环境

  • k8s集群一个
  • nginx服务2个
  • ingress vip为10.50.0.100
  • node ip为 10.50.0.204

三,实现目标

当请求Header里面有特定字段,比如X-Gray=true时,访问到efg.jenly.cn,默认情况访问到abc.jenly.cn,abc对应服务nginx-web,efg对应服务nginx-web2

四,配置步骤

  1. 启动2个Pod,分别是nginx-web和nginx-web2
  2. 对应配置2个服务nginx-web-service,nginx-web-service2;其中nginx-web-service2为nodeport,假定端口号为30016,节点IP为
  3. 创建 Service 指向目标 IP(使用 ClusterIP 类型)
apiVersion: v1 kind: Service metadata: name: external-efg-proxy namespace: main spec: type: ClusterIP ports: - port: 80 targetPort: 30016 protocol: TCP
  1. 创建 Endpoints 指向具体的 IP
apiVersion: v1 kind: Endpoints metadata: name: external-efg-proxy namespace: main subsets: - addresses: - ip: 10.50.2.204 # 替换为实际的 efg.jenly.cn 的 IP 地址 ports: - port: 80 protocol: TCP
  1. 创建 Ingress 使用 canary 注解
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: abc-final-ingress namespace: main annotations: kubernetes.io/ingress.class: "nginx" # 使用 canary 注解根据请求头分流 nginx.ingress.kubernetes.io/canary: "true" nginx.ingress.kubernetes.io/canary-by-header: "X-Saic-Hw-Cloud" nginx.ingress.kubernetes.io/canary-by-header-value: "true" # 改为 HTTP 协议 nginx.ingress.kubernetes.io/backend-protocol: "HTTP" # 配置片段 nginx.ingress.kubernetes.io/configuration-snippet: | # 重写路径到 /efg,保留参数 rewrite ^/(.*)$ /efg$is_args$args break; # 代理配置 proxy_set_header Host efg.jenly.cn; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; spec: rules: - host: abc.jenly.cn http: paths: - path: / pathType: Prefix backend: service: name: external-efg-proxy port: number: 80

五,验证

  1. 验证不带header的请求
curl -v --resolve abc.jenly.cn:80:10.50.0.100 http://abc.jenly.cn/index.html?test=Jenly
  1. 查看nginx-web访问日志

  2. 验证带header的请求

curl -v --resolve abc.jenly.cn:80:10.50.0.100 http://abc.jenly.cn/index.html?test=Jenly -H "X-Gray: true"
  1. 查看nginx-web2访问日志

本文链接:https://blog.jenly.cn/post/k8s-ingress-nginx.html

-- EOF --

Comments

本站支持IPv6访问