金丝雀发布又称为灰度发布。它能够缓慢的将修改推广到一小部分用户,验证没有问题后,再推广到全部用户,以降低生产环境引入新功能带来的风险。 主要实现思想是SVC 通过标签 将生产流量逐步转发到新版本的POD中,不断扩容新版本Deployment的副本数,缩减旧版本的副本数 ## 工作负载概览 | **工作负载** | **名称** | **标签** | **标签选择器** | **作用** | | --- | --- | --- | --- | --- | | service | web-service | 无 | app: nginx env: prod | 负载均衡,通过筛选pod 的标签进行流量转发 | | deployment | web-nginx-v1(旧版本,使用nginx1.14镜像) web-nginx-v2(新版本,使用nginx1.20镜像) | 随意,为方便管理,这里我们与下面的pod 的标签保持一致 | app: nginx env: prod release:v1(旧) release:v2(新) | 扩展管理、管理pod等 | | pod | web-nginx | app: nginx env: prod release:v1(旧) release:v2(新) | 无 | 管理容器,最小调度单位 | 通过nginx 的版本进行验证,举个例子 svc 的Cluster IP为 1.1.1.1,那我们就通过curl 1.1.1.1/net 查看404 显示中的nginx版本,即可快速区分 ## YAML 以下为详细yaml配置文件 ### SVC ```yaml apiVersion: v1 kind: Service metadata: name: web-service spec: selector: app: nginx env: prod ports: - protocol: TCP port: 80 targetPort: 80 ``` ### 旧Deployment ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: web-nginx-v1 labels: app: nginx env: prod release: v1 spec: replicas: 10 selector: matchLabels: app: nginx env: prod release: v1 template: metadata: labels: app: nginx env: prod release: v1 spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80 ``` ### 新Deplyment ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: web-nginx-v2 labels: app: nginx env: prod release: v2 spec: replicas: 1 selector: matchLabels: app: nginx env: prod release: v2 template: metadata: labels: app: nginx env: prod release: v2 spec: containers: - name: nginx image: nginx:1.20.1 ports: - containerPort: 80 ``` ## 具体操作 运行svc 和deployment ```yaml kubectl apply -f canary-dp-old.yaml -f canary-svc.yaml ``` 查看SVC的CLUSTER-IP ```yaml kubectl get svc ``` 查看运行状态并测试服务可用性 ```yaml kubectl get pod curl SVC的CLUSTER-IP/net ``` 开始金丝雀部署 ```yaml kubectl apply -f canary-dp-new.yaml ``` 查看运行状态,并测试金丝雀的服务情况 ```yaml kubectl get pod curl SVC的CLUSTER-IP/net ``` 逐步扩容金丝雀的副本数量,减少v1版本的副本数量 ```yaml kubectl scale deployment web-nginx-v2 --replicas 数量(建议逐步加大) kubectl scale deployment web-nginx-v1 --replicas 数量(建议逐步减小) ```