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

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

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

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

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

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

拆分非结构化根代码库

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

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

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

  1. 在现有根代码库中,选择要移动到其他代码库或目录的资源,并向其添加注释 configmanagement.gke.io/managed: disabled。此注解可确保在将相关配置从一个代码库移动到另一个代码库时,集群中的现有对象不会受影响。如果您使用 Kustomize 格式或 Helm 图表,则可以选择大约一半的基准,并将通用注解添加到 kustomization.yaml 文件中,如以下示例所示:

    # kustomization.yaml
    commonAnnotations:
      configmanagement.gke.io/managed: disabled
    
  2. 提交并推送更改: git commit -am 'disable Config Sync management on subset of the configuration'

  3. 使用 gcloud alpha anthos config sync repo describe 命令,等待现有 RootSync 对象 root-sync 同步:

    # gcloud command
    gcloud alpha anthos config sync repo describe --cluster MEMBERSHIP_NAME \
      --sync-namespace config-management-system  --sync-name root-sync
    

    MEMBERSHIP_NAME 替换为您的注册集群的成员名称。

  4. 按照以下步骤设置您的第二个代码库:

    1. 在现有 Git 代码库中创建新代码库或新目录。
    2. 将带有注释 configmanagement.gke.io/managed: disabled 的资源复制到新代码库或新目录中。
    3. 在新代码库或新目录中移除注释 configmanagement.gke.io/managed: disabled
    4. 如果要将根代码库拆分为 2 个以上的代码库,请根据需要重复这些步骤。
  5. 提交并推送更改:

    git commit -am 'add configuration for the new root repository'
    
  6. 应用 RootSync 对象 root-split 以同步新代码库或新目录,以便通过新的 RootSync 对象 root-split 管理集群中的现有对象。

     apiVersion: configsync.gke.io/v1beta1
     kind: RootSync
     metadata:
       name: root-split
       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-split 同步。您可以使用 gcloud alpha anthos config sync repo describe 命令完成此操作:

    $ gcloud alpha anthos config sync repo describe --cluster MEMBERSHIP_NAME \
      --sync-namespace config-management-system  --sync-name root-split
    

    MEMBERSHIP_NAME 替换为您的注册集群的成员名称。根代码库将进行同步。

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

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

    $ gcloud alpha anthos config sync repo describe --cluster MEMBERSHIP_NAME \
     --sync-namespace config-management-system  --sync-name root-sync
    

    MEMBERSHIP_NAME 替换为您的注册集群的成员名称。

拆分分层根代码库

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

主要有以下三项区别:

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

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

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

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