一,实现方式
通过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
四,配置步骤
- 启动2个Pod,分别是nginx-web和nginx-web2
- 对应配置2个服务nginx-web-service,nginx-web-service2;其中nginx-web-service2为nodeport,假定端口号为30016,节点IP为
- 创建 Service 指向目标 IP(使用 ClusterIP 类型)
apiVersion: v1
kind: Service
metadata:
name: external-efg-proxy
namespace: main
spec:
type: ClusterIP
ports:
- port: 80
targetPort: 30016
protocol: TCP
- 创建 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
- 创建 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
五,验证
- 验证不带header的请求
curl -v --resolve abc.jenly.cn:80:10.50.0.100 http://abc.jenly.cn/index.html?test=Jenly
-
查看nginx-web访问日志

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



Comments