实验三:灰度发布 | 学习笔记

本文摘要:开发者学堂课程【企业级运维之云原生与 Kubernets 实战课程#xff1a;实验三#xff1a;灰度发布】学习笔记#xff0c;与课程紧密联系#xff0c;让用户快速学习知识。课程地址#xff1a;https://developer.aliyun.com/learning/course......

开发者学堂课程【企业级运维之云原生与 Kubernets 实战课程:实验三:灰度发布】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/913/detail/14607


实验三:灰度发布

一、实验概述

通过 ingress 实现灰度发布,实现权重灰度和根据 header 灰度。

 

二、涉及实验资源

1. ACK 托管版集群;

2. ECS 客户端:Linux 带有公网 ip 的客户端,并且为集群外场景;

3. 域名账号。

 

三、实验架构

image.png

 

四、实验准备

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

image.png

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%,测试实现效果:

image.png

Ÿ 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;

image.png

当 header 指向 ack:test 时,所有请求都转发给 web2。

image.png

4. 验证日志服务

a. 查看 Ingress 日志

image.png

b. 编写查询语句过滤需要的日志信息;

例如查询:_container_ip为172.20.0.142 的日志出现次数

查询语句: *│selectcount(*)where_container_ip_='172.20.0.142'

其中 172.20.0.142 替换为对应业务 pod 的实际 ip。

以上就是本次灰度发布实验。

 

标签