26. 啟動多區域

預計完成時間:3 小時

可操作元件擁有者:MZ

技能設定檔:部署工程師

26.1. 總覽

啟動多區域時,需要設定根全域控制層。宇宙中的第一個區域會建立全域控制層。其他區域會加入全域控制層。加入全域控制層的程序比建立控制層更複雜,因為宇宙的全域控制層與新區域之間必須建立信任關係。加入全域控制層時,會涉及兩個區域:

  • 錨點可用區:已納入全球控制層的可用區。這個區域必須是 GitLab 執行個體所使用的區域,用於將基礎架構即程式碼 (IaC) 變更套用至全域 API。
  • 加入區域:加入全域控制層的區域。

您已在初始化多區域中,啟動宇宙的第一個區域。其他可用區加入網域時,該可用區會做為錨點可用區。

如果宇宙中已有全域 API,且您要啟動加入宇宙的區域,請完成下列步驟。

26.2. 在加入宇宙的區域中啟動多區域

請先確認您已在錨點區域啟動多區域,再繼續操作。

26.2.1. 啟動 IO 工具容器

為確保安全和可稽核性,多區域啟動程序必須使用個人憑證存取 Kubernetes (而非管理員 Kubernetes 設定),並使用 IaC 多方核准授權要求,才能執行敏感動作。IO 工具容器包含執行啟動動作所需的所有工具。如要在 OIC 環境中啟動容器,請參閱 IO 工具容器設定 OOPS-P0065 程序。加入全球控制平面的區域會與兩個區域互動,其中一個區域 (錨點區域) 並非在第 0 天條件下運作,因此必須採用生產層級的驗證和授權措施,確保錨點區域的安全性不會受到影響。

26.2.2. 初始化 GitLab 存放區

使用「以程式碼形式設定基礎架構」中設定的識別資訊提供者 (IdP) 憑證,並按照 OOPS-P0066 程序管理 GitLab 使用者存取權。

複製錨點區域的 IaC 存放區:

git clone https://iac.GLOBAL_DNS_DOMAIN/gdch/iac.git /tmp/iac

GLOBAL_DNS_DOMAIN 替換為宇宙的 DNS 網域。

系統提示時,請提供使用者名稱和密碼。

26.2.3. 新增必要角色

請按照「Access and privilege elevation process IAM-R0005」執行手冊中的操作說明,建立必要的叢集角色和角色繫結:

  • 在加入區域的 root-admin 叢集中,新增具有 mz-bootstrap-joining-editor 叢集角色的叢集角色繫結。
  • 在錨點區域的 root-admin 叢集中,新增具有 mz-bootstrap-anchor-reader 叢集角色的叢集角色繫結。
  • 在錨點區域的全球 API 中,於 mz-system 命名空間新增具有 mz-bootstrap-viewer 角色的角色繫結。

26.2.4. 建立權杖要求

加入全球控制層時,系統會使用全域 API 啟動權杖,在加入的區域和錨點區域之間建立聯絡人。權杖要求用於向錨定區域中的全域 API 要求權杖。

  1. 為合併要求建立新分支:

    cd /tmp/iac
    git checkout -b JOINING_ZONE_NAME-mz-token-request
    

    請將 JOINING_ZONE_NAME 替換為從客戶填寫問卷取得的區域名稱,如本節結尾的附註所述。

  2. 登入加入區域。詳情請參閱 gdcloud 指令列介面。這是必要步驟,因為下一個步驟中的 gdcloud 指令會與加入區域中的根管理員叢集互動,取得公開金鑰加密金鑰配對,以便安全地將啟動權杖從錨點區域轉移至加入區域。

  3. 產生權杖要求 YAML 檔案:

    gdcloud system multi-zone create-token-request --cluster root --zone JOINING_ZONE_NAME --client-type api-join --namespace global-kube-system --output-file /tmp/iac/infrastructure/global/orgs/root/mz-token-request.yaml
    
  4. 建立或更新 kustomization.yaml 檔案。

    1. 開啟檔案:

      vim infrastructure/global/orgs/root/kustomization.yaml
      
    2. 如果檔案已存在,請將 mz-token-request.yaml 項目新增至 resources 清單。否則請新增完整資源 YAML:

      apiVersion: kustomize.config.k8s.io/v1beta1
      kind: Kustomization
      metadata:
        name: global-root-kustomization
      resources:
      - mz-token-request.yaml
      
    3. 儲存檔案並退出 vim。

  5. 修訂分支的變更:

    git add infrastructure
    git commit
    
  6. 將分支版本推送至 GitLab:

    git push
    
  7. 將變更內容合併至 main 分支。詳情請參閱 IAC-R0004 執行手冊。

