將存放區分成多個存放區

在 Config Sync 中管理數千個 Kubernetes 資源時,將大型根目錄或命名空間存放區分割成多個較小的存放區,有助於提高協調速度並防止同步失敗。

在 Config Sync 中,同步的存放區是指 Git 存放區、分支版本、修訂版本和目錄的組合。將單一存放區拆分至多個 RootSync 或 RepoSync 物件,可減少每個協調器追蹤及套用的資源數量。

為什麼大型存放區會導致同步問題

如果根存放區包含大量資源 (例如超過 5,000 個),Config Sync 可能會因下列原因而發生效能或同步問題:

  • ResourceGroup 物件可能會超過 etcd 物件大小限制。ResourceGroup 物件會記錄 Git 存放區中所有資源的群組、種類、命名空間和名稱。大量資源可能會導致 ResourceGroup 物件過大。
  • 同步處理大型存放區所需的時間比小型存放區長,因為 Config Sync 會依序將資源套用至叢集。如果 Config Sync 首次嘗試套用資源失敗,就必須重試。

遇到這些問題時,請將根存放區拆分為多個存放區,讓每個根存放區管理較少資源。

拆分非結構化根存放區

下列步驟以 RootSync 物件為例,但您也可以將這些步驟套用至 RepoSync 物件。

Config Sync 1.21.0 以上版本新增了終止器,會在 RootSync 或 RepoSync 物件刪除時停止管理物件,因此這個方法適用於這些版本。先前,孤立物件具有永久中繼資料,因此無法由其他用戶端或新的 RootSync 或 RepoSync 物件管理。

假設根存放區是由物件 RootSync single-root-sync 同步。拆分存放區後,您會有兩個根存放區。一個由 root-sync-1 RootSync 物件同步,另一個則由 root-sync-2 RootSync 物件同步。

如要拆分存放區,請按照下列步驟操作:

  1. 確認 RootSync single-root-sync 的 configsync.gke.io/deletion-propagation-policy 註解值為 Orphan,或未設定。未設定時,預設值與「Orphan」相同。這項設定可確保物件不會遭到刪除。

  2. 刪除 RootSync single-root-sync:

    kubectl delete rootsync single-root-sync -n config-management-system
    
  3. 請按照下列步驟設定新的存放區:

    1. 在現有的 Git 存放區中,建立新的存放區或目錄。
    2. 將資源移至新的存放區或目錄。
    3. 如要將根存放區分割成兩個以上的存放區,請視需要重複執行這些步驟。
  4. 修訂並推送變更:

    git commit -am 'add configuration for the new root repository'
    
  5. 套用 root-sync-1 和 root-sync-2 RootSync 物件。這樣做會同步新的存放區或目錄,讓叢集中的現有物件由新的 RootSync 物件 root-sync-1 和 root-sync-2 管理:

     apiVersion: configsync.gke.io/v1beta1
     kind: RootSync
     metadata:
       name: ROOT_SYNC_NAME
       namespace: config-management-system
     spec:
       sourceFormat: unstructured
       git:
         repo: NEW_ROOT_REPOSITORY
         revision: NEW_ROOT_REVISION
         branch: NEW_ROOT_BRANCH
         dir: "NEW_ROOT_DIRECTORY"
         auth: ROOT_AUTH_TYPE
         gcpServiceAccountEmail: ROOT_EMAIL
         # secretRef should be omitted if the auth type is none, gcenode, or gcpserviceaccount.
         secretRef:
           name: git-creds
    

    更改下列內容:

    • NEW_ROOT_REPOSITORY:要用做新根存放區的 Git 存放區網址。您可以使用 HTTPS 或 SSH 通訊協定輸入網址。例如,https://github.com/GoogleCloudPlatform/anthos-config-management-samples 使用 HTTPS 通訊協定。如未輸入通訊協定,系統會將網址視為 HTTPS 網址。
    • NEW_ROOT_REVISION:(選用) 要簽出的新根存放區 Git 修訂版本 (標記或雜湊)。
    • NEW_ROOT_BRANCH:(選用) 要同步的新根存放區分支版本。
    • NEW_ROOT_DIRECTORY:(選用) Git 存放區中新根目錄的路徑,其中包含要同步處理的設定。
    • ROOT_AUTH_TYPE:這個值應與現有的 RootSync/root-sync 物件相同。
    • ROOT_EMAIL:這個值應與現有的 RootSync/root-sync 物件相同。
  6. 等待新的 root-sync-1 RootSync 物件同步。您可以使用下列指令檢查狀態:

    nomos status
    

任何版本

