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

安装 Config Sync 时,您可以配置根代码库。配置根代码库后,您可以选择配置命名空间代码库。借助命名空间代码库,您可以执行一些操作,例如将代码库的设置和控制权委托给非管理用户。如需详细了解这些类型的代码库,请参阅 Config Sync 概览中的代码库部分。

命名空间代码库需要 RepoSync API。如果您使用 Google Cloud Console 或 gcloud 命令行工具安装了 Config Sync,并且版本为 1.7.0 或更高版本,则此 API 已启用。如果您使用 kubectl 安装了 Config Sync 并使用 ConfigManagement 对象来配置 Git 代码库,我们建议您迁移 ConfigManagement 对象以启用 RepoSync API。

虽然 Config Sync 自动检测来自可靠来源的变化,但您可以通过向命名空间代码库添加准入网络钩子来添加额外的偏移检测层。如需详细了解如何执行此操作,请参阅防止配置偏移

准备工作

  • 创建非结构化 Git 代码库或确保您有权访问此代码库,其中可能包含 Config Sync 要同步到的配置。命名空间代码库必须使用非结构化格式。
  • 在 Anthos 支持的平台和版本上创建集群,或确保您有权访问其上的集群。
  • 创建符合 Config Sync 要求的 GKE 集群,或确保您有权访问此集群。

限制

选择您的首选配置方法

选择用于配置命名空间代码库的两种方法之一:

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

在此方法中,中央管理员可以直接从根代码库管理命名空间代码库的设置。由于 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
     # If you are using a Config Sync version earlier than 1.8.0,
     # use: apiVersion: configsync.gke.io/v1alpha1
    apiVersion: configsync.gke.io/v1beta1
    kind: RepoSync
    metadata:
      name: repo-sync
      namespace: NAMESPACE
    spec:
      # Since this is for a namespace repository, the format should be unstructured
      sourceFormat: unstructured
      git:
       repo: NAMESPACE_REPOSITORY
       revision: NAMESPACE_REVISION
       branch: NAMESPACE_BRANCH
       dir: "NAMESPACE_DIRECTORY"
       auth: NAMESPACE_AUTH_TYPE
       gcpServiceAccountEmail: NAMESPACE_EMAIL
       secretRef:
         name: NAMESPACE_SECRET_NAME
       # The `noSSLVerify` field is supported in Anthos Config Management version 1.8.2 and later.
       noSSLVerify: NAMESPACE_NO_SSL_VERIFY
    

    请替换以下内容:

    • NAMESPACE:添加您的命名空间的名称。
    • NAMESPACE_REPOSITORY:添加要用作命名空间代码库的 Git 代码库的网址。您可以输入使用 HTTPS 或 SSH 协议的网址。例如,https://github.com/GoogleCloudPlatform/anthos-config-management-samples 使用 HTTPS 协议。如果您不输入协议,则网址会被视为 HTTPS 网址。此字段是必填字段。
    • NAMESPACE_REVISION:添加要签出的 Git 修订版本(标记或哈希)。此字段是可选字段,默认值为 HEAD
    • NAMESPACE_BRANCH:添加要从中同步的代码库的分支。此字段是可选字段,默认值为 master
    • NAMESPACE_DIRECTORY:添加 Git 代码库中指向您要同步的配置所在的根目录的路径。此字段是可选字段,默认值为代码库的根目录 (/)。
    • NAMESPACE_AUTH_TYPE:添加以下身份验证类型之一:

      • none:不使用身份验证
      • ssh:使用 SSH 密钥对
      • cookiefile:使用 cookiefile
      • token:使用令牌
      • gcpserviceaccount:使用 Google 服务帐号访问 Cloud Source Repositories 中的代码库。
      • gcenode:使用 Google 服务帐号访问 Cloud Source Repositories 中的代码库。请仅在集群中未启用 Workload Identity 时选择此选项。

        如需详细了解这些身份验证类型,请参阅授予 Config Sync 对 Git 的只读权限

      此字段是必填字段。

    • NAMESPACE_EMAIL:如果您已将 gcpserviceaccount 添加为 AUTH_TYPE,请添加您的 Google 服务帐号电子邮件地址。例如 acm@PROJECT_ID.iam.gserviceaccount.com

    • NAMESPACE_SECRET_NAME:添加您要为 Secret 提供的名称。此字段是可选字段。

    • NAMESPACE_NO_SSL_VERIFY:如需停用 SSL 证书验证,请将此字段设置为 true。默认值为 false

    如需了解字段的说明以及可添加到 spec 字段的字段的完整列表,请参阅 RepoSync 字段

    每个命名空间最多只能有一个 RepoSync 对象。如需强制执行此限制,对象 name 必须是 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

        如需了解详情,请参阅面向用户的角色

      • 根代码库中声明的用户定义的 ClusterRoleRole。此角色允许细化的权限。

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

     git add .
     git commit -m 'Setting up new namespace repository.'
     git push
    
  5. 如有必要,请根据您的首选身份验证方法创建 Secret。如果您使用 none 作为身份验证类型,则可以跳过此步骤。

    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: USERNAME
       apiGroup: rbac.authorization.k8s.io
     roleRef:
       kind: ClusterRole
       name: OPERATOR_ROLE
       apiGroup: rbac.authorization.k8s.io
    

    请替换以下内容:

    • NAMESPACE:添加您在根代码库中创建的命名空间。
    • USERNAME:添加应用运维人员的用户名。
    • 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。如果您使用 none 作为身份验证类型,则可以跳过此步骤。

    Secret 必须满足以下要求:

    • 在 RepoSync 所在的命名空间中创建 Secret。
    • Secret 名称必须与您在 root-sync.yaml 中定义的 spec.git.secretRef 名称匹配。
    • 您必须将 Secret 的公钥添加到 Git 提供商。
  4. 声明 RepoSync 配置:

    # repo-sync.yaml
    # If you are using a Config Sync version earlier than 1.8.0,
    # use: apiVersion: configsync.gke.io/v1alpha1
    apiVersion: configsync.gke.io/v1beta1
    kind: RepoSync
    metadata:
      name: repo-sync
      namespace: NAMESPACE
    spec:
      # Since this is for a namespace repository, the format should be unstructured
      sourceFormat: unstructured
      git:
       repo: NAMESPACE_REPOSITORY
       revision: NAMESPACE_REVISION
       branch: NAMESPACE_BRANCH
       dir: "NAMESPACE_DIRECTORY"
       auth: NAMESPACE_AUTH_TYPE
       gcpServiceAccountEmail: NAMESPACE_EMAIL
       secretRef:
         name: NAMESPACE_SECRET_NAME
       # The `noSSLVerify` field is supported in Anthos Config Management version 1.8.2 and later.
       noSSLVerify: REPO_SSL_VERIFY
    

    请替换以下内容:

    • NAMESPACE_REPOSITORY:添加要用作命名空间代码库的 Git 代码库的网址。您可以输入使用 HTTPS 或 SSH 协议的网址。例如,https://github.com/GoogleCloudPlatform/anthos-config-management-samples 使用 HTTPS 协议。如果您不输入协议,则网址会被视为 HTTPS 网址。此字段是必填字段。
    • NAMESPACE_REVISION:添加要签出的 Git 修订版本(标记或哈希)。此字段是可选字段,默认值为 HEAD
    • NAMESPACE_BRANCH:添加要从中同步的代码库的分支。此字段是可选字段,默认值为 master
    • NAMESPACE_DIRECTORY:添加 Git 代码库中指向您要同步的配置所在的根目录的路径。此字段是可选字段,默认值为代码库的根目录 (/)。
    • NAMESPACE_AUTH_TYPE:添加以下身份验证类型之一:

      • none:不使用身份验证
      • ssh:使用 SSH 密钥对
      • cookiefile:使用 cookiefile
      • token:使用令牌
      • gcpserviceaccount:使用 Google 服务帐号访问 Cloud Source Repositories 中的代码库。
      • gcenode:使用 Google 服务帐号访问 Cloud Source Repositories 中的代码库。请仅在集群中未启用 Workload Identity 时选择此选项。

        如需详细了解这些身份验证类型,请参阅授予 Config Sync 对 Git 的只读权限

      此字段是必填字段。

    • NAMESPACE_EMAIL:如果您已将 gcpserviceaccount 添加为 AUTH_TYPE,请添加您的 Google 服务帐号电子邮件地址。例如 acm@PROJECT_ID.iam.gserviceaccount.com

    • NAMESPACE_SECRET_NAME:添加您要为 Secret 提供的名称。此字段是可选字段。

    • NAMESPACE_NO_SSL_VERIFY:如需停用 SSL 证书验证,请将此字段设置为 true。默认值为 false

    如需了解字段的说明以及可添加到 spec 字段的字段的完整列表,请参阅 RepoSync 字段

    每个命名空间最多只能有一个 RepoSync 对象。如需强制执行此操作,对象的 name 必须为 repo-syncRepoSync 引用的目录中包含的所有配置也必须与 RepoSync 对象位于同一命名空间中。

  5. 应用 RepoSync 配置:

    kubectl apply -f repo-sync.yaml
    
  6. 如需验证配置,请对命名空间代码库中的一个对象使用 kubectl get。例如:

    kubectl get rolebindings -n NAMESPACE
    

