全部產品
Search
文件中心

Server Load Balancer:自建Nginx Ingress遷移ALB Ingress最佳實務

更新時間:Jun 19, 2024

本文介紹如何從Nginx Ingress遷移至ALB Ingress。

背景資訊

ALB Ingress是基於阿里雲應用型負載平衡ALB(Application Load Balancer)實現的Ingress服務。相比於Nginx Ingress,ALB Ingress提供更為強大的Ingress流量管理功能,具有以下優勢:

  • 全託管免營運:ALB屬於全託管免營運的雲端服務。

  • 自動彈性:ALB基於CyberStar自研平台,支援高效能自動彈性,處理能力隨業務峰值自動調整。

  • 超強效能:單個ALB執行個體最大支援100萬QPS、千萬級並發串連,預設使用SSL硬體加速。

  • 雲產品生態整合:ALB支援與多種雲產品結合,如WAF、FC、PrivateLink、TR、EDAS、SAE、ASM等。

  • 配置變更熱更新:配置變更完全熱更新,不需要Reload進程,對長串連無損。

情境樣本

本文以下圖情境為例。某企業在阿里雲華東1(杭州)地區建立了一個公網CLB執行個體,並通過Nginx Ingress Controller配置Ingress轉寄規則,配置流量重新導向、網域名稱和路徑的轉寄策略,且對外通過DNS網域名稱提供服務。用戶端訪問網域名稱www.example.net時,DNS解析會根據A記錄配置將流量指向CLB執行個體,CLB執行個體根據Ingress規則對應的轉寄策略將流量轉寄至對應Service的Pod上。遷移前

由於業務發展需要,該企業需要將後端Nginx Ingress遷移到ALB Ingress上。為了保持業務穩定,希望不改變對外提供服務的DNS網域名稱及後端伺服器的IP地址。企業可以通過在ACK叢集或ACK Serverless叢集上安裝ALB Ingress Controller,並在ALB Ingress Controller上配置相關Ingress規則,使ALB提供的轉寄策略與Nginx Ingress一致,然後利用DNS網域名稱解析的權重設定完成流量的遷移。遷移後

注意事項

遷移步驟

遷移步驟

步驟一:建立ALB Ingress

  1. 登入Container Service管理主控台安裝ALB Ingress Controller組件。具體操作,請參見管理ALB Ingress Controller組件

    說明
    • ALB Ingress Controller組件需安裝在待遷移Nginx Ingress所在的ACK叢集或ACK Serverless叢集上。

    • 如需在ACK專有叢集中通過ALB Ingress訪問服務,在部署服務前需要為ALB Ingress Controller授權。具體操作,請參見為ACK專有叢集授予ALB Ingress Controller存取權限

  2. 通過kubectl工具登入Nginx Ingress所在的ACK/ACK Serverless叢集,建立ALBConfig。

    說明

    如果您在安裝ALB Ingress Controller時,為ALB雲原生網關執行個體來源選擇了建立使用已有選項,controller會自動建立一個名為“alb”的AlbConfig和名為“alb”的IngressClass資源,您可忽略此步驟。

    1. 使用以下內容,建立albconfig.yaml

      apiVersion: alibabacloud.com/v1
      kind: AlbConfig
      metadata:
        name: alb-demo
      spec:
        config:
          name: alb-test
          addressType: Internet
          zoneMappings:
          - vSwitchId: vsw-wz9e2usil7e5an1xi****
          - vSwitchId: vsw-wz92lvykqj1siwvif****
        listeners:
          - port: 80
            protocol: HTTP

      zoneMappings:設定ALB Ingress交換器ID,您需要至少指定兩個不同可用性區域交換器ID,且交換器必須與叢集屬於同一VPC。

      說明

      若待遷移Nginx Ingress處理的是IPv6的用戶端流量,您可以在ALBConfig中通過addressIpVersion欄位指定DualStack。更多資訊,請參見通過AlbConfig配置ALB執行個體

    2. 執行以下命令,建立ALBConfig。

      kubectl apply -f albconfig.yaml
    3. 執行以下命令,查看ALB執行個體是否建立成功。

      kubectl get albconfig

      預期輸出:

      NAME       ALBID                    DNSNAME                                               PORT&PROTOCOL   CERTID   AGE
      alb-demo   alb-a8mmh2tqbmrm11****   alb-a8mmh2tqbmrm11****.cn-hangzhou.alb.aliyuncs.com                            27s
  3. 建立IngressClass。

    說明

    如果您在安裝ALB Ingress Controller時,為ALB雲原生網關執行個體來源選擇了建立使用已有選項,controller會自動建立一個名為“alb”的AlbConfig和名為“alb”的IngressClass資源,您可忽略此步驟。

    1. 使用以下內容,建立ingressclass.yaml

      apiVersion: networking.k8s.io/v1
      kind: IngressClass
      metadata:
        name: alb
      spec:
        controller: ingress.k8s.alibabacloud/alb
        parameters:
          apiGroup: alibabacloud.com
          kind: AlbConfig
          name: alb-demo

      parameters.name:ALBConfig名稱,用於綁定ALBConfig。

    2. 執行以下命令,建立IngressClass。

      kubectl apply -f ingressclass.yaml
  4. 建立ALB Ingress。

    重要

    如果原Nginx Ingress存在其他進階轉寄規則,可以利用ALB Ingress服務進階用法,將來自不同網域名稱或URL路徑的請求轉寄給不同的後端伺服器組、將HTTP訪問重新導向至HTTPS及實現灰階發布等功能。更多資訊,請參見ALB Ingress進階用法

    1. 使用以下內容,建立albingress.yaml

      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: demo-ingress-alb
        namespace: default
      spec:
        ingressClassName: alb
        rules:
          - host: www.example.net
            http:
              paths:
                - backend:
                    service:
                      name: nginx
                      port:
                        number: 80
                  path: /
                  pathType: Prefix

      • name:Ingress名稱。在相同的namespace下,ALB Ingress名稱與原Nginx Ingress的名稱不能相同。

      • ingressClassName:IngressClass的名稱。

    2. 執行以下命令,建立ALB Ingress。

      kubectl apply -f albingress.yaml
    3. 執行以下命令,擷取ALB Ingress資源。

      kubectl get ing

      預期輸出:

      NAME                CLASS   HOSTS              ADDRESS                                               PORTS   AGE
      demo-ingress-alb   alb     www.example.net   alb-a8mmh2tqbmrm11****.cn-hangzhou.alb.aliyuncs.com   80      10m     46s

      從返回結果中擷取ALB Ingress的端點,例如本文為alb-a8mmh2tqbmrm11****.cn-hangzhou.alb.aliyuncs.com 。

    4. 執行以下命令,通過ALB Ingress訪問後端服務來測試流量。

      curl -H "Host:  www.example.net" http://alb-a8mmh2tqbmrm11****.cn-hangzhou.alb.aliyuncs.com

      如果返回資訊正常,則說明ALB Ingress可以正常訪問後端服務。

