![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5iNwYWOhhTO2AjMhRWOzgTYjVDO0ADMkJjNyITMyUjZh9CX5d2bs92Yl1iclB3bsVmdlR2LcNWaw9CXt92Yu4GZjlGbh5yYjV3Lc9CX6MHc0RHaiojIsJye.png)
作者 | 顧靜(子白)
來源 |
阿裡巴巴雲原生公衆号容器化部署應用可以降低企業成本,提升研發效率,解放運維人員。據 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 叢集内,支撐備份、容災等需求,保障業務高可用。