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