久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

如何在TKE集群中實現(xiàn)簡單的藍綠發(fā)布和灰度發(fā)布

171次閱讀
沒有評論

共計 4412 個字符,預計需要花費 12 分鐘才能閱讀完成。

如何在 TKE 集群中實現(xiàn)簡單的藍綠發(fā)布和灰度發(fā)布,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

原理介紹

我們通常使用 Deployment、StatefulSet 等 Kubernetes 自帶的工作負載來部署業(yè)務,每個工作負載都管理一組 Pod,以 Deployment 為例:

如何在 TKE 集群中實現(xiàn)簡單的藍綠發(fā)布和灰度發(fā)布

通常還會為每個工作負載創(chuàng)建對應的 Service,Service 通過 selector 來匹配后端 Pod,其它服務或者外部通過訪問 Service 即可訪問到后端 Pod 提供的服務。要對外暴露可以直接將 Service 類型設(shè)置為 LoadBalancer,LB 插件會自動為其創(chuàng)建 CLB (騰訊云負載均衡器) 作為流量入口。

如何實現(xiàn)藍綠發(fā)布?以 Deployment 為例,集群中部署兩個不同版本的 Deployment,它們的 Pod 擁有共同的 label,但有一個 label 的值不同,用于區(qū)分不同的版本,Service 使用 selector 選中了其中一個版本的 Deployment 的 Pod,通過修改 Service 的 selector 中決定 服務版本的 label 的值來改變 Service 后端對應的 Deployment,實現(xiàn)讓服務從一個版本直接切換到另一個版本,即藍綠發(fā)布:

如何在 TKE 集群中實現(xiàn)簡單的藍綠發(fā)布和灰度發(fā)布

如何實現(xiàn)灰度發(fā)布?雖然我們通常會為每個工作負載都創(chuàng)建一個 Service,但 Kubernetes 并沒有限制 Service 一定要與工作負載一一對應,因為 Service 是通過 selector 來匹配后端 Pod 的,只要不同工作負載的 Pod 都能被相同 selector 選中,就可以實現(xiàn)一個 Service 對應多個版本的工作負載的效果,調(diào)整不同版本工作負載的副本數(shù)就相當于調(diào)整不同版本服務的權(quán)重,實現(xiàn)灰度發(fā)布:

如何在 TKE 集群中實現(xiàn)簡單的藍綠發(fā)布和灰度發(fā)布

使用 YAML 創(chuàng)建資源

本文的示例將使用 yaml 的方式部署工作負載和創(chuàng)建 Service,有兩種操作方式。

方式一:在 TKE 或 EKS 控制臺右上角點擊 YAML 創(chuàng)建資源,然后將本文示例的 yaml 粘貼進去:

如何在 TKE 集群中實現(xiàn)簡單的藍綠發(fā)布和灰度發(fā)布

方式二:將示例的 yaml 保存成文件,然后使用 kubectl 指定 yaml 文件來創(chuàng)建,如: kubectl apply -f xx.yaml。

部署多版本工作負載

要實現(xiàn)藍綠發(fā)布或灰度發(fā)布,首先我們需要在集群中部署多個版本的工作負載,這里以簡單的 nginx 為例,部署第一個版本:

apiVersion: apps/v1
kind: Deployment
metadata:
 name: nginx-v1
spec:
 replicas: 3
 selector:
 matchLabels:
 app: nginx
 version: v1
 template:
 metadata:
 labels:
 app: nginx
 version: v1
 spec:
 containers:
 - name: nginx
 image:  openresty/openresty:centos 
 ports:
 - name: http
 protocol: TCP
 containerPort: 80
 volumeMounts:
 - mountPath: /usr/local/openresty/nginx/conf/nginx.conf
 name: config
 subPath: nginx.conf
 volumes:
 - name: config
 configMap:
 name: nginx-v1
apiVersion: v1
kind: ConfigMap
metadata:
 labels:
 app: nginx
 version: v1
 name: nginx-v1
data:
 nginx.conf: |-
 worker_processes 1;
 events {
 accept_mutex on;
 multi_accept on;
 use epoll;
 worker_connections 1024;
 }
 http {
 ignore_invalid_headers off;
 server {
 listen 80;
 location / {
 access_by_lua  
 local header_str = ngx.say(nginx-v1)
  
 }
 }
 }

再部署第二個版本:

apiVersion: apps/v1
kind: Deployment
metadata:
 name: nginx-v2
spec:
 replicas: 3
 selector:
 matchLabels:
 app: nginx
 version: v2
 template:
 metadata:
 labels:
 app: nginx
 version: v2
 spec:
 containers:
 - name: nginx
 image:  openresty/openresty:centos 
 ports:
 - name: http
 protocol: TCP
 containerPort: 80
 volumeMounts:
 - mountPath: /usr/local/openresty/nginx/conf/nginx.conf
 name: config
 subPath: nginx.conf
 volumes:
 - name: config
 configMap:
 name: nginx-v2
apiVersion: v1
kind: ConfigMap
metadata:
 labels:
 app: nginx
 version: v2
 name: nginx-v2
data:
 nginx.conf: |-
 worker_processes 1;
 events {
 accept_mutex on;
 multi_accept on;
 use epoll;
 worker_connections 1024;
 }
 http {
 ignore_invalid_headers off;
 server {
 listen 80;
 location / {
 access_by_lua  
 local header_str = ngx.say(nginx-v2)
  
 }
 }
 }