26.2.5. 建立權杖

請按照下列步驟在加入區域中建立啟動程序權杖:

  1. 為合併要求建立新分支:

    cd /tmp/iac
    git checkout main
    git pull --ff-only
    git checkout -b JOINING_ZONE_NAME-mz-token
    
  2. 登入錨定區域。詳情請參閱 gdcloud 指令列介面。這是必要步驟,因為下一個步驟中的 gdcloud 指令會與錨點區域中的全域 API 互動,以建立及加密啟動程序權杖。

  3. 產生權杖 YAML 檔案:

    gdcloud system multi-zone create-token --zone JOINING_ZONE_NAME --namespace global-kube-system --output-file /tmp/iac/infrastructure/zonal/zones/JOINING_ZONE_NAME/root-admin/mz-token.yaml
    
  4. 建立或更新 kustomization.yaml 檔案。

    1. 開啟檔案:

      vim infrastructure/zonal/zones/JOINING_ZONE_NAME/root-admin/kustomization.yaml
      
    2. 如果檔案已存在,請將 mz-token.yaml 項目新增至 resources 清單。否則請新增完整資源 YAML:

      apiVersion: kustomize.config.k8s.io/v1beta1
      kind: Kustomization
      metadata:
        name: root-admin-kustomization
      resources:
      - mz-token.yaml
      
    3. 儲存檔案並退出 vim。

  5. 修訂分支的變更:

    git add infrastructure
    git commit
    
  6. 將分支版本推送至 GitLab:

    git push
    
  7. 將變更內容合併至 main 分支。詳情請參閱 IAC-R0004 執行手冊。

26.2.6. 建立啟動程序資源

請按照下列步驟,在加入區域的根管理員叢集中建立啟動程序資源:

  1. 為合併要求建立新分支:

    cd /tmp/iac
    git checkout main
    git pull --ff-only
    git checkout -b JOINING_ZONE_NAME-mz-bootstrap
    
  2. 登入錨定區域。詳情請參閱 gdcloud 指令列介面。這是必要步驟,因為在加入作業期間,下一個步驟中的 gdcloud 指令會與錨點區域中的根管理員叢集互動,以擷取與錨點區域中全域 API 互動的連線資訊。

  3. 產生啟動程序 YAML 檔案:

    gdcloud system multi-zone create-bootstrap --type join --output-file /tmp/iac/infrastructure/zonal/zones/JOINING_ZONE_NAME/root-admin/mz-bootstrap.yaml
    
  4. 建立或更新 kustomization.yaml 檔案:

    1. 開啟檔案:

      vim infrastructure/zonal/zones/JOINING_ZONE_NAME/root-admin/kustomization.yaml
      
    2. 如果檔案已存在,請將 mz-token.yaml 項目新增至 resources 清單。否則請新增完整資源 YAML:

      apiVersion: kustomize.config.k8s.io/v1beta1
      kind: Kustomization
      metadata:
        name: root-admin-kustomization
      resources:
      - mz-bootstrap.yaml
      
    3. 儲存檔案並退出 vim。

  5. 修訂分支的變更:

    git add infrastructure
    git commit
    
  6. 將分支版本推送至 GitLab:

    git push
    
  7. 將變更內容合併至 main 分支。詳情請參閱 IAC-R0004 執行手冊。

變更合併後,IaC 會將 Bootstrap 資源傳播至新區域的根管理員叢集,並進行協調。這是非同步作業,因此合併後無法立即使用全域 API。

26.2.7. 驗證是否已成功部署全域 API

如要驗證全域 API 的部署作業,請按照下列步驟操作:

  1. 登入加入區域。詳情請參閱 gdcloud 指令列介面

  2. 取得根全域 API (global-api) 的 Kubernetes 設定。詳情請參閱 IAM-R0004 執行手冊。

  3. 確認加入區域中的全域 API 連線:

    kubectl version
    

26.2.8. 清除金鑰組

