如何在TKE集群中實現(xiàn)簡單的藍綠發(fā)布和灰度發(fā)布,針對這個問題,這篇文章詳細介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
撫遠網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),撫遠網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為撫遠上千余家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)營銷網(wǎng)站建設(shè)要多少錢,請找那個售后服務(wù)好的撫遠做網(wǎng)站的公司定做!
我們通常使用 Deployment、StatefulSet 等 Kubernetes 自帶的工作負載來部署業(yè)務(wù),每個工作負載都管理一組 Pod,以 Deployment 為例:

通常還會為每個工作負載創(chuàng)建對應(yīng)的 Service,Service 通過 selector 來匹配后端 Pod,其它服務(wù)或者外部通過訪問 Service 即可訪問到后端 Pod 提供的服務(wù)。要對外暴露可以直接將 Service 類型設(shè)置為 LoadBalancer,LB 插件會自動為其創(chuàng)建 CLB (騰訊云負載均衡器) 作為流量入口。
如何實現(xiàn)藍綠發(fā)布?以 Deployment 為例,集群中部署兩個不同版本的 Deployment,它們的 Pod 擁有共同的 label,但有一個 label 的值不同,用于區(qū)分不同的版本,Service 使用 selector 選中了其中一個版本的 Deployment 的 Pod,通過修改 Service 的 selector 中決定 服務(wù)版本的 label 的值來改變 Service 后端對應(yīng)的 Deployment,實現(xiàn)讓服務(wù)從一個版本直接切換到另一個版本,即藍綠發(fā)布:

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

本文的示例將使用 yaml 的方式部署工作負載和創(chuàng)建 Service,有兩種操作方式。
方式一:在 TKE 或 EKS 控制臺右上角點擊 YAML 創(chuàng)建資源,然后將本文示例的 yaml 粘貼進去:

方式二:將示例的 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")
';
}
}
}可以在控制臺看到部署的情況:

為我們部署的 Deployment 創(chuàng)建 LoadBalancer 類型的 Service 對外暴露服務(wù),指定使用 v1 版本的服務(wù):
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 版本的響應(yīng),現(xiàn)在我們切到 v2 版本,修改 Service 的 selector,讓它選中 v2 版本的服務(wù),如果在控制臺改,先找到對應(yīng) Service,點擊 編輯YAML:

修改 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 版本的響應(yīng),成功實現(xiàn)了藍綠發(fā)布。
相比藍綠發(fā)布,我們?yōu)椴唤o Service 指定使用 v1 版本的服務(wù),從 selector 中刪除 version 標(biāo)簽,讓 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 版本的響應(yīng),另一半是 v2 版本的響應(yīng)。現(xiàn)在我們來調(diào)節(jié) v1 和 v2 版本的 Deployment 的副本,將 v1 版本調(diào)至 1 個副本,v2 版本調(diào)至 4 個副本。
可以通過控制臺操作:

也可以通過 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 的響應(yīng)比例與其副本數(shù)比例一致,為 1:4,通過控制不同版本服務(wù)的副本數(shù)就實現(xiàn)了灰度發(fā)布。
關(guān)于如何在TKE集群中實現(xiàn)簡單的藍綠發(fā)布和灰度發(fā)布問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。
文章標(biāo)題:如何在TKE集群中實現(xiàn)簡單的藍綠發(fā)布和灰度發(fā)布
文章位置:http://chinadenli.net/article18/gsjigp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供、定制開發(fā)、外貿(mào)網(wǎng)站建設(shè)、小程序開發(fā)、響應(yīng)式網(wǎng)站、企業(yè)網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)