本文中含有需要您注意的重要提示信息,忽略該信息可能對您的業務造成影響,請務必仔細閱讀。
相較于Nginx Ingress,ALB Ingress屬于全托管服務,免去了運維成本,并提供了更強大的彈性。從Nginx Ingress遷移至ALB Ingress時,ACK提供的遷移工具可自動將Nginx Ingress配置轉換為ALB Ingress的配置,免去了您手動轉換配置的過程。本文提供了一個遷移示例:在將Nginx Ingress的配置轉換到ALB Ingress后,通過使用DNS解析,將流量逐漸轉移至ALB Ingress,完成對客戶端無感的遷移。
遷移流程
通過將一個域名同時解析到Nginx Ingress和ALB Ingress并逐漸調整權重,可以實現對客戶端無感的遷移。下圖展示了通過DNS解析完成無感遷移的大致流程,各個步驟在下方的遷移示例場景有更具體的示例展示。
通過DNS解析遷移并非是無感遷移的唯一方式,本文中的示例僅供您參考。
遷移示例場景
通過以下示例,您可了解遷移流程中的具體操作細節和工作原理。
某企業在ACK集群中安裝了Nginx Ingress Controller,并為Controller的Service選擇了公網LoadBalancer
類型,使Controller自動關聯了一個公網類型CLB實例。該企業同時配置了DNS解析,客戶端訪問www.example.net
時,客戶端請求將被解析到CLB,并經由CLB轉發后到達后端Pod。
步驟一:配置ALB Ingress
隨著業務逐步上量,Nginx Ingress的性能已無法滿足業務需求,并且產生了較為高昂的運維成本。該企業決定從Nginx Ingress遷移至ALB Ingress。遷移過程中,該企業通過ACK提供的遷移工具將Nginx Ingress的配置轉換到了ALB Ingress中,并將ALB Ingress加入到了DNS解析中,給予了更低的權重。
DNS協議不允許同一域名被同時解析到A記錄與CNAME記錄。CLB實例通過IP接收請求,而ALB實例對外提供默認域名(詳見什么是應用型負載均衡ALB)。因此需要為CLB配置一個臨時域名,以達到將客戶請求按權重同時分配到Nginx Ingress與ALB Ingress的效果。
步驟二:將流量逐漸轉移至ALB Ingress
經過一段時間的測試后,ALB Ingress工作正常,該企業隨即提高了ALB Ingress的DNS解析權重,使更多流量經由ALB Ingress轉發。
步驟三:刪除Nginx Ingress相關資源
在將流量完全轉移至ALB Ingress后,該企業刪除了DNS解析中的Nginx Ingress相關條目,移除了Nginx Ingress相關資源,并卸載了Nginx Ingress Controller組件。至此,該企業已經完成了從Nginx Ingress遷移至ALB Ingress的過程,且全流程對客戶端無感。
前提條件
已通過kubectl工具連接集群。具體操作,請參見獲取集群KubeConfig并通過kubectl工具連接集群。
步驟一:配置ALB Ingress
登錄容器服務管理控制臺,在需要執行遷移的集群中,安裝ALB Ingress Controller組件。具體操作,請參見管理ALB Ingress Controller組件。遷移工具會自動轉換
AlbConfig
、IngressClass
、Ingress
資源,因此在安裝組件時請為ALB云原生網關實例來源選擇暫不創建。重要如需在ACK專有集群中通過ALB Ingress訪問服務,在部署服務前需要為ALB Ingress Controller授權。具體操作,請參見為ACK專有集群授予ALB Ingress Controller訪問權限。
創建并復制下方YAML文件至ingress2albconfig.yaml中。
apiVersion: batch/v1 kind: Job metadata: name: ingress2albconfig namespace: default spec: template: spec: containers: - name: ingress2albconfig image: registry.cn-hangzhou.aliyuncs.com/acs/ingress2albconfig:latest command: ["/bin/ingress2albconfig", "print"] restartPolicy: Never serviceAccount: ingress2albconfig serviceAccountName: ingress2albconfig backoffLimit: 4 --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: system:ingress2albconfig rules: - apiGroups: - networking.k8s.io resources: - ingresses - ingressclasses verbs: - get - list - watch - update - create - patch --- apiVersion: v1 kind: ServiceAccount metadata: name: ingress2albconfig namespace: default --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: system:ingress2albconfig roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: system:ingress2albconfig subjects: - kind: ServiceAccount name: ingress2albconfig namespace: default
執行以下命令,運行Job任務。該任務將會依據現有的Nginx Ingress Controller配置,自動轉化到
AlbConfig
、IngressClass
、Ingress
等資源并輸出,后續可通過Log查看。kubectl apply -f ingress2albconfig.yaml
預期輸出:
job.batch/ingress2albconfig created clusterrole.rbac.authorization.k8s.io/system:ingress2albconfig created serviceaccount/ingress2albconfig created clusterrolebinding.rbac.authorization.k8s.io/system:ingress2albconfig created
查看Job所屬的Pod。
kubectl get pod -l job-name=ingress2albconfig
預期輸出:
NAME READY STATUS RESTARTS AGE ingress2albconfig-vw*** 0/1 Completed 0 16m
查看Pod日志。
kubectl logs ingress2albconfig-vw*** # 替換為上一步中得到的Pod名稱
預期輸出如下,通過kubectl將下列資源部署到集群中后,就完成了ALB Ingress的配置。
apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: creationTimestamp: null name: from_nginx spec: config: accessLogConfig: {} edition: Standard name: from_nginx tags: - key: converted/ingress2albconfig value: "true" zoneMappings: - vSwitchId: vsw-xxx #替換為VPC中的虛擬交換機ID - vSwitchId: vsw-xxx #替換為VPC中的虛擬交換機ID listeners: - port: 80 protocol: HTTP --- apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: creationTimestamp: null name: from_nginx spec: controller: ingress.k8s.alibabacloud/alb parameters: apiGroup: alibabacloud.com kind: AlbConfig name: from_nginx scope: null --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: alb.ingress.kubernetes.io/listen-ports: '[{"HTTP":80}]' creationTimestamp: null name: from_ingress1 namespace: default spec: ingressClassName: from_nginx rules: - http: paths: - backend: service: name: nginx-svc-g1msr port: number: 80 path: / pathType: Prefix status: loadBalancer: {}
自動轉換的Annotation列表
遷移工具會將下表中的Nginx Ingress Annotation自動轉換為ALB Ingress中的Annotation。
不在下表中的Nginx Ingress Annotation在轉換過程中會被忽略,請您在轉換完成后確認ALB Ingress的配置,以避免功能與預期不符。
Nginx Ingress Annotation | ALB Ingress Annotation |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
步驟二:將流量逐漸轉移至ALB Ingress
流量切換前,請比對您的Nginx Ingress和ALB Ingress的轉發策略,并進行測試以確保二者的功能完全一致,以免在切換過程中對您的業務產生非預期的影響。
建議在業務低谷期進行流量的切換。
為CLB實例配置臨時域名
因為DNS協議并不支持將一個域名同時解析到A記錄與CNAME記錄,且ALB實例對外提供默認域名,因此您需要為CLB配置臨時域名。
登錄域名解析控制臺。
在域名解析頁面,找到指向待遷移CLB實例的DNS域名
www.example.net
,單擊該域名。在解析設置頁面,單擊添加記錄,在添加記錄面板,完成以下參數的配置,然后單擊確認。
配置
說明
記錄類型
在下拉列表中選擇CNAME。
主機記錄
域名的前綴,在本示例中輸入
www
。解析請求來源
選擇默認。
記錄值
輸入臨時域名,在本示例中輸入
web0.example.net
。TTL
全稱Time To Live,表示DNS記錄在DNS服務器上的緩存時間,保持默認。
在解析設置頁面,找到由
www.example.net
指向CLB實例IP的A記錄,在操作列單擊修改。在彈出的修改記錄面板,修改主機記錄,然后單擊確認。本文修改主機記錄為web0,其余參數保持不變。
說明完成配置后,
www.example.net
將被CNAME條目解析到web0.example.net
,而web0.example.net
將被A條目解析到CLB實例的IP地址。
為ALB實例添加CNAME解析
執行以下命令,找到ALB實例的域名。
kubectl get albconfig
預期輸出如下,其中的
alb-a8mmh2tqbmrm11****.cn-hangzhou.alb.aliyuncs.com
即為ALB實例的域名。NAME ALBID DNSNAME PORT&PROTOCOL CERTID AGE from_nginx alb-a8mmh2tqbmrm11**** alb-a8mmh2tqbmrm11****.cn-hangzhou.alb.aliyuncs.com 20m
在解析設置頁面,單擊添加記錄,在添加記錄面板,完成以下參數的配置,然后單擊確認。
配置
說明
記錄類型
在下拉列表中選擇CNAME。
主機記錄
域名的前綴,在本示例中輸入
www
。解析請求來源
選擇默認。
記錄值
輸入ALB實例的域名。
TTL
全稱Time To Live,表示DNS記錄在DNS服務器上的緩存時間,保持默認。
設置流量權重
在解析設置頁面, 單擊左側導航欄的權重配置。
在權重配置頁面,在操作列單擊開啟權重,然后單擊設置權重。
在設置權重面板,分別為CLB和ALB實例的解析記錄設置權重。將CLB實例對應的解析記錄的權重置為100,同時將ALB實例對應的解析記錄的權重設置為0。
在觀察業務沒有影響的情況下,逐步減少CLB實例解析記錄的權重值,同時逐步增加ALB實例解析記錄的權重值。
登錄對應Service的后端Pod所在Worker節點上,多次執行
dig
命令,驗證流量切換效果。根據流量切換的驗證結果,逐步將CLB實例解析記錄的權重值減小至0,同時逐步增加ALB實例解析記錄的權重值至100。
步驟三:刪除Nginx Ingress相關資源
當Nginx Ingress長連接全部處理完成,且Nginx Ingress沒有新增流量時,您可以根據業務場景靜默觀察一段時間后釋放冗余資源。
相關文檔
ALB實例支持多種配置,更多信息,請參見通過AlbConfig配置ALB實例。
在ALB Ingress中使用HTTPS協議的操作,請參見配置HTTPS證書以實現加密通信。
ALB Ingress支持的Annotation列表,請參見ALB Ingress配置詞典。