可以在控制臺看到部署的情況:

如何在 TKE 集群中實現(xiàn)簡單的藍綠發(fā)布和灰度發(fā)布

實現(xiàn)藍綠發(fā)布

為我們部署的 Deployment 創(chuàng)建 LoadBalancer 類型的 Service 對外暴露服務,指定使用 v1 版本的服務:

apiVersion: v1
kind: Service
metadata:
 name: nginx
spec:
 type: LoadBalancer
 ports:
 - port: 80
 protocol: TCP
 name: http
 selector:
 app: nginx
 version: v1

測試訪問:

$ for i in {1..10}; do curl EXTERNAL-IP; done; #  替換  EXTERNAL-IP  為  Service  的  CLB IP  地址
nginx-v1
nginx-v1
nginx-v1
nginx-v1
nginx-v1
nginx-v1
nginx-v1
nginx-v1
nginx-v1
nginx-v1

全是 v1 版本的響應,現(xiàn)在我們切到 v2 版本,修改 Service 的 selector,讓它選中 v2 版本的服務,如果在控制臺改,先找到對應 Service,點擊 編輯 YAML:

如何在 TKE 集群中實現(xiàn)簡單的藍綠發(fā)布和灰度發(fā)布

修改 selector 部分:

 selector:
 app: nginx
 version: v2

或者也可以直接用 kubectl 修改:

kubectl patch service nginx -p  {spec :{ selector :{ version : v2}}}

再次測試訪問:

$ for i in {1..10}; do curl EXTERNAL-IP; done; #  替換  EXTERNAL-IP  為  Service  的  CLB IP  地址
nginx-v2
nginx-v2
nginx-v2
nginx-v2
nginx-v2
nginx-v2
nginx-v2
nginx-v2
nginx-v2
nginx-v2

全是 v2 版本的響應,成功實現(xiàn)了藍綠發(fā)布。

實現(xiàn)灰度發(fā)布

相比藍綠發(fā)布,我們?yōu)椴唤o Service 指定使用 v1 版本的服務,從 selector 中刪除 version 標簽,讓 Service 同時選中兩個版本的 Deployment 的 Pod:

apiVersion: v1
kind: Service
metadata:
 name: nginx
spec:
 type: LoadBalancer
 ports:
 - port: 80
 protocol: TCP
 name: http
 selector:
 app: nginx

測試訪問:

$ for i in {1..10}; do curl EXTERNAL-IP; done; #  替換  EXTERNAL-IP  為  Service  的  CLB IP  地址
nginx-v1
nginx-v1
nginx-v2
nginx-v2
nginx-v2
nginx-v1
nginx-v1
nginx-v1
nginx-v2
nginx-v2

可以看到,一半是 v1 版本的響應,另一半是 v2 版本的響應。現(xiàn)在我們來調(diào)節(jié) v1 和 v2 版本的 Deployment 的副本,將 v1 版本調(diào)至 1 個副本,v2 版本調(diào)至 4 個副本。

可以通過控制臺操作:

如何在 TKE 集群中實現(xiàn)簡單的藍綠發(fā)布和灰度發(fā)布

也可以通過 kubectl 操作:

kubectl scale deployment/nginx-v1 --replicas=1
kubectl scale deployment/nginx-v2 --replicas=4

然后再次進行訪問測試:

$ for i in {1..10}; do curl EXTERNAL-IP; done; #  替換  EXTERNAL-IP  為  Service  的  CLB IP  地址 nginx-v2nginx-v1nginx-v2nginx-v2nginx-v2nginx-v2nginx-v1nginx-v2nginx-v2nginx-v2$ for i in {1..10}; do curl EXTERNAL-IP; done; #  替換  EXTERNAL-IP  為  Service  的  CLB IP  地址
nginx-v2
nginx-v1
nginx-v2
nginx-v2
nginx-v2
nginx-v2
nginx-v1
nginx-v2
nginx-v2
nginx-v2

可以看到,10 次訪問中只有 2 次返回了 v1 版本,v1 與 v2 的響應比例與其副本數(shù)比例一致,為 1:4,通過控制不同版本服務的副本數(shù)就實現(xiàn)了灰度發(fā)布。

關(guān)于如何在 TKE 集群中實現(xiàn)簡單的藍綠發(fā)布和灰度發(fā)布問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注丸趣 TV 行業(yè)資訊頻道了解更多相關(guān)知識。

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-08-25發(fā)表,共計4412字。
轉(zhuǎn)載說明:除特殊說明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 黄石市| 南陵县| 天峻县| 新余市| 景宁| 攀枝花市| 南充市| 新营市| 甘洛县| 云梦县| 赤城县| 都匀市| 宁武县| 石棉县| 三河市| 偃师市| 新和县| 塔河县| 纳雍县| 晋州市| 晋中市| 浙江省| 集贤县| 崇仁县| 弋阳县| 六安市| 丽水市| 建昌县| 柏乡县| 彰化市| 南岸区| 麻城市| 云龙县| 如东县| 新兴县| 商城县| 四子王旗| 沿河| 开平市| 五家渠市| 安多县|