You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于应用版本通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 06:23:34