日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

自建Nginx Ingress遷移ALB Ingress最佳實踐

重要

本文中含有需要您注意的重要提示信息,忽略該信息可能對您的業務造成影響,請務必仔細閱讀。

相較于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解析遷移并非是無感遷移的唯一方式,本文中的示例僅供您參考。

image

遷移示例場景

通過以下示例,您可了解遷移流程中的具體操作細節和工作原理。

某企業在ACK集群中安裝了Nginx Ingress Controller,并為Controller的Service選擇了公網LoadBalancer類型,使Controller自動關聯了一個公網類型CLB實例。該企業同時配置了DNS解析,客戶端訪問www.example.net時,客戶端請求將被解析到CLB,并經由CLB轉發后到達后端Pod。

image

步驟一:配置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的效果。

image

步驟二:將流量逐漸轉移至ALB Ingress

經過一段時間的測試后,ALB Ingress工作正常,該企業隨即提高了ALB Ingress的DNS解析權重,使更多流量經由ALB Ingress轉發。

image

步驟三:刪除Nginx Ingress相關資源

在將流量完全轉移至ALB Ingress后,該企業刪除了DNS解析中的Nginx Ingress相關條目,移除了Nginx Ingress相關資源,并卸載了Nginx Ingress Controller組件。至此,該企業已經完成了從Nginx Ingress遷移至ALB Ingress的過程,且全流程對客戶端無感。

image

前提條件

已通過kubectl工具連接集群。具體操作,請參見獲取集群KubeConfig并通過kubectl工具連接集群

步驟一:配置ALB Ingress

  1. 登錄容器服務管理控制臺,在需要執行遷移的集群中,安裝ALB Ingress Controller組件。具體操作,請參見管理ALB Ingress Controller組件。遷移工具會自動轉換AlbConfigIngressClassIngress資源,因此在安裝組件時請為ALB云原生網關實例來源選擇暫不創建

    重要

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

  2. 創建并復制下方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
  3. 執行以下命令,運行Job任務。該任務將會依據現有的Nginx Ingress Controller配置,自動轉化到AlbConfigIngressClassIngress等資源并輸出,后續可通過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
  4. 查看Job所屬的Pod。

    kubectl get pod -l job-name=ingress2albconfig

    預期輸出:

    NAME                READY   STATUS      RESTARTS   AGE
    ingress2albconfig-vw***   0/1     Completed   0          16m
  5. 查看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的配置,以避免功能與預期不符。

Annotation列表

Nginx Ingress Annotation

ALB Ingress Annotation

nginx.ingress.kubernetes.io/canary

alb.ingress.kubernetes.io/canary

nginx.ingress.kubernetes.io/canary-by-header

alb.ingress.kubernetes.io/canary-by-header

nginx.ingress.kubernetes.io/canary-by-header-value

alb.ingress.kubernetes.io/canary-by-header-value

nginx.ingress.kubernetes.io/canary-by-cookie

alb.ingress.kubernetes.io/canary-by-cookie

nginx.ingress.kubernetes.io/canary-weight

alb.ingress.kubernetes.io/canary-weight

nginx.ingress.kubernetes.io/use-regex

alb.ingress.kubernetes.io/use-regex

nginx.ingress.kubernetes.io/rewrite-target

alb.ingress.kubernetes.io/rewrite-target

nginx.ingress.kubernetes.io/ssl-redirect

alb.ingress.kubernetes.io/ssl-redirect

nginx.ingress.kubernetes.io/enable-cors

alb.ingress.kubernetes.io/enable-cors

nginx.ingress.kubernetes.io/cors-allow-origin

alb.ingress.kubernetes.io/cors-allow-origin

nginx.ingress.kubernetes.io/cors-allow-methods

alb.ingress.kubernetes.io/cors-allow-methods

nginx.ingress.kubernetes.io/cors-allow-headers

alb.ingress.kubernetes.io/cors-allow-headers

nginx.ingress.kubernetes.io/cors-expose-headers

alb.ingress.kubernetes.io/cors-expose-headers

nginx.ingress.kubernetes.io/cors-allow-credentials

alb.ingress.kubernetes.io/cors-allow-credentials

nginx.ingress.kubernetes.io/backend-protocol

alb.ingress.kubernetes.io/backend-protocol

nginx.ingress.kubernetes.io/load-balance

alb.ingress.kubernetes.io/backend-scheduler

nginx.ingress.kubernetes.io/upstream-hash-by

alb.ingress.kubernetes.io/backend-scheduler-uch-value

步驟二:將流量逐漸轉移至ALB Ingress

警告
  • 流量切換前,請比對您的Nginx Ingress和ALB Ingress的轉發策略,并進行測試以確保二者的功能完全一致,以免在切換過程中對您的業務產生非預期的影響。

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

為CLB實例配置臨時域名

因為DNS協議并不支持將一個域名同時解析到A記錄與CNAME記錄,且ALB實例對外提供默認域名,因此您需要為CLB配置臨時域名。

  1. 登錄域名解析控制臺

  2. 域名解析頁面,找到指向待遷移CLB實例的DNS域名www.example.net,單擊該域名。

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

    配置

    說明

    記錄類型

    在下拉列表中選擇CNAME

    主機記錄

    域名的前綴,在本示例中輸入www

    解析請求來源

    選擇默認。

    記錄值

    輸入臨時域名,在本示例中輸入web0.example.net

    TTL

    全稱Time To Live,表示DNS記錄在DNS服務器上的緩存時間,保持默認。

  4. 解析設置頁面,找到由www.example.net指向CLB實例IP的A記錄,在操作列單擊修改

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

    說明

    完成配置后,www.example.net將被CNAME條目解析到web0.example.net,而web0.example.net將被A條目解析到CLB實例的IP地址。

為ALB實例添加CNAME解析

  1. 執行以下命令,找到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
  2. 解析設置頁面,單擊添加記錄,在添加記錄面板,完成以下參數的配置,然后單擊確認

    配置

    說明

    記錄類型

    在下拉列表中選擇CNAME

    主機記錄

    域名的前綴,在本示例中輸入www

    解析請求來源

    選擇默認。

    記錄值

    輸入ALB實例的域名。

    TTL

    全稱Time To Live,表示DNS記錄在DNS服務器上的緩存時間,保持默認。

設置流量權重

  1. 解析設置頁面, 單擊左側導航欄的權重配置

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

  3. 設置權重面板,分別為CLB和ALB實例的解析記錄設置權重。將CLB實例對應的解析記錄的權重置為100,同時將ALB實例對應的解析記錄的權重設置為0。

    域名權重設置

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

  5. 登錄對應Service的后端Pod所在Worker節點上,多次執行dig命令,驗證流量切換效果。

    流量測試1流量測試2

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

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

臨時流量切換方案

步驟三:刪除Nginx Ingress相關資源

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

  1. 通過域名解析控制臺刪除Nginx Ingress相關DNS條目。

  2. 卸載Nginx Ingress Controller組件。

    1. 登錄容器服務管理控制臺,在左側導航欄選擇集群

    2. 在集群管理頁左側導航欄中,選擇網絡 > 路由

    3. 在Nginx Ingress右側操作欄,選擇image > 刪除,在彈出的對話框,單擊確定

    4. 在左側導航欄中選擇運維管理 > 組件管理頁面,單擊網絡頁簽,在Nginx Ingress Controller卡片,單擊卸載

    5. 在彈出的對話框中,單擊確定

      說明

      Nginx Ingress Controller所使用的CLB會隨著組件卸載自動釋放,不會繼續產生計費。

相關文檔