在阿里云 ACK (Alibaba Cloud Container Service for Kubernetes) 容器服务中,利用 Ingress Controller 实现平滑的灰度发布,可以有效降低新版本上线带来的风险,确保用户体验。以下是一种常见的配置方法:
通过 Ingress 规则,结合 Kubernetes Service 的标签选择器,逐步将流量从旧版本导向新版本。可以使用 Nginx Ingress Controller 提供的权重 (weight) 或 Header Based Routing 等功能来实现。
my-app:v2) 和旧版本应用 (例如:my-app:v1) 分别创建 Kubernetes Deployment。
version: v1 (旧版本 Service)version: v2 (新版本 Service)nginx.ingress.kubernetes.io/canary: "true" 来标记一个Ingress是灰度发布的Ingress。
使用 nginx.ingress.kubernetes.io/canary-weight: "X" 注解来设置流量权重。X 是一个 0 到 100 之间的整数,表示导向新版本的流量百分比。
示例:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app-ingress
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "20" # 20% 流量导向新版本
spec:
rules:
- host: myapp.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-app-v2-service # 新版本 Service
port:
number: 80
- path: /
pathType: Prefix
backend:
service:
name: my-app-v1-service # 旧版本 Service
port:
number: 80
这个配置会将 20% 的流量路由到 my-app-v2-service (新版本),其余 80% 流量路由到 my-app-v1-service (旧版本)。
可以使用 nginx.ingress.kubernetes.io/canary-by-header 注解,根据特定的 HTTP Header 值将流量导向新版本。
示例:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app-ingress
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "version" # 根据 "version" Header
nginx.ingress.kubernetes.io/canary-by-header-value: "v2" # Header 值为 "v2"
spec:
rules:
- host: myapp.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-app-v2-service # 新版本 Service
port:
number: 80
- path: /
pathType: Prefix
backend:
service:
name: my-app-v1-service # 旧版本 Service
port:
number: 80
这个配置会将所有包含 version: v2 Header 的请求路由到 my-app-v2-service (新版本),其余请求路由到 my-app-v1-service (旧版本)。
可以使用 nginx.ingress.kubernetes.io/canary-by-cookie 注解,根据特定的 HTTP Cookie 值将流量导向新版本。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app-ingress
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-cookie: "user_group"
spec:
rules:
- host: myapp.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-app-v2-service # 新版本 Service
port:
number: 80
- path: /
pathType: Prefix
backend:
service:
name: my-app-v1-service # 旧版本 Service
port:
number: 80
这个配置会将所有包含 user_group Cookie 的请求路由到 my-app-v2-service (新版本),其余请求路由到 my-app-v1-service (旧版本)。需要注意的是,你需要控制客户端的cookie。
nginx.ingress.kubernetes.io/canary-weight 的值,例如从 20% 增加到 50%,再到 80%,直至 100%。
nginx.ingress.kubernetes.io/canary: "true" 注解。
通过以上步骤,你就可以在阿里云 ACK 容器服务中,利用 Ingress Controller 实现平滑、安全的灰度发布啦!🚀