通过Ingress进行灰度发布
1. 创建实验资源
开始实验之前,您需要先创建云服务器ECS和ACK集群资源。
说明:在实验资源创建过程中,ECS会安装命令行工具kubectl并连接ACK集群,方便您在后续实验中通过ECS中的Kubernetes命令行工具kubectl来管理ACK集群以及应用。
- 在实验室页面,单击创建资源。
- (可选)在实验室页面左侧导航栏中,单击云产品资源列表,可查看本次实验资源相关信息(例如IP地址、用户信息等)。
说明:资源创建过程需要7~10分钟。
2. 部署Deployment V1应用
本步骤指导你如何部署Deployment V1应用,并使用Ingress实现Deployment V1应用的外部访问。
- 执行如下命令,创建名为app-v1.yaml的YAML文件。
vi app-v1.yaml
- 按i键进入编辑模式,将如下代码复制到文件中。
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
- 按ECS键退出编辑模式,输入:wq,然后回车保存并退出文件。
- 执行如下命令,部署Deployement V1应用。
kubectl apply -f app-v1.yaml
- 执行如下命令,创建名为ingress-v1.yaml的Ingress YAML文件。
vi ingress-v1.yaml
- 按i键进入编辑模式,将如下代码复制到文件中,并将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
- 按ECS键退出编辑模式,输入:wq,然后回车保存并退出文件。
- 执行如下命令,部署Ingress资源。
kubectl apply -f ingress-v1.yaml
- 执行如下命令,进行测试。
说明:您可在云产品资源列表中查看k8s集群id。
curl my-app.集群id.cn-shanghai.alicontainer.com
返回结果如下,表示您已成功访问到Deployment V1应用。
3. 部署Deployment V2应用
本步骤指导你如何部署Deployment V2应用。
- 执行如下命令,创建名为app-v2.yaml的YAML文件。
vi app-v2.yaml
- 按i键进入编辑模式,将如下代码复制到文件中。
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
- 按ECS键退出编辑模式,输入:wq,然后回车保存并退出文件。
- 执行如下命令,部署Deployement V2应用。
kubectl apply -f app-v2.yaml
4. 按照权重策略灰度到Deployment V2应用
本步骤指导你如何按照权重策略灰度到Deployment V2应用。
- 执行如下命令,创建名为ingress-v2-canary-weigth.yaml的YAML文件。
vi ingress-v2-canary-weigth.yaml
- 按i键进入编辑模式,将如下代码复制到文件中,并将hots参数中的集群id修改为k8s集群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
- 按ECS键退出编辑模式,输入:wq,然后回车保存并退出文件。
- 执行如下命令,部署Ingress资源。
kubectl apply -f ingress-v2-canary-weigth.yaml
- 执行如下命令,并将命令中的集群id修改为k8s集群id,进行测试。
说明:您可在云产品资源列表中查看k8s集群id。
while sleep 0.1;do curl my-app.集群id.cn-shanghai.alicontainer.com; done
- 返回结果如下,表示已成功按照权重策略灰度到Deployment V2应用。按CTRL+C键退出。
5. 按照Header策略灰度到Deployment V2应用
本步骤指导你如何按照Header策略灰度到Deployment V2应用。
- 执行如下命令,创建名为ingress-v2-canary-header.yaml的YAML文件。
vi ingress-v2-canary-header.yaml
- 按i键进入编辑模式,将如下代码复制到文件中,并将hots参数中的集群id修改为k8s集群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
- 按ECS键退出编辑模式,输入:wq,然后回车保存并退出文件。
- 执行如下命令,部署Ingress资源。
kubectl apply -f ingress-v2-canary-header.yaml
- 执行如下命令,并将命令中的集群id修改为k8s集群id,进行测试。
说明:您可在云产品资源列表中查看k8s集群id。
curl my-app.集群id.cn-shanghai.alicontainer.com
返回结果如下,访问到Deployment V1应用。
- 执行如下命令,并将命令中的集群id修改为k8s集群id,设置新的header。
说明:您可在云产品资源列表中查看k8s集群id。
curl my-app.集群id.cn-shanghai.alicontainer.com -H "x-app-canary: true"
返回结果如下,访问到Deployment V2应用,表示已成功按照Header策略灰度到Deployment V2应用。
实验地址:https://developer.aliyun.com/adc/scenario/878989bf8cb4456597f38dc259e20c65