中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在TKE集群中實現簡單的藍綠發布和灰度發布

發布時間:2021-11-23 21:59:20 來源:億速云 閱讀:147 作者:柒染 欄目:云計算

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

原理介紹

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

如何在TKE集群中實現簡單的藍綠發布和灰度發布

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

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

如何在TKE集群中實現簡單的藍綠發布和灰度發布

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

如何在TKE集群中實現簡單的藍綠發布和灰度發布

使用 YAML 創建資源

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

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

如何在TKE集群中實現簡單的藍綠發布和灰度發布

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

部署多版本工作負載

要實現藍綠發布或灰度發布,首先我們需要在集群中部署多個版本的工作負載,這里以簡單的 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集群中實現簡單的藍綠發布和灰度發布

實現藍綠發布

為我們部署的 Deployment 創建 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 版本的響應,現在我們切到 v2 版本,修改 Service 的 selector,讓它選中 v2 版本的服務,如果在控制臺改,先找到對應 Service,點擊 編輯YAML:

如何在TKE集群中實現簡單的藍綠發布和灰度發布

修改 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 版本的響應,成功實現了藍綠發布。

實現灰度發布

相比藍綠發布,我們為不給 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 版本的響應。現在我們來調節 v1 和 v2 版本的 Deployment 的副本,將 v1 版本調至 1 個副本,v2 版本調至 4 個副本。

可以通過控制臺操作:

如何在TKE集群中實現簡單的藍綠發布和灰度發布

也可以通過 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 的響應比例與其副本數比例一致,為 1:4,通過控制不同版本服務的副本數就實現了灰度發布。

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

tke
AI

开阳县| 肇庆市| 乐陵市| 宝清县| 山丹县| 徐州市| 威信县| 闽清县| 治多县| 霞浦县| 蒙阴县| 梧州市| 弥勒县| 太仆寺旗| 桓台县| 鄢陵县| 凤庆县| 彭州市| 吕梁市| 铁力市| 苗栗县| 康乐县| 广元市| 海阳市| 夏河县| 宁乡县| 沙洋县| 汽车| 耒阳市| 陵川县| 雷山县| 潜江市| 宁武县| 马公市| 高密市| 襄城县| 龙陵县| 和林格尔县| 新源县| 如东县| 巩义市|