与多个代码库同步

在 Config Sync 上启用多代码库模式后,您可以将来自多个代码库的配置同步到同一组集群。您可以利用以下类型的代码库:

  • 根代码库:此代码库可让您同步集群级和命名空间级配置。根代码库使用管理员级凭据来强制执行应用命名空间的政策,并替换从所需状态偏移的本地更改。中央管理员管理根存储库。每个集群只能有一个根代码库。

  • 命名空间代码库:命名空间代码库为可选项,并且可以包含同步到集群中特定命名空间的命名空间级配置。您可以将命名空间代码库的设置和控制权委托给非管理员用户。

每个代码库都有单个 Git 引用(代码库分支、提交或标记和目录元组),您可以单独对其进行管理。此配置会分离不同团队的配置部署生命周期。它还让您可以更自主地选择要存储代码库的位置以及如何进行构建。

下图简要介绍了团队如何使用根代码库和命名空间代码库:

控制多个配置的中心管理员和控制其自己命名空间配置的应用运维人员。

在此图中,中心管理员管理组织的集中式基础架构,并对集群和组织中的所有命名空间强制执行政策。

负责管理实时部署的应用运维人员将配置应用于其处理的命名空间中的应用。

准备工作

在启用多代码库模式之前,请完成以下任务:

  • 使用 Config Sync 1.5.1 或更高版本。

限制

使用多代码库模式时,请考虑以下限制:

  • spec.enableMultiRepo 字段与 spec.git 字段不兼容。如果您仍需要使用 spec.git,请参阅使用旧版 spec.git 字段部分。
  • ClusterSelectorsnamespaceSelectors(包括指向选择器的注释)仅适用于根代码库。
  • 您无法在 RootSync 或 RepoSync 配置的 auth 字段中使用 gcenode

配置从根代码库同步

在启用多代码库模式时,我们建议您将 Git 代码库配置从现有 config-management.yaml 文件移到 RootSync YAML 文件。

如需配置根代码库,请完成以下任务:

  1. 打开您的 config-management.yaml 文件。
  2. 记下 spec.git 字段,并将其从 config-management.yaml 文件中移除(下一次创建 RootSync 时,您可以使用这些配置)。
  3. spec.enableMultiRepo 字段设置为 true

    # config-management.yaml
    apiVersion: configmanagement.gke.io/v1
    kind: ConfigManagement
    metadata:
      name: config-management
    spec:
      enableMultiRepo: true
    
  4. 应用更改:

    kubectl apply -f config-management.yaml
    
  5. 创建 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 提供的名称。此字段是必填字段。

  6. 根据您的首选身份验证方法创建 Secret

    Secret 必须满足以下要求:

    • Secret 名称必须与您在 repo-sync.yaml 中定义的 spec.git.secretRef 名称匹配。
    • 您必须将 Secret 的公钥添加到 Git 提供商。
  7. 应用配置:

    kubectl apply -f root-sync.yaml
    
  8. 验证安装:

    kubectl -n config-management-system get pods | grep reconciler-manager
    

    您应该会看到类似于以下示例的输出:

    reconciler-manager-6f988f5fdd-4r7tr 1/1 Running 0 26s
    

您可以启用 config-management.yaml 文件中的现有根 Git 代码库,同时启用多代码库模式,而不是将其移至 RootSync。我们不推荐此操作,因为此操作将来会予以弃用。

  1. spec.enableMultiRepospec.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 字段

  2. 应用更改:

    kubectl apply -f config-management.yaml

部署此 YAML 文件还会自动在集群上生成 RootSync 资源。请勿更改 RootSync 配置。如需继续添加其他命名空间代码库,请继续配置从命名空间代码库同步

配置从命名空间代码库同步

您可以采用两种方法配置命名空间代码库:

  • 控制根代码库中的命名空间代码库。此方法可以将根代码库的命名空间代码库的所有配置集中到一起,从而允许中央管理员完全控制设置。

  • 使用 Kubernetes API 控制命名空间代码库。此方法会将命名空间代码库的控制权委派给命名空间所有者。

