将代码库拆分为多个代码库

本页面介绍如何安全地将一个根代码库拆分为两个或更多根代码库。这些步骤也可以应用于命名空间代码库。

Config Sync 同步的代码库是指 Git 代码库、分支、修订版本和目录的组合。

当根代码库中有大量资源(例如超过 5000 个)时,Config Sync 可能会因为以下两个原因而无法正常运行:

  1. ResourceGroup 对象可能会超出 etcd 对象的大小限制。ResourceGroup 对象会记录 Git 代码库中所有资源的组、种类、命名空间和名称。拥有大量资源会导致 ResourceGroup 对象过大。
  2. 相较包含较少资源的代码库,同步该代码库中所有资源所需花费的时间会更长。Config Sync 会将资源依序应用于集群。有时,可能无法在第一次便成功应用资源,那么 Config Sync 就必须重新尝试应用这些资源。

如果您遇到这些问题,可以将您的根代码库拆分为多个根代码库,以便每个根代码库都具有较少的资源。

拆分非结构化根代码库

我们将使用 RootSync 对象来说明相关步骤。这些步骤也可以应用于 RepoSync 对象。

此方法适用于 Config Sync 1.21.0 版及更高版本,因为这些版本中包含一个终结器,在 RootSync 或 RepoSync 对象被删除后,便不会再对相应对象进行管理。之前,孤立对象具有持久性元数据,这会阻止其他客户端或新的 RootSync 或 RepoSync 对象对其进行管理。

假设您的根代码库由 RootSync 对象 single-root-sync 进行同步。将代码库拆分后,您将有两个根代码库。一个由 RootSync 对象 root-sync-1 同步,而另一个由 RootSync 对象 root-sync-2 同步。

如需拆分代码库,请按照以下步骤操作:

  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. 等待新的 RootSync 对象 root-sync-1 同步。您可以通过运行以下命令来检查状态:

    nomos status
    

任何版本

此方法适用于任何 Config Sync 版本,包括 1.21.0 版,不过对于该版本,建议您使用 1.21.0 版及更高版本适用的方法,因为所需的步骤更少。如果您的 Config Sync 低于 1.21.0 版,则可以改用此方法。

假设您的根代码库由 RootSync 对象 root-sync 进行同步。将代码库拆分后,您将有两个根代码库。一个由 RootSync 对象 root-sync 同步,而另一个由 RootSync 对象 root-sync-1 同步。

如需拆分代码库,请按照以下步骤操作:

  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. 运行以下命令,等待现有 RootSync 对象 root-sync 同步:

    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. 应用 RootSync 对象 root-sync-1 以同步新代码库或新目录,以便通过新的 RootSync 对象 root-sync-1 管理集群中的现有对象。

     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. 等待新的 RootSync 对象 root-sync-1 同步。您可以通过运行以下命令来检查状态:

    nomos status
    
  8. 从原始代码库中移除带有 configmanagement.gke.io/managed: disabled 注解的资源。提交并推送更改:

    git commit -am 'remove configuration managed by the new root repository'
    
  9. 运行以下命令,等待现有 RootSync 对象 root-sync 同步:

    nomos status
    

拆分分层根代码库

拆分分层代码库的步骤与拆分非结构化代码库的步骤类似。

主要有以下三项区别:

  1. 新的根代码库(或新目录)也应为分层结构。您需要将现有的 system/clusterregistry/ 目录复制到新的根代码库(或新目录)。

  2. 命名空间中的资源不能分布到多个代码库中。否则,不同的协调器将争相管理命名空间。

  3. RootSync 对象 root-sync-1 应使用 spec.sourceFormat: hierarchical

由于我们建议使用非结构化代码库,因此在拆分分层代码库之前,您还可以考虑将分层代码库转换为非结构化代码库