k8s 通过 Ingress 进行灰度发布
k8s 通过 Ingress 通过设置 权重/请求头 进行灰度发布。
部署 Deployment V1 应用
本步骤指导你如何部署 Deployment V1 应用,并使用 Ingress 实现 Deployment V1 应用的外部访问。
执行如下命令,创建名为 app-v1.yaml 的 YAML 文件。
apiVersion: v1
kind: Service
metadata:
name: my-app-v1
labels:
app: my-app
spec:
ports:
- name: http
port: 80
targetPort: http
selector:
app: my-app
version: v1.0.0
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app-v1
labels:
app: my-app
spec:
replicas: 1
selector:
matchLabels:
app: my-app
version: v1.0.0
template:
metadata:
labels:
app: my-app
version: v1.0.0
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "9101"
spec:
containers:
- name: my-app
image: registry.cn-hangzhou.aliyuncs.com/containerdemo/containersol-k8s-deployment-strategies
ports:
- name: http
containerPort: 8080
- name: probe
containerPort: 8086
env:
- name: VERSION
value: v1.0.0
livenessProbe:
httpGet:
path: /live
port: probe
initialDelaySeconds: 5
periodSeconds: 5
readinessProbe:
httpGet:
path: /ready
port: probe
periodSeconds: 5
执行如下命令,部署 Deployement V1 应用。
kubectl apply -f app-v1.yaml
执行如下命令,创建名为 ingress-v1.yaml 的 Ingress YAML 文件。
将如下代码复制到文件中,并将 hots 参数中的集群id
修改为k8s集群id
。
说明:您可在云产品资源列表中查看 k8s 集群id。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app
labels:
app: my-app
spec:
rules:
- host: my-app.集群id.cn-shanghai.alicontainer.com
http:
paths:
- backend:
service:
name: my-app-v1
port:
number: 80
path: /
pathType: Prefix
执行如下命令,部署 Ingress 资源。
kubectl apply -f ingress-v1.yaml
执行如下命令,进行测试。
curl my-app.<集群id>.cn-shanghai.alicontainer.com
返回结果如下,表示您已成功访问到 Deployment V1 应用。
Host: my-app-v1-6fc68db67d-xd2kf, Version: v1.0.0
部署 Deployment V2 应用
本步骤指导你如何部署 Deployment V2 应用。
执行如下命令,创建名为 app-v2.yaml 的 YAML 文件。将如下代码复制到文件中。
apiVersion: v1
kind: Service
metadata:
name: my-app-v2
labels:
app: my-app
spec:
ports:
- name: http
port: 80
targetPort: http
selector:
app: my-app
version: v2.0.0
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app-v2
labels:
app: my-app
spec:
replicas: 1
selector:
matchLabels:
app: my-app
version: v2.0.0
template:
metadata:
labels:
app: my-app
version: v2.0.0
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "9101"
spec:
containers:
- name: my-app
image: registry.cn-hangzhou.aliyuncs.com/containerdemo/containersol-k8s-deployment-strategies
ports:
- name: http
containerPort: 8080
- name: probe
containerPort: 8086
env:
- name: VERSION
value: v2.0.0
livenessProbe:
httpGet:
path: /live
port: probe
initialDelaySeconds: 5
periodSeconds: 5
readinessProbe:
httpGet:
path: /ready
port: probe
periodSeconds: 5
执行如下命令,部署 Deployement V2 应用。
kubectl apply -f app-v2.yaml
按照权重策略灰度到 Deployment V2 应用
本步骤指导你如何按照权重策略灰度到 Deployment V2 应用。
执行如下命令,创建名为 ingress-v2-canary-weigth.yaml 的 YAML 文件。将如下代码复制到文件中,并将 hots 参数中的集群id
修改为k8s 集群id
。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app-canary
labels:
app: my-app
annotations:
# Enable canary and send 10% of traffic to version 2
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "10"
spec:
rules:
- host: my-app.集群id.cn-shanghai.alicontainer.com
http:
paths:
- backend:
service:
name: my-app-v2
port:
number: 80
path: /
pathType: Prefix
执行如下命令,部署 Ingress 资源。
kubectl apply -f ingress-v2-canary-weigth.yaml
执行如下命令进行测试。
while sleep 0.1;do curl my-app.<集群id>.cn-shanghai.alicontainer.com; done
返回结果如下,有 10% 返回版本为 v2.0.0
,表示已成功按照权重策略灰度到 Deployment V2 应用。按 CTRL+C 键退出。
Host: my-app-v1-6fc68db67d-xd2kf, Version: v1.0.0
Host: my-app-v1-6fc68db67d-xd2kf, Version: v1.0.0
Host: my-app-v1-6fc68db67d-xd2kf, Version: v1.0.0
Host: my-app-v1-6fc68db67d-xd2kf, Version: v1.0.0
Host: my-app-v1-6fc68db67d-xd2kf, Version: v1.0.0
Host: my-app-v1-6fc68db67d-xd2kf, Version: v1.0.0
Host: my-app-v1-6fc68db67d-xd2kf, Version: v1.0.0
Host: my-app-v1-6fc68db67d-xd2kf, Version: v1.0.0
Host: my-app-v2-648947bdcb-2z4s5, Version: v2.0.0
Host: my-app-v1-6fc68db67d-xd2kf, Version: v1.0.0
Host: my-app-v2-648947bdcb-2z4s5, Version: v2.0.0
Host: my-app-v1-6fc68db67d-xd2kf, Version: v1.0.0
按照 Header 策略灰度到 Deployment V2 应用
本步骤指导你如何按照 Header 策略灰度到 Deployment V2 应用。
执行如下命令,创建名为 ingress-v2-canary-header.yaml 的 YAML 文件。将如下代码复制到文件中,并将 hots 参数中的集群id 修改为 k8s 集群id。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app-canary
labels:
app: my-app
annotations:
# Enable canary and send traffic with headder x-app-canary to version 2
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "x-app-canary"
nginx.ingress.kubernetes.io/canary-by-header-value: "true"
spec:
rules:
- host: my-app.集群id.cn-shanghai.alicontainer.com
http:
paths:
- backend:
service:
name: my-app-v2
port:
number: 80
path: /
pathType: Prefix
执行如下命令,部署 Ingress 资源。
kubectl apply -f ingress-v2-canary-header.yaml
执行如下命令,并将命令中的集群id 修改为 k8s 集群id,进行测试。
curl my-app.<集群id>.cn-shanghai.alicontainer.com
返回结果如下,访问到 Deployment V1 应用。
Host: my-app-v1-6fc68db67d-xd2kf, Version: v1.0.0
执行如下命令,并将命令中的集群id 修改为 k8s 集群id,设置新的 header。
curl my-app.<集群id>.cn-shanghai.alicontainer.com -H "x-app-canary: true"
返回结果如下,访问到 Deployment V2 应用,表示已成功按照 Header 策略灰度到 Deployment V2 应用。
Host: my-app-v2-648947bdcb-2z4s5, Version: v2.0.0
本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 (CC BY-NC-ND 4.0) 进行许可。