在 Config Sync 上启用多代码库模式后,您可以将来自多个代码库的配置同步到同一组集群。您可以利用以下类型的代码库:
根代码库:此代码库可让您同步集群级和命名空间级配置。根代码库使用管理员级凭据来强制执行应用命名空间的政策,并替换从所需状态偏移的本地更改。中央管理员管理根存储库。每个集群只能有一个根代码库。
命名空间代码库:命名空间代码库为可选项,并且可以包含同步到集群中特定命名空间的命名空间级配置。您可以将命名空间代码库的设置和控制权委托给非管理员用户。
每个代码库都有单个 Git 引用(代码库分支、提交或标记和目录元组),您可以单独对其进行管理。此配置会分离不同团队的配置部署生命周期。它还让您可以更自主地选择要存储代码库的位置以及如何进行构建。
下图简要介绍了团队如何使用根代码库和命名空间代码库:
在此图中,中心管理员管理组织的集中式基础架构,并对集群和组织中的所有命名空间强制执行政策。
负责管理实时部署的应用运维人员将配置应用于其处理的命名空间中的应用。
准备工作
在启用多代码库模式之前,请完成以下任务:
- 使用 Config Sync 1.5.1 或更高版本。
限制
使用多代码库模式时,请考虑以下限制:
spec.enableMultiRepo
字段与spec.git
字段不兼容。如果您仍需要使用spec.git
,请参阅使用旧版 spec.git 字段部分。ClusterSelectors
和namespaceSelectors
(包括指向选择器的注释)仅适用于根代码库。- 您无法在 RootSync 或 RepoSync 配置的
auth
字段中使用gcenode
。
配置从根代码库同步
将根 Git 代码库配置移至 RootSync(推荐)
在启用多代码库模式时,我们建议您将 Git 代码库配置从现有 config-management.yaml
文件移到 RootSync YAML 文件。
如需配置根代码库,请完成以下任务:
- 打开您的
config-management.yaml
文件。 - 记下
spec.git
字段,并将其从config-management.yaml
文件中移除(下一次创建 RootSync 时,您可以使用这些配置)。 将
spec.enableMultiRepo
字段设置为true
:# config-management.yaml apiVersion: configmanagement.gke.io/v1 kind: ConfigManagement metadata: name: config-management spec: enableMultiRepo: true
应用更改:
kubectl apply -f config-management.yaml
创建
root-sync.yaml
文件。例如:# root-sync.yaml apiVersion: configsync.gke.io/v1alpha1 kind: RootSync metadata: name: root-sync namespace: config-management-system spec: git: repo: REPOSITORY revision: REVISION branch: BRANCH dir: "DIRECTORY" auth: AUTH_TYPE secretRef: name: SECRET_NAME
请替换以下内容:
- REPOSITORY:添加要用作根代码库的 Git 代码库的网址。此字段是必填字段。
- REVISION:添加要签出的 Git 修订版本(标记或哈希)。此字段是可选字段,默认值为
HEAD
。 - BRANCH:添加要从中同步的代码库的分支。此字段是可选字段,默认值为
master
。 - DIRECTORY:添加 Git 代码库中的路径,表示要同步到的代码库的顶层目录。此字段是可选字段,默认值为代码库的根目录。
AUTH_TYPE:添加以下身份验证类型之一:
none
ssh
cookiefile
token
此字段是必填字段。
SECRET_NAME:添加您要为 Secret 提供的名称。此字段是必填字段。
根据您的首选身份验证方法创建 Secret。
Secret 必须满足以下要求:
- Secret 名称必须与您在
repo-sync.yaml
中定义的spec.git.secretRef
名称匹配。 - 您必须将 Secret 的公钥添加到 Git 提供商。
- Secret 名称必须与您在
应用配置:
kubectl apply -f root-sync.yaml
验证安装:
kubectl -n config-management-system get pods | grep reconciler-manager
您应该会看到类似于以下示例的输出:
reconciler-manager-6f988f5fdd-4r7tr 1/1 Running 0 26s
将根 Git 代码库保存在 ConfigManagement 中(不推荐)
您可以启用 config-management.yaml
文件中的现有根 Git 代码库,同时启用多代码库模式,而不是将其移至 RootSync。我们不推荐此操作,因为此操作将来会予以弃用。
将
spec.enableMultiRepo
和spec.enableLegacyFields
字段设置为true
:# config-management.yaml apiVersion: configmanagement.gke.io/v1 kind: ConfigManagement metadata: name: config-management spec: enableMultiRepo: true enableLegacyFields: true git: syncRepo: REPO syncBranch: BRANCH secretType: TYPE policyDir: "DIRECTORY" # ...other fields...
如需详细了解这些字段,请参阅 config-management.yaml 字段。
应用更改:
kubectl apply -f config-management.yaml
部署此 YAML 文件还会自动在集群上生成 RootSync
资源。请勿更改 RootSync
配置。如需继续添加其他命名空间代码库,请继续配置从命名空间代码库同步。
配置从命名空间代码库同步
您可以采用两种方法配置命名空间代码库:
控制根代码库中的命名空间代码库。此方法可以将根代码库的命名空间代码库的所有配置集中到一起,从而允许中央管理员完全控制设置。
使用 Kubernetes API 控制命名空间代码库。此方法会将命名空间代码库的控制权委派给命名空间所有者。
控制根代码库中的命名空间代码库
在此方法中,中央管理员可以直接从根代码库管理命名空间代码库的设置。由于 Config Sync 管理命名空间代码库资源,因此该方法会阻止对命名空间代码库定义进行的所有本地更改。
如需使用此方法,请完成以下任务:
在根代码库中,声明
namespace
配置:# ROOT_REPO/namespaces/NAMESPACE/namespace.yaml apiVersion: v1 kind: Namespace metadata: name: NAMESPACE
将 NAMESPACE 替换为您的命名空间的名称。
在根代码库中,在同一命名空间声明
RepoSync
配置:# ROOT_REPO/namespaces/NAMESPACE/repo-sync.yaml apiVersion: configsync.gke.io/v1alpha1 kind: RepoSync metadata: name: repo-sync namespace: NAMESPACE spec: git: repo: REPOSITORY revision: REVISION branch: BRANCH dir: "DIRECTORY" auth: AUTH_TYPE secretRef: name: SECRET_NAME
请替换以下内容:
- NAMESPACE:添加您的命名空间的名称。
- REPOSITORY:添加要用作根代码库的 Git 代码库的网址。此字段是必填字段。
- REVISION:添加要签出的 Git 修订版本(标记或哈希)。此字段是可选字段,默认值为
HEAD
。 - BRANCH:添加要从中同步的代码库的分支。此字段是可选字段,默认值为
master
。 - DIRECTORY:添加 Git 代码库中的路径,表示要同步到的代码库的顶层目录。此字段是可选字段,默认值为代码库的根目录。
AUTH_TYPE:添加以下身份验证类型之一:
none
ssh
cookiefile
token
此字段是必填字段。
SECRET_NAME:添加您要为 Secret 提供的名称。此字段是必填字段。
每个命名空间最多只能有一个 RepoSync 资源。要强制执行此操作,对象名称必须为
repo-sync
。RepoSync
引用的目录中包含的所有配置也必须与RepoSync
资源位于同一命名空间中。在根代码库中,声明
RoleBinding
配置,以向ns-reconciler-NAMESPACE
服务帐号授予管理命名空间中的资源的权限。当RepoSync
配置同步到集群时,Config Sync 会自动创建ns-reconciler-NAMESPACE
服务帐号。如需声明
RoleBinding
,请创建以下清单:# ROOT_REPO/namespaces/NAMESPACE/sync-rolebinding.yaml kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: syncs-repo namespace: NAMESPACE subjects: - kind: ServiceAccount name: ns-reconciler-NAMESPACE namespace: config-management-system roleRef: kind: ClusterRole name: RECONCILER_ROLE apiGroup: rbac.authorization.k8s.io
请替换以下内容:
- NAMESPACE:添加您的命名空间的名称。
RECONCILER_ROLE:作为中央管理员,您可以设置 RECONCILER_ROLE,以强制执行可从命名空间代码库同步哪些类型的配置。您可以选择以下角色之一:
默认 ClusterRole:
admin
edit
如需了解详情,请参阅面向用户的角色。
根代码库中声明的用户定义的 ClusterRole 或 Role。此角色允许细化的权限。
将先前的更改提交到根代码库:
git add . git commit -m 'Setting up new namespace repository.' git push
根据您的首选身份验证方法创建 Secret。
Secret 必须满足以下要求:
- 在 RepoSync 所在的命名空间中创建 Secret。
- Secret 名称必须与您在
repo-sync.yaml
中定义的spec.git.secretRef
名称匹配。 - 您必须将 Secret 的公钥添加到 Git 提供商。
如需验证配置,请对命名空间代码库中的一个对象使用
kubectl get
。例如:kubectl get rolebindings -n NAMESPACE
使用 Kubernetes API 控制命名空间代码库
在此方法中,中心管理员仅在根代码库中声明命名空间,并将 RepoSync
文件的声明委托给应用运维人员。
中心管理员任务
中心管理员需完成以下任务:
在根代码库中,声明
namespace
配置:# ROOT_REPO/namespaces/NAMESPACE/namespace.yaml apiVersion: v1 kind: Namespace metadata: name: NAMESPACE
将 NAMESPACE 替换为您的命名空间的名称。
在根代码库中,声明
RoleBinding
配置,以向应用运维人员授予权限。使用 RBAC 提升防护确保应用运维人员无法再应用角色绑定,而不受角色绑定授予的权限。如需声明 RoleBinding,请创建以下清单:
# ROOT_REPO/namespaces/NAMESPACE/operator-rolebinding.yaml kind: RoleBinding # Add RBAC escalation prevention apiVersion: rbac.authorization.k8s.io/v1 metadata: name: operator namespace: NAMESPACE subjects: - kind: User name: USER_NAME apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: OPERATOR_ROLE apiGroup: rbac.authorization.k8s.io
请替换以下内容:
- NAMESPACE:添加您在根代码库中创建的命名空间。
- USER_NAME:添加应用运维人员的用户名。
OPERATOR_ROLE:作为中央管理员,您可以设置 OPERATOR_ROLE,以强制决定可从命名空间代码库同步哪些类型的配置。您可以选择以下角色之一:
默认 ClusterRole:
admin
edit
如需了解详情,请参阅面向用户的角色。
根代码库中声明的用户定义的 ClusterRole 或 Role。这样可实现细化的权限。
将先前的更改提交到根代码库:
git add . git commit -m 'Setting up new namespace repository.' git push
应用运维人员任务
应用运维人员需完成以下任务:
声明
RoleBinding
配置,以向自动预配的ns-reconciler-NAMESPACE
服务帐号授予管理命名空间中的资源的权限。当RepoSync
配置同步到集群时,Config Sync 会自动创建ns-reconciler-NAMESPACE
服务帐号。如需声明 RoleBinding,请创建以下清单:
# sync-rolebinding.yaml kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: syncs-repo namespace: NAMESPACE subjects: - kind: ServiceAccount name: ns-reconciler-NAMESPACE namespace: config-management-system roleRef: kind: ClusterRole name: RECONCILER_ROLE apiGroup: rbac.authorization.k8s.io
请替换以下内容:
- NAMESPACE:添加您在根代码库中创建的命名空间。
- RECONCILER_ROLE:作为应用运维人员,您可以设置 RECONCILER_ROLE 以强制可以从命名空间代码库同步哪些类型的配置。您只能进一步限制中心管理员授予您的权限集。因此,此角色不能比中心管理员在上一部分声明的 OPERATOR_ROLE 更宽松。
应用 RoleBinding 配置:
kubectl apply -f sync-rolebinding.yaml
根据您的首选身份验证方法创建 Secret。
Secret 必须满足以下要求:
- 在 RepoSync 所在的命名空间中创建 Secret。
- Secret 名称必须与您在
repo-sync.yaml
中定义的spec.git.secretRef
名称匹配。 - 您必须将 Secret 的公钥添加到 Git 提供商。
声明
RepoSync
配置:# repo-sync.yaml apiVersion: configsync.gke.io/v1alpha1 kind: RepoSync metadata: name: repo-sync namespace: NAMESPACE spec: git: repo: REPOSITORY revision: REVISION branch: BRANCH dir: "DIRECTORY" auth: AUTH_TYPE secretRef: name: SECRET_NAME
请替换以下内容:
- REPOSITORY:添加要用作根代码库的 Git 代码库的网址。此字段是必填字段。
- REVISION:添加要签出的 Git 修订版本(标记或哈希)。此字段是可选字段,默认值为
HEAD
。 - BRANCH:添加要从中同步的代码库的分支。此字段是可选字段,默认值为
master
。 - DIRECTORY:添加 Git 代码库中的路径,表示要同步到的代码库的顶层目录。此字段是可选字段,默认值为代码库的根目录。
AUTH_TYPE:添加以下身份验证类型之一:
none
ssh
cookiefile
token
此字段是必填字段。
SECRET_NAME:添加您要为 Secret 提供的名称。此字段是必填字段。
每个命名空间最多只能有一个 RepoSync 资源。要强制执行此操作,对象名称必须为
repo-sync
。RepoSync
引用的目录中包含的所有配置也必须与RepoSync
资源位于同一命名空间中。应用
RepoSync
配置:kubectl apply -f repo-sync.yaml
如需验证配置,请对命名空间代码库中的一个对象使用
kubectl get
。例如:kubectl get rolebindings -n NAMESPACE
停止与继续同步
本部分介绍了如何暂时停止和恢复同步。如果不正确的配置意外提交到您的代码库,则可能需要这样做。
只有中心管理员可以停止在根代码库中进行同步。
能否停止在命名空间代码库中进行同步取决于用于命名空间代码库的配置方法。
如果使用的是控制根代码库中的命名空间代码库方法,则只有中心管理员可以停止和恢复同步。
如果使用的是通过 Kubernetes API 控制命名空间代码库方法,则应用运维人员可以停止和恢复从其处理的命名空间代码库同步。
停止同步
本部分介绍了如何停止对根代码库和命名空间代码库进行同步。
停止从根代码库同步
如需停止从根代码库同步,中心管理员可以运行以下命令:
kubectl -n config-management-system scale deployment root-reconciler --replicas=0
此命令会将 root-reconciler
Deployment 中的 replicas
计数减少至 0。
停止从命名空间代码库同步
选择根代码库方法 (Root repository method) 或 Kubernetes API 方法 (Kubernetes API method) 标签页以查看相关说明。
根代码库方法
如果使用的是控制根代码库中的命名空间代码库方法,则中心管理员可以运行以下命令以停止从命名空间代码库进行同步:
kubectl -n config-management-system scale deployment ns-reconciler-NAMESPACE --replicas=0
该命令会将 ns-reconciler-NAMESPACE
Deployment 中的副本计数减少至 0。
Kubernetes API 方法
如果使用是通过 Kubernetes API 控制命名空间代码库方法,则应用运维人员可以通过运行以下命令停止同步:
检索
RepoSync
配置并保存,以便稍后在需要恢复同步时使用:kubectl -n NAMESPACE get reposyncs repo-sync -oyaml > repo-sync.yaml
将 NAMESPACE 替换为您的 RepoSync 的命名空间。
删除
RepoSync
配置:kubectl -n NAMESPACE delete reposyncs repo-sync
此命令会触发 Reconciler Manager 以从 NAMESPACE 中移除命名空间协调器 (
ns-reconciler-NAMESPACE
),并停止同步。
恢复同步
本部分介绍了如何恢复对根代码库和命名空间代码库进行同步。
恢复从根代码库同步
如需恢复从根代码库进行同步,中心管理员可以运行以下命令:
kubectl -n config-management-system scale deployment root-reconciler --replicas=1
此命令会将 root-reconciler
Deployment 扩容到 1 个副本。
恢复从命名空间代码库同步
选择根代码库方法 (Root repository method) 或 Kubernetes API 方法 (Kubernetes API method) 标签页以查看相关说明。
根代码库方法
如果您使用的是控制根代码库中的命名空间代码库方法,则中心管理员可以运行以下命令:
kubectl -n config-management-system scale deployment ns-reconciler-NAMESPACE --replicas=1
此命令会将 ns-reconciler-NAMESPACE Deployment 扩容到 1 个副本。
Kubernetes API 方法
如果您使用的是通过 Kubernetes API 控制命名空间代码库方法,则应用运维人员可以通过重新应用包含 RepoSync
配置的 repo-sync.yaml
来恢复同步:
kubectl apply -f repo-sync.yaml
此命令会触发 Reconciler Manager 以创建命名空间协调器进程并创建 ns-reconciler-NAMESPACE
Deployment。
移除根代码库和命名空间代码库
如需移除根代码库,请删除 RootSync
文件。例如:
kubectl delete -f root-sync.yaml
如需卸载命名空间代码库,请删除 RepoSync
文件。此操作会卸载匹配的命名空间代码库。
冲突解决
当您使用两个代码库时,如果在根代码库和命名空间代码库中同时声明了相同的资源(匹配的群组、种类、名称和命名空间),则可能会出现冲突。发生这种情况时,只会将根代码库中的声明应用到集群。
由于根代码库始终优先,因此您可以通过更新根代码库来匹配命名空间代码库,或者通过删除命名空间代码库中有冲突的对象来解决冲突。