边开飞机边换引擎?我们造了个新功能保障业务流量无损迁移
作者 |?顧靜(子白)
來源 | 阿里巴巴云原生公眾號
容器化部署應用可以降低企業成本,提升研發效率,解放運維人員。據 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: nignxname: my-nginx-svcnamespace: default spec:ports:- port: 80protocol: TCPtargetPort: 80selector:app: nginxtype: 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 并設置權重
- 創建 Service
3)預期結果
配置完成后,在 CLB 的虛擬服務組里既可以看到集群內的節點,也可以看到集群外的 ECS,集群節點的權重按照 annotation 配置。集群內應用進行擴縮容時,集群外的 ECS 節點不受影響。
場景三:多集群業務流量多活與災備
對于一個 CLB,支持將流量轉發至多個 Kubernetes 集群內
企業用戶會采取多種措施以保障應用的高可用性,如創建多個集群進行備份、容災等。這要求業務流量可以通過一個 CLB 接入多個 Kubernetes 集群中,并且支持為 Kubernetes 集群設置不同的權重,如下圖所示。
1)注意事項
- 不能跨 CLB 復用虛擬服務器組
- 一個虛擬服務器組只能與一個端口關聯
- 兩個集群均已配置 Cluster Id,否則兩個集群中的 service 需要不同名稱
2)操作步驟
- 登錄?CLB 控制臺創建 CLB、監聽及虛擬服務器組,記錄 CLB ID (“lb-xxxx”)? 及虛擬服務器組 Id (“rsp-xxx”)
- 集群 A 中創建 Serivce-A,權重設置為 20%
3)預期結果
配置完成后,在 clb 的虛擬服務組里既可以看到集群 A 內的節點,也可以看到集群 B 的節點。集群節點的權重按照 annotation 自動設置。集群內應用進行擴縮容時,CLB 后端虛擬服務器組會自動更新。
總結
出于降本增效的考慮,越來越多的企業采用容器化方式部署應用。在業務遷移過程中,如何保障業務流量不受損成為一大難題。對于電商類應用而言,業務流量下跌往往會導致交易量下跌,造成重大損失。游戲類應用對業務流量也十分敏感,短暫的流量中斷都會明顯地影響游戲用戶體驗;交通類應用的流量下跌會影響交通流量管制、交通故障排險效率。保障業務流量不受損是保障用戶業務正常運轉的底線。
CCM 發布的支持在同一個 CLB 后端掛載集群內節點和集群外 ECS 的功能,可以一舉解決遷移過程中流量中斷的難題。同時,還支持將業務流量轉發至多個 Kubernetes 集群內,支撐備份、容災等需求,保障業務高可用。
總結
以上是生活随笔為你收集整理的边开飞机边换引擎?我们造了个新功能保障业务流量无损迁移的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 6 张图带你彻底搞懂分布式事务 XA 模
- 下一篇: WebAssembly + Dapr =