本页面介绍如何安全地将一个根代码库拆分为两个或更多根代码库。这些步骤也可以应用于命名空间代码库。
Config Sync 同步的代码库是指 Git 代码库、分支、修订版本和目录的组合。
当根代码库中有大量资源(例如超过 5000 个)时,Config Sync 可能会因为以下两个原因而无法正常运行:
- ResourceGroup 对象可能会超出 etcd 对象的大小限制。ResourceGroup 对象会记录 Git 代码库中所有资源的组、种类、命名空间和名称。拥有大量资源会导致 ResourceGroup 对象过大。
- 相较包含较少资源的代码库,同步该代码库中所有资源所需花费的时间会更长。Config Sync 会将资源依序应用于集群。有时,可能无法在第一次便成功应用资源,那么 Config Sync 就必须重新尝试应用这些资源。
如果您遇到这些问题,可以将您的根代码库拆分为多个根代码库,以便每个根代码库都具有较少的资源。
拆分非结构化根代码库
我们将使用 RootSync 对象来说明相关步骤。这些步骤也可以应用于 RepoSync 对象。
假设您的根代码库由 RootSync 对象 root-sync
进行同步。将其拆分后,您将有两个根代码库。一个由 RootSync 对象 root-sync
同步,而另一个由 RootSync 对象 root-split
同步。
如需拆分代码库,请按照以下步骤操作:
在现有根代码库中,选择要移动到其他代码库或目录的资源,并向其添加注释
configmanagement.gke.io/managed: disabled
。此注解可确保在将相关配置从一个代码库移动到另一个代码库时,集群中的现有对象不会受影响。如果您使用 Kustomize 格式或 Helm 图表,则可以选择大约一半的基准,并将通用注解添加到kustomization.yaml
文件中,如以下示例所示:# kustomization.yaml commonAnnotations: configmanagement.gke.io/managed: disabled
提交并推送更改:
git commit -am 'disable Config Sync management on subset of the configuration'
使用
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
替换为您的注册集群的成员名称。按照以下步骤设置您的第二个代码库:
- 在现有 Git 代码库中创建新代码库或新目录。
- 将带有注释
configmanagement.gke.io/managed: disabled
的资源复制到新代码库或新目录中。 - 在新代码库或新目录中移除注释
configmanagement.gke.io/managed: disabled
。 - 如果要将根代码库拆分为 2 个以上的代码库,请根据需要重复这些步骤。
提交并推送更改:
git commit -am 'add configuration for the new root repository'
应用 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 对象相同。
等待新的 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
替换为您的注册集群的成员名称。根代码库将进行同步。从原始代码库中移除带有注解
configmanagement.gke.io/managed: disabled
的资源。提交并推送更改:git commit -am 'remove configuration managed by the new root repository'
使用
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
替换为您的注册集群的成员名称。
拆分分层根代码库
拆分分层代码库的步骤与拆分非结构化代码库的步骤类似。
主要有以下三项区别:
新的根代码库(或新目录)也应为分层结构。您需要将现有的
system/
和clusterregistry/
目录复制到新的根代码库(或新目录)。命名空间中的资源不能分布到多个代码库中。否则,不同的协调器将争相管理命名空间。
RootSync 对象
root-split
应使用spec.sourceFormat: hierarchical
。
由于我们建议使用非结构化代码库,因此在拆分分层代码库之前,您还可以考虑将分层代码库转换为非结构化代码库。