基于应用版本通过Kubernetes的Nginx Ingress控制器分流微服务流量
基于GKE Nginx Ingress实现按Android版本分流Socket服务
1. 部署新Socket服务实例
首先为新代码部署独立的Deployment和Service,与旧服务做隔离:
新服务Deployment(socket-service-v2)
apiVersion: apps/v1 kind: Deployment metadata: name: socket-service-v2 spec: replicas: 3 selector: matchLabels: app: socket-service version: v2 template: metadata: labels: app: socket-service version: v2 spec: containers: - name: socket-service image: your-registry/socket-service:v2 # 替换为你的新代码镜像地址 ports: - containerPort: 8080 # 匹配服务监听端口
新服务Service(socket-service-v2)
apiVersion: v1 kind: Service metadata: name: socket-service-v2 spec: selector: app: socket-service version: v2 ports: - port: 80 targetPort: 8080
2. 配置Nginx Ingress流量分流规则
利用Nginx Ingress的金丝雀(Canary)特性,根据Android应用版本的请求标识,将流量分别转发到旧/新服务:
主Ingress(处理Android 3.1版本流量)
作为默认流量入口,对应旧服务socket-service:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: socket-service-main annotations: nginx.ingress.kubernetes.io/ssl-redirect: "true" # 保留你已有的GKE HTTP负载均衡联动注解 spec: ingressClassName: nginx # 替换为你的Nginx Ingress类名 tls: - hosts: - your-socket-domain.com # 替换为你的业务域名 secretName: your-tls-secret # 替换为你的SSL证书Secret rules: - host: your-socket-domain.com http: paths: - path: /socket pathType: Prefix backend: service: name: socket-service port: number: 80
金丝雀Ingress(处理Android 3.2版本流量)
启用金丝雀规则,精准匹配版本3.2的请求转发到新服务:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: socket-service-canary annotations: nginx.ingress.kubernetes.io/canary: "true" # 方式1:通过自定义请求头匹配(推荐,精准度更高) nginx.ingress.kubernetes.io/canary-by-header: "X-App-Version" nginx.ingress.kubernetes.io/canary-by-header-value: "3.2" # 方式2:通过User-Agent匹配(如果应用在UA中携带版本信息) # nginx.ingress.kubernetes.io/canary-by-user-agent: "Android.*3\.2" spec: ingressClassName: nginx tls: - hosts: - your-socket-domain.com secretName: your-tls-secret rules: - host: your-socket-domain.com http: paths: - path: /socket pathType: Prefix backend: service: name: socket-service-v2 port: number: 80
3. 验证分流效果
使用curl模拟不同版本的请求,验证流量路由是否符合预期:
# 模拟Android 3.1版本请求,应路由到旧服务 curl -H "X-App-Version: 3.1" https://your-socket-domain.com/socket # 模拟Android 3.2版本请求,应路由到新服务 curl -H "X-App-Version: 3.2" https://your-socket-domain.com/socket
也可以查看Nginx Ingress控制器日志,确认流量转发情况:
kubectl logs -n kube-system <nginx-ingress-controller-pod-name> | grep "socket-service"
注意事项
- 确保Android应用发起请求时,携带正确的版本标识(自定义
X-App-Version头或包含版本的User-Agent) - 确认GKE的HTTP应用负载均衡已正确指向Nginx Ingress的Service,流量能正常穿透到Ingress层
- 若需要灰度放量,可通过
nginx.ingress.kubernetes.io/canary-weight注解调整新服务的流量占比
内容的提问来源于stack exchange,提问作者Ashu Upadhyay
相关产品推荐
相关产品推荐

