將存放區分成多個存放區

本頁面說明如何安全地將一個根存放區分成兩個以上的根存放區。這些步驟也適用於命名空間存放區。

Config Sync 同步處理的存放區是指 Git 存放區、分支、修訂版本和目錄的組合。

如果根存放區中有大量資源 (例如超過 5000 個),Config Sync 可能會因為下列兩個原因而無法正常運作:

  1. ResourceGroup 物件可能會超過 etcd 物件大小限制。ResourceGroup 物件會記錄 Git 存放區中所有資源的群組、種類、命名空間和名稱。如果資源數量龐大,就會產生大型 ResourceGroup 物件。
  2. 與資源數量較少的存放區相比,同步所有資源需要較長的時間。Config Sync 會依序將資源套用至叢集。有時資源無法在第一次順利套用,因此 Config Sync 必須重試套用。

遇到這些問題時,您可以將根存放區分成多個,讓每個根存放區的資源較少。

分割非結構化根存放區

RootSync 物件是用來說明步驟。這些步驟也適用於 RepoSync 物件。

1.21.0 以上版本

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

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

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

  1. 確認 RootSync single-root-syncconfigsync.gke.io/deletion-propagation-policy 註解值為 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-1root-sync-2 RootSync 物件。這麼做會同步處理新的存放區或目錄,以便叢集中的現有物件由新的 RootSync 物件 root-sync-1root-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 chart,可以選擇大約一半的基礎,並將常見註解新增至 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

由於我們建議使用非結構化存放區,您也可以考慮在拆分階層式存放區之前,將其轉換為非結構化存放區