如要刪除用於將啟動程序權杖從錨點區域轉移至加入區域的金鑰組,請按照下列步驟操作:

  1. 登入加入區域。詳情請參閱 gdcloud 指令列介面

  2. 取得根管理員叢集的 Kubernetes 設定 (root-admin)。詳情請參閱 IAM-R0004 執行手冊。

  3. 執行下列指令來刪除金鑰配對:

    kubectl delete keypair -n global-kube-system kp
    

26.2.9. 清除權杖要求

如要刪除權杖要求 YAML 檔案,請按照下列步驟操作:

  1. 為合併要求建立新分支:

    cd /tmp/iac
    git checkout main
    git pull --ff-only
    git checkout -b JOINING_ZONE_NAME-mz-token-request-delete
    
  2. 刪除權杖要求 YAML 檔案:

    rm /tmp/iac/infrastructure/global/orgs/root/mz-token-request.yaml
    
  3. 更新 kustomization.yaml 檔案。

    1. 開啟檔案:

      vim infrastructure/global/orgs/root/kustomization.yaml
      
    2. resources 清單中移除 mz-token-request.yaml 項目、儲存檔案,然後結束 vim。

  4. 修訂分支的變更:

    git add infrastructure
    git commit
    
  5. 將分支版本推送至 GitLab:

    git push
    
  6. 將變更內容合併至 main 分支。詳情請參閱 IAC-R0004 執行手冊。

26.2.10. 清除權杖

全球 API 在加入區域中可用後,請刪除權杖,因為不再需要:

  1. 為合併要求建立新分支:

    cd /tmp/iac
    git checkout main
    git pull --ff-only
    git checkout -b JOINING_ZONE_NAME-mz-token-delete
    
  2. 刪除權杖 YAML 檔案:

    rm /tmp/iac/infrastructure/zonal/zones/JOINING_ZONE_NAME/root-admin/mz-token.yaml
    
  3. 如果 kustomization.yaml 檔案已存在,請更新該檔案。

    1. 開啟檔案:

      vim infrastructure/zonal/zones/JOINING_ZONE_NAME/root-admin/kustomization.yaml
      
    2. resources 清單中移除 mz-token.yaml 項目、儲存檔案,然後結束 vim。

  4. 修訂分支的變更:

    git add infrastructure
    git commit
    
  5. 將分支版本推送至 GitLab:

    git push
    
  6. 將變更內容合併至 main 分支。詳情請參閱 IAC-R0004 執行手冊。

26.2.11. 與其他時區同步時間

  1. 請按照 NTP P0007 - Configure Multizone SyncServers,將這個區域的時間與其他區域同步。

26.2.12. 確認全域 API 運作正常

完成全域 API 啟動程序後,請執行健康狀態檢查,確認 API 運作正常:

  1. 從根管理員叢集的 API 伺服器取得區域名稱:

    export ZONE_NAME=$(kubectl get controlplane -n mz-system cp -o jsonpath='{.spec.zone}')
    
  2. 檢查全域 API 的上次產生活動訊號時間戳記:

    kubectl get globalapizone -n mz-system ${ZONE_NAME} -o yaml
    

    活動訊號時間戳記會填入 status.lastHeartbeat。時間戳記每 30 秒更新一次。如果全域 API 的最後一次心跳時間戳記不超過 30 秒,即為正常。

26.2.13. 延長全域 etcd CA 的到期日

全域 etcd 的憑證授權單位 (CA) 有 90 天的有效期限。全域 etcd 是 etcd 叢集,其中執行個體部署在多個 GDC 區域。系統不會自動輪替 CA。

這些操作說明應適用於已加入多區域環境的現有區域。更新現有區域後,即將加入這個宇宙的下一個區域可以略過本節。

26.2.13.1. 檢查到期日

在任何現有區域中,使用根管理員叢集的管理員 Kubernetes 設定。檢查憑證授權單位的到期日:

export CA_NAME=$(kubectl get etcdca etcd -n global-kube-system -o jsonpath="{.spec.rootCA.name}")

kubectl get secret $CA_NAME -n global-kube-system -o jsonpath="{.data.tls\.crt}" | base64 -d | openssl x509 -enddate -noout -in -

如果有效期限已設為一年左右,則無須採取任何行動。如果少於一年,請參閱輪替效期較長的 CA

26.2.13.2. 輪替效期較長的 CA

請按照 MZ-T0001 輪替 CA。確認新 CA 的憑證規格包含 duration: 8760h 值。