天天看點

邊開飛機邊換引擎?我們造了個新功能保障業務流量無損遷移場景一:應用容器化改造(流量平滑遷移)場景二:金絲雀釋出場景三:多叢集業務流量多活與災備總結

邊開飛機邊換引擎?我們造了個新功能保障業務流量無損遷移場景一:應用容器化改造(流量平滑遷移)場景二:金絲雀釋出場景三:多叢集業務流量多活與災備總結

作者 | 顧靜(子白)

來源 |

阿裡巴巴雲原生公衆号

容器化部署應用可以降低企業成本,提升研發效率,解放運維人員。據 Gartner 預計,到 2022 年,将有 75% 的企業将在生産中運作容器化應用程式。Kubernetes 是企業部署容器化應用的首選架構。由于 Kubernetes 部署及運維的複雜性,越來越多的客戶選擇将業務從 ECS 或者自建的 Kubernetes 遷移到阿裡雲托管版 Kubernetes —— ACK 中。但是,如何保證業務流量的平滑遷移成為一大挑戰。

Cloud Controller Manager(CCM)是 ACK 的一個系統核心元件,負責對接 Kubernetes 與雲上基礎産品如 CLB、VPC、DNS 等。當 Service 的類型設定為 Type=LoadBalancer 時,CCM 會為該 Service 建立或配置阿裡雲負載均衡 CLB。當 Service 對應的後端 Endpoint 或者叢集節點發生變化時,CCM 會自動更新 CLB 的後端虛拟伺服器組。此外,CCM 還提供了許多阿裡雲注解,支援豐富的負載均衡能力。

近期 CCM 釋出了一個新特性——支援在同一個 CLB 後端挂載叢集内節點和叢集外 ECS,借助這一特性可以解決業務容器化過程中流量平滑遷移的難題。

場景一:應用容器化改造(流量平滑遷移)

對于一個 CLB,支援将流量轉發至叢集内及叢集外節點

邊開飛機邊換引擎?我們造了個新功能保障業務流量無損遷移場景一:應用容器化改造(流量平滑遷移)場景二:金絲雀釋出場景三:多叢集業務流量多活與災備總結

1)操作步驟

  • 登入 CLB 控制台建立 CLB,記錄 CLB ID ("lb-xxxxx")
  • 建立 Service

設定 service.beta.kubernetes.io/alicloud-loadbalancer-force-override-listeners 為 false,不管理監聽資訊。

CCM 會自動建立對應的虛拟伺服器組。

cat <<EOF |kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
  annotations:
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: "lb-xxxx"
    service.beta.kubernetes.io/alicloud-loadbalancer-force-override-listeners: "false"
  labels:
    app: nignx
  name: my-nginx-svc
  namespace: default
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer
EOF           
  • 登入 CLB 控制台,建立監聽并關聯虛拟伺服器組
  • 登入 CLB 控制台,手動在虛拟伺服器組中添加叢集外 ECS 并設定權重

2)預期結果

配置完成後,在 CLB 的虛拟服務組裡既可以看到叢集内的節點,也可以看到叢集外的 ECS。叢集内應用進行擴縮容時,叢集外的 ECS 節點不受影響。

邊開飛機邊換引擎?我們造了個新功能保障業務流量無損遷移場景一:應用容器化改造(流量平滑遷移)場景二:金絲雀釋出場景三:多叢集業務流量多活與災備總結

場景二:金絲雀釋出

支援金絲雀釋出,将流量按比例轉發至叢集内及叢集外節點

遷移過程中,往往需要逐漸将流量從存量 ECS 遷往 Kubernetes 叢集中。CCM 支援通過 annotationservice.beta.kubernetes.io/alicloud-loadbalancer-weight為 Kubernetes 叢集配置權重,進而實作流量的逐漸遷移。

邊開飛機邊換引擎?我們造了個新功能保障業務流量無損遷移場景一:應用容器化改造(流量平滑遷移)場景二:金絲雀釋出場景三:多叢集業務流量多活與災備總結