這個方法適用於任何 Config Sync 版本,包括 1.21.0 版,但建議您使用 1.21.0 以上版本提供的方法,因為步驟較少。如果 Config Sync 版本低於 1.21.0,則可改用這個方法。

假設根存放區是由物件 RootSync root-sync 同步。拆分存放區後,您會有兩個根存放區。一個由 root-sync RootSync 物件同步,另一個則由 root-sync-1 RootSync 物件同步。

如要拆分存放區,請按照下列步驟操作:

  1. 在現有的根存放區中,選擇要移至其他存放區或目錄的資源,並為這些資源新增 configmanagement.gke.io/managed: disabled 註解。這項註解可確保將叢集中的現有物件設定從一個存放區移至另一個存放區時,不會影響這些物件。如果您使用 Kustomize 格式或 Helm 圖表,可以選擇大約一半的基礎,並將常見的註解新增至 kustomization.yaml 檔案,例如以下範例:

    # kustomization.yaml
    commonAnnotations:
      configmanagement.gke.io/managed: disabled
    
  2. 修訂並推送變更: sh git commit -am 'disable Config Sync management on subset of the configuration'

  3. 使用下列指令,等待現有的 root-sync RootSync 物件同步:

    nomos status
    
  4. 請按照下列步驟設定第二個存放區:

    1. 在現有的 Git 存放區中,建立新的存放區或目錄。
    2. 將含有 configmanagement.gke.io/managed: disabled 註解的資源複製到新的存放區或目錄。
    3. 移除新存放區或目錄中的 configmanagement.gke.io/managed: disabled 註解。
    4. 如要將根存放區分割成兩個以上的存放區,請視需要重複執行這些步驟。
  5. 修訂並推送變更:

    git commit -am 'add configuration for the new root repository'
    
  6. 套用 root-sync-1 RootSync 物件來同步處理新的存放區或目錄,這樣一來,叢集中的現有物件就會由新的 root-sync-1 RootSync 物件管理。

     apiVersion: configsync.gke.io/v1beta1
     kind: RootSync
     metadata:
       name: root-sync-1
       namespace: config-management-system
     spec:
       sourceFormat: unstructured
       git:
         repo: NEW_ROOT_REPOSITORY
         revision: NEW_ROOT_REVISION
         branch: NEW_ROOT_BRANCH
         dir: "NEW_ROOT_DIRECTORY"
         auth: ROOT_AUTH_TYPE
         gcpServiceAccountEmail: ROOT_EMAIL
         # secretRef should be omitted if the auth type is none, gcenode, or gcpserviceaccount.
         secretRef:
           name: git-creds
    

    更改下列內容:

    • NEW_ROOT_REPOSITORY:要用做新根存放區的 Git 存放區網址。您可以使用 HTTPS 或 SSH 通訊協定輸入網址。例如,https://github.com/GoogleCloudPlatform/anthos-config-management-samples 使用 HTTPS 通訊協定。如未輸入通訊協定,系統會將網址視為 HTTPS 網址。
    • NEW_ROOT_REVISION:(選用) 要簽出的新根存放區 Git 修訂版本 (標記或雜湊)。
    • NEW_ROOT_BRANCH:(選用) 要同步的新根存放區分支版本。
    • NEW_ROOT_DIRECTORY:(選用) Git 存放區中新根目錄的路徑,其中包含要同步處理的設定。
    • ROOT_AUTH_TYPE:這個值應與現有的 RootSync/root-sync 物件相同。
    • ROOT_EMAIL:這個值應與現有的 RootSync/root-sync 物件相同。
  7. 等待新的 root-sync-1 RootSync 物件同步。您可以使用下列指令檢查狀態:

    nomos status
    
  8. 從原始存放區中移除含有 configmanagement.gke.io/managed: disabled 註解的資源。修訂並推送變更:

    git commit -am 'remove configuration managed by the new root repository'
    
  9. 使用下列指令,等待現有的 root-sync RootSync 物件同步:

    nomos status
    

拆分階層式根存放區

拆分階層式存放區的步驟與拆分非結構化存放區的步驟類似。

主要有以下三項差異:

  1. 新的根存放區 (或新目錄) 也應採用階層式結構。您需要將現有的 system/ 和 clusterregistry/ 目錄複製到新的根存放區 (或新目錄)。

  2. 命名空間中的資源無法分散到多個存放區。否則,不同的協調器會爭相管理命名空間。

  3. root-sync-1 RootSync 物件應使用 spec.sourceFormat: hierarchical。

建議您使用非結構化存放區,因此在拆分階層式存放區之前,也可以考慮將階層式存放區轉換為非結構化存放區。