验证命名空间代码库的同步状态

您可以使用 nomos status 命令检查命名空间代码库的同步状态:

nomos status

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

my_managed_cluster-1
  --------------------
  <root>   git@github.com:foo-corp/acme/admin@main
  SYNCED   f52a11e4
  --------------------
  bookstore  git@github.com:foo-corp/acme/bookstore@v1
  SYNCED     34d1a8c8

在此示例输出中,为命名空间 bookstore 配置了命名空间代码库。

验证 RepoSync 安装

当您创建 RepoSync 对象时,Config Sync 会创建一个名为 ns-reconciler-NAMESPACE 的协调器,其中 NAMESPACE 是您在其中创建了 RepoSync 对象的命名空间。

您可以通过检查 ns-reconciler-NAMESPACE Deployment 的状态来验证 RepoSync 对象是否正常运行:

kubectl get -n config-management-system deployment/ns-reconciler-NAMESPACE

NAMESPACE 替换为在其中创建了命名空间代码库的命名空间。

如需查看探索 RepoSync 对象状态的其他方法,请参阅探索 RootSync 和 RepoSync 对象

移除命名空间代码库

选择根代码库方法 (Root repository method) 或 Kubernetes API 方法 (Kubernetes API method) 标签页以查看相关说明。

根代码库方法

如果您使用的是控制根代码库中的命名空间代码库方法,则中央管理员可以按照以下两个步骤来移除命名空间代码库:

  1. 按照问题排查说明取消管理或删除由 RepoSync 对象管理的资源。

  2. 从 Git 代码库中移除 RepoSync 对象。

Kubernetes API 方法

如果您使用了通过 Kubernetes API 控制命名空间代码库方法,则应用运维人员可以按照以下两个步骤移除命名空间代码库:

  1. 按照问题排查说明取消管理或删除由 RepoSync 对象管理的资源。

  2. 通过运行以下命令删除 RepoSync 对象:

    kubectl delete -f repo-sync.yaml
    

后续步骤