1)注意事項

  • 不能跨 CLB 複用虛拟伺服器組
  • 一個虛拟伺服器組隻能與一個端口關聯
  • 叢集内節點權重由 CCM 元件設定,叢集外 ECS 權重需要使用者手動設定

2)操作步驟

  • 登入 CLB 控制台建立 CLB、監聽及虛拟伺服器組,記錄 CLB ID ("lb-xxxx") 及虛拟伺服器組 Id ("rsp-xxx")
  • 手動在虛拟伺服器組中添加叢集外 ECS 并設定權重
apiVersion: v1
kind: Service
metadata:
  annotations:
    service.beta.kubernetes.io/alicloud-loadbalancer-id: "lb-xxxxx"
    service.beta.kubernetes.io/alicloud-loadbalancer-vgroup-ids: "80:rsp-xxx"
    # 叢集内部權重為20%
    service.beta.kubernetes.io/alicloud-loadbalancer-weight: "20"
  name: nginx-svc
  namespace: default
spec:
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  sessionAffinity: None
  type: LoadBalancer           

3)預期結果

配置完成後,在 CLB 的虛拟服務組裡既可以看到叢集内的節點,也可以看到叢集外的 ECS,叢集節點的權重按照 annotation 配置。叢集内應用進行擴縮容時,叢集外的 ECS 節點不受影響。

場景三:多叢集業務流量多活與災備

對于一個 CLB,支援将流量轉發至多個 Kubernetes 叢集内

企業使用者會采取多種措施以保障應用的高可用性,如建立多個叢集進行備份、容災等。這要求業務流量可以通過一個 CLB 接入多個 Kubernetes 叢集中,并且支援為 Kubernetes 叢集設定不同的權重,如下圖所示。

邊開飛機邊換引擎?我們造了個新功能保障業務流量無損遷移場景一:應用容器化改造(流量平滑遷移)場景二:金絲雀釋出場景三:多叢集業務流量多活與災備總結

  • 兩個叢集均已配置 Cluster Id,否則兩個叢集中的 service 需要不同名稱

  • 登入 CLB 控制台建立 CLB、監聽及虛拟伺服器組,記錄 CLB ID ("lb-xxxx")  及虛拟伺服器組 Id ("rsp-xxx")
  • 叢集 A 中建立 Serivce-A,權重設定為 20%
apiVersion: v1
kind: Service
metadata:
  annotations:
    service.beta.kubernetes.io/alicloud-loadbalancer-id: "lb-xxxxx"
    service.beta.kubernetes.io/alicloud-loadbalancer-vgroup-ids: "80:rsp-xxx"
    service.beta.kubernetes.io/alicloud-loadbalancer-weight: "20"
  name: service-A
  namespace: default
spec:
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  sessionAffinity: None
  type: LoadBalancer           

配置完成後,在 clb 的虛拟服務組裡既可以看到叢集 A 内的節點,也可以看到叢集 B 的節點。叢集節點的權重按照 annotation 自動設定。叢集内應用進行擴縮容時,CLB 後端虛拟伺服器組會自動更新。

總結

出于降本增效的考慮,越來越多的企業采用容器化方式部署應用。在業務遷移過程中,如何保障業務流量不受損成為一大難題。對于電商類應用而言,業務流量下跌往往會導緻交易量下跌,造成重大損失。遊戲類應用對業務流量也十分敏感,短暫的流量中斷都會明顯地影響遊戲使用者體驗;交通類應用的流量下跌會影響交通流量管制、交通故障排險效率。保障業務流量不受損是保障使用者業務正常運轉的底線。

CCM 釋出的支援在同一個 CLB 後端挂載叢集内節點和叢集外 ECS 的功能,可以一舉解決遷移過程中流量中斷的難題。同時,還支援将業務流量轉發至多個 Kubernetes 叢集内,支撐備份、容災等需求,保障業務高可用。

繼續閱讀