容器化部署應用可以降低企業成本,提升研發效率,解放運維人員。據 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)操作步驟
設置 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
2)預期結果
配置完成後,在 CLB 的虛拟服務組裡既可以看到集群内的節點,也可以看到集群外的 ECS。集群内應用進行擴縮容時,集群外的 ECS 節點不受影響。
場景二:金絲雀發布
支持金絲雀發布,将流量按比例轉發至集群内及集群外節點
遷移過程中,往往需要逐步将流量從存量 ECS 遷往 Kubernetes 集群中。CCM 支持通過 annotationservice.beta.kubernetes.io/alicloud-loadbalancer-weight為 Kubernetes 集群配置權重,從而實現流量的逐步遷移。
1)注意事項
2)操作步驟
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 集群設置不同的權重,如下圖所示。
1)注意事項
2)操作步驟
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
3)預期結果
配置完成後,在 clb 的虛拟服務組裡既可以看到集群 A 内的節點,也可以看到集群 B 的節點。集群節點的權重按照 annotation 自動設置。集群内應用進行擴縮容時,CLB 後端虛拟服務器組會自動更新。
總結出于降本增效的考慮,越來越多的企業采用容器化方式部署應用。在業務遷移過程中,如何保障業務流量不受損成為一大難題。對于電商類應用而言,業務流量下跌往往會導緻交易量下跌,造成重大損失。遊戲類應用對業務流量也十分敏感,短暫的流量中斷都會明顯地影響遊戲用戶體驗;交通類應用的流量下跌會影響交通流量管制、交通故障排險效率。保障業務流量不受損是保障用戶業務正常運轉的底線。
CCM 發布的支持在同一個 CLB 後端挂載集群内節點和集群外 ECS 的功能,可以一舉解決遷移過程中流量中斷的難題。同時,還支持将業務流量轉發至多個 Kubernetes 集群内,支撐備份、容災等需求,保障業務高可用。
作者 | 顧靜(子白)
本文為阿裡雲原創内容,未經允許不得轉載。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!