开发者学堂课程【企业级运维之云原生与 Kubernets 实战课程:实验三:灰度发布】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/913/detail/14607
实验三:灰度发布
一、实验概述
通过 ingress 实现灰度发布,实现权重灰度和根据 header 灰度。
二、涉及实验资源
1. ACK 托管版集群;
2. ECS 客户端:Linux 带有公网 ip 的客户端,并且为集群外场景;
3. 域名账号。
三、实验架构
四、实验准备
1. 创建阿里云托管版 ACK 集群,已经部署好 nginx-ingress-controller 组件,已经部署好 logtail 组件(默认勾选“使用日志服务”,选择创建新的 Project);
2. 使用 ack 里面的 Cloud Shell 进行连接以配置管理集群或 kubectl 客户端(备注,所有执行操作都在 kubectl 客户端执行),客户端配置方法参考官网:容器集群控制台( cs.console.aliyun.com )->集群信息-“安装和设置 kubectl”;
3. 确认集群具有公网能力,保证可以拉取实验镜像;
4. 安装日志组件并确认其正常工作;
Ÿ 可以在创建集群时选中使用日志服务,启用 Logtail 组件;
Ÿ 也可以为已有集群启用 Logtail 组件:容器集群控制台( cs.console.aliyun.com)->运维管理->组件管理->日志与监控区->安装 logtail-ds 组件;
Ÿ 最后可以通过 “kubectl -n kube-system get pod | grep log”命令查看组件 Pod 的运行状态;
建议:在实验过程中尽量收集日志,以便遇到问题可以及时排查错误。
五、实验步骤
1. 创建测试应用
使用 yaml 创建好两个 Development 和 Service,分别创建 web1 应用以及灰度环境的 web2 应用:
Kubectl apply -f d.yaml
2. 创建 Ingress 实现权重灰度
apiVersion: extensions/v1beta1
kind:Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
name: huidu
namespace: default
spec:
rules:
#服务域名,可以自定义
- host: www.web.com
http:
paths:
- backend:
serviceName: web1-svc
servicePort: 80
path:/
pathType: ImplementationSpecific
---
apiVersion: extensions/v1beta1
kind:Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/canary: 'true'
nginx.ingress.kubernetes.io/canary-weight: '50'
name:huidu2
namespace: default
spec:
rules:
#服务域名,可以自定义
- host: www.web.com
http:
paths:
-backend:
当设置灰度权重为50%,测试实现效果:
Ÿ ClintIP 是 Ingress Controller Pod IP,ServerIP 是对应的后端 Service Pod IP,其中 10.205.0.135 是 web1,10.205.0.6 是 web2;
Ÿ 两个 Ingress Controller Pod 相互建联成功后,与后端 Service 连接,权重设置会有所不同;
Ÿ IP 为10.205.0.132的 Pod 会稍微多于另一个 Pod,即负载均衡稍有偏差;
3. 创建 Ingress 实现 Header 灰度
要求 header 为 ack:test 的请求灰度,其他 header 为 10% 流量灰度;
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/canary: 'true'
nginx.ingress.kubernetes.io/canary-by-header: ack
nginx.ingress.kubernetes.io/canary-by-header-value: test nginx.ingress.kubernetes.io/canary-weight: '10'
name: huidu2
namespace: default
当没有 header 设定时,20 次 service 访问,其中有 2 次转发给 web2;
当 header 指向 ack:test 时,所有请求都转发给 web2。
4. 验证日志服务
a. 查看 Ingress 日志
b. 编写查询语句过滤需要的日志信息;
例如查询:_container_ip
为172.20.0.142 的日志出现次数
查询语句: *│selectcount(*)where_container_ip_='172.20.0.142'
其中 172.20.0.142 替换为对应业务 pod 的实际 ip。
以上就是本次灰度发布实验。