步驟二:切流至ALB Ingress

警告
  • 流量切換前,請比對您的Nginx Ingress產生的轉寄策略和ALB Ingress產生的ALB轉寄策略,確保二者提供的能力完全一致,且所有配置經過完備的測實驗收,以免在切換過程中對您的業務產生非預期的影響。

  • 建議在業務低穀期進行流量的切換。

流量切換前,待遷移的CLB執行個體已佈建網域名解析,您已將業務網域名稱通過A記錄解析的方式指向CLB執行個體的服務地址。現狀2

安裝ALB Ingress Controller組件並通過ALB Ingress配置相同的轉寄策略,完成ALB Ingress流量測試後,本文以阿里雲Alibaba Cloud DNS為例,介紹流量由CLB切換至ALB的操作步驟。您可以通過以下步驟完成流量的切換。關於阿里雲Alibaba Cloud DNS的介紹,請參見公網權威解析遷移步驟2

第一步:CLB執行個體配置臨時網域名稱

ALB執行個體推薦使用CNAME解析,為滿足網域名稱權重配置的啟用條件,您需要為臨時網域名稱添加一條CNAME解析記錄,同時將該臨時網域名稱指向待遷移CLB執行個體的服務地址。

說明

權重配置的啟用條件是網域名稱下存在相同的主機記錄、相同解析線路的多條A記錄、CNAME記錄、AAAA記錄。

  1. 登入網域名稱解析控制台

  2. 網域名稱解析頁面,找到指向待遷移CLB執行個體的DNS網域名稱www.example.net,單擊該網域名稱。

  3. 解析設定頁面,單擊添加記錄,在添加記錄面板,完成以下參數的配置,然後單擊確認

    配置

    說明

    記錄類型

    在下拉式清單中選擇CNAME

    主機記錄

    您的網域名稱的首碼。本文輸入www

    解析請求來源

    選擇預設。

    記錄值

    輸入臨時網域名稱,本文輸入web0.example.net

    TTL

    全稱Time To Live,表示DNS記錄在DNS伺服器上的緩衝時間。本文設定為5秒

    本文使用的是企業旗艦版Alibaba Cloud DNS,為方便驗證將TTL設定為5秒。您可以根據實際情況進行設定,更多資訊,請參見版本對比

  4. 解析設定頁面,找到指向待遷移CLB執行個體服務地址的A記錄,在操作列單擊修改

  5. 在彈出的修改記錄面板,修改主機記錄,然後單擊確認。本文修改主機記錄web0,其餘參數保持不變。

第二步:ALB執行個體添加CNAME解析

  1. 執行以下命令,找到ALB執行個體對應的DNS名稱。

    kubectl get albconfig

    預期輸出:

    NAME       ALBID                    DNSNAME                                               PORT&PROTOCOL   CERTID   AGE
    alb-demo   alb-a8mmh2tqbmrm11****   alb-a8mmh2tqbmrm11****.cn-hangzhou.alb.aliyuncs.com                             27s
    說明

    您也可以登入應用型負載平衡ALB控制台查看ALB執行個體的DNS名稱。ALB控制台僅為查看執行個體配置,配置變更操作需要以下發的YAML檔案為準。

  2. 完成以下步驟添加CNAME解析記錄。

    1. 登入網域名稱解析控制台

    2. 網域名稱解析頁面單擊添加網域名稱

    3. 添加網域名稱對話方塊中輸入您的網域名稱,然後單擊確認

      警告
      • 這裡添加的網域名稱為CLB執行個體綁定的網域名稱。

      • 您的網域名稱需已完成TXT記錄驗證。

    4. 在目標網域名稱的操作列單擊解析設定

    5. 解析設定頁面單擊添加記錄

    6. 添加記錄面板配置以下資訊完成CNAME解析配置,然後單擊確認

      配置

      說明

      記錄類型

      在下拉式清單中選擇CNAME

      主機記錄

      您的網域名稱的首碼。本文輸入www

      解析請求來源

      選擇預設。

      記錄值

      輸入欄位名對應的CNAME地址,即您複製的ALB執行個體的DNS網域名稱。

      TTL

      全稱Time To Live,表示DNS記錄在DNS伺服器上的緩衝時間。本文設定為5秒

      本文使用的是企業旗艦版Alibaba Cloud DNS,為方便驗證將TTL設定為5秒。您可以根據實際情況進行設定,更多資訊,請參見版本對比

      說明
      • 新增CNAME記錄即時生效,修改CNAME記錄取決於本地DNS緩衝的解析記錄的TTL到期時間,一般預設為10分鐘。

      • 添加時如遇添加衝突,請換一個解析網域名稱。

第三步:設定權重,開始流量灰階

  1. 網域名稱解析頁面,單擊目標網域名稱,在解析設定頁面, 單擊左側導覽列的權重配置

  2. 權重配置頁面,在操作列單擊開啟權重,然後單擊設定權重

    權重配置的啟用條件是網域名稱下存在相同的主機記錄、相同解析線路的多條A記錄、CNAME記錄、AAAA記錄。

  3. 設定權重面板,分別為CLBALB執行個體的解析記錄設定權重。將CLB執行個體對應的解析記錄的權重設定為100,同時將ALB執行個體對應的解析記錄的權重設定為0

    網域名稱權重設定

  4. 在觀察業務沒有影響的情況下,逐步減小CLB執行個體解析記錄的權重值,同時逐步增加ALB執行個體解析記錄的權重值。

  5. 登入對應service的後端Pod所在ECS上,多次執行dig命令,驗證流量轉場效果。

    dig www.example.net

    運行結果如下圖所示。您可以通過多次運行結果觀察到,請求會根據權重分配至ALBCLB處理。流量測試1流量測試2

  6. 根據流量切換的驗證結果,逐步將CLB執行個體解析記錄的權重值減小至0,同時逐步增加ALB執行個體解析記錄的權重值至100。

如果您的DNS服務解析商不支援CNAME解析的權重配置,請單擊此處查看流量切換方案。

臨時流量切換方案

步驟三:刪除冗餘資源

當Nginx Ingress長串連全部處理完成,且Nginx Ingress沒有新增流量時,您可以根據業務情境靜默觀察一段時間後釋放冗餘資源。

  1. 刪除Nginx Ingress。

    1. 登入Container Service管理主控台,在叢集列表頁面,找到目標ACK叢集或ACK Serverless叢集,單擊該叢集。

    2. 在叢集管理頁左側導覽列中,選擇網路 > 路由

    3. 路由頁面上方,選擇命名空間,在Nginx Ingress右側操作列,選擇image > 刪除

    4. 在彈出的對話方塊,單擊確定

  2. 卸載Nginx Ingress Controller。

    1. 登入Container Service管理主控台,在左側導覽列選擇叢集

    2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇營運管理 > 組件管理

    3. 組件管理頁面,單擊網路頁簽,在Nginx Ingress Controller卡片,單擊卸載

    4. 在彈出的對話方塊,單擊確定

相關文檔