控制根代码库中的命名空间代码库

在此方法中,中央管理员可以直接从根代码库管理命名空间代码库的设置。由于 Config Sync 管理命名空间代码库资源,因此该方法会阻止对命名空间代码库定义进行的所有本地更改。

如需使用此方法,请完成以下任务:

  1. 在根代码库中,声明 namespace 配置:

    # ROOT_REPO/namespaces/NAMESPACE/namespace.yaml
    apiVersion: v1
    kind: Namespace
    metadata:
      name: NAMESPACE
    

    NAMESPACE 替换为您的命名空间的名称。

  2. 在根代码库中,在同一命名空间声明 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-syncRepoSync 引用的目录中包含的所有配置也必须与 RepoSync 资源位于同一命名空间中。

  3. 在根代码库中,声明 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。此角色允许细化的权限。

  4. 将先前的更改提交到根代码库:

     git add .
     git commit -m 'Setting up new namespace repository.'
     git push
    
  5. 根据您的首选身份验证方法创建 Secret

    Secret 必须满足以下要求:

    • 在 RepoSync 所在的命名空间中创建 Secret。
    • Secret 名称必须与您在 repo-sync.yaml 中定义的 spec.git.secretRef 名称匹配。
    • 您必须将 Secret 的公钥添加到 Git 提供商。
  6. 如需验证配置,请对命名空间代码库中的一个对象使用 kubectl get。例如:

    kubectl get rolebindings -n NAMESPACE
    

使用 Kubernetes API 控制命名空间代码库

在此方法中,中心管理员仅在根代码库中声明命名空间,并将 RepoSync 文件的声明委托给应用运维人员。

中心管理员任务

中心管理员需完成以下任务:

  1. 在根代码库中,声明 namespace 配置:

    # ROOT_REPO/namespaces/NAMESPACE/namespace.yaml
     apiVersion: v1
     kind: Namespace
     metadata:
       name: NAMESPACE
    

    NAMESPACE 替换为您的命名空间的名称。

  2. 在根代码库中,声明 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。这样可实现细化的权限。

  3. 将先前的更改提交到根代码库:

     git add .
     git commit -m 'Setting up new namespace repository.'
     git push
    

应用运维人员任务

应用运维人员需完成以下任务:

  1. 声明 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 更宽松。
  2. 应用 RoleBinding 配置:

    kubectl apply -f sync-rolebinding.yaml
    
  3. 根据您的首选身份验证方法创建 Secret

    Secret 必须满足以下要求:

    • 在 RepoSync 所在的命名空间中创建 Secret。
    • Secret 名称必须与您在 repo-sync.yaml 中定义的 spec.git.secretRef 名称匹配。
    • 您必须将 Secret 的公钥添加到 Git 提供商。
  4. 声明 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-syncRepoSync 引用的目录中包含的所有配置也必须与 RepoSync 资源位于同一命名空间中。

  5. 应用 RepoSync 配置:

    kubectl apply -f repo-sync.yaml
    
  6. 如需验证配置,请对命名空间代码库中的一个对象使用 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 控制命名空间代码库方法,则应用运维人员可以通过运行以下命令停止同步:

  1. 检索 RepoSync 配置并保存,以便稍后在需要恢复同步时使用:

    kubectl -n NAMESPACE get reposyncs repo-sync -oyaml > repo-sync.yaml
    

    NAMESPACE 替换为您的 RepoSync 的命名空间。

  2. 删除 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 文件。此操作会卸载匹配的命名空间代码库。

冲突解决

当您使用两个代码库时,如果在根代码库和命名空间代码库中同时声明了相同的资源(匹配的群组、种类、名称和命名空间),则可能会出现冲突。发生这种情况时,只会将根代码库中的声明应用到集群。

由于根代码库始终优先,因此您可以通过更新根代码库来匹配命名空间代码库,或者通过删除命名空间代码库中有冲突的对象来解决冲突。

后续步骤