Config Sync 概览

Config Sync 是一种开源工具,可让集群操作员和平台管理员部署一致的配置和政策。您可以将这些配置和政策部署到各个 Kubernetes 集群、跨混合云和多云端环境的多个集群以及集群内的多个命名空间。此过程可大规模地简化并自动执行配置和政策管理。借助 Config Sync,开发团队可以独立管理集群内的命名空间,同时仍受管理员设置的政策保护措施的约束。

Config Sync 使用与 Kubernetes 本身相同的原则,可以使用一组集中的 Kubernetes 声明式配置文件(称为配置)来持续协调已注册集群的状态。您可以将配置存储在一个或多个 Git 代码库中,但如果您不想使用 Git 代码库,则可以创建 OCI 映像预览版)。借助此 GitOps 方法(有时也称为“配置即代码”),您可以通过一个可审核、事务性、可查看且受版本控制的流程来管理和部署通用配置。

在下图中,平台管理员通过将配置应用于集群和集群中的命名空间,为三个不同的集群创建一致的配置:

平台管理员将多个配置部署到他们的集群

Config Sync 的优势

以下要点重点说明了 Config Sync 提供的一些优势:

  • 降低“影子操作”的风险:如果未经检查的更改被推送到活跃集群,则可能很难了解记录的配置与您的实际环境之间的差异。您可以要求使用 Config Sync 应用所有集群配置更改,锁定对 Kubernetes API 的直接访问,并将更改追溯到 Git 中的可靠来源。
  • 使用 GitOps 最佳做法:在将任何更改推送到您的实际环境之前,您可以使用您偏好的任何代码库管理工具进行代码审核。使用 Config Sync 准确审核是哪些更改导致了配置更改。
  • 减少因与配置相关的中断导致的停机时间:借助 Config Sync,您可以使用“还原并调查”策略来回滚重大更改,在修复有问题的更改并将其作为新提交的更改应用之前,使实时集群恢复到良好的工作状态。
  • 使用持续集成/持续部署 (CI/CD) 流水线:您可以使用 CI/CD 工作流使用您喜欢的任何工具和格式来渲染配置、测试并验证更改,并在测试通过后自动提交它们。然后,Config Sync 会应用更改,随后监控和修正配置偏差。

了解 Config Sync

前提条件

Config Sync 使用命名空间标签注解作为其实现的核心部分。在开始使用该产品之前,充分了解这些概念会很有帮助。

配置集群

借助 Config Sync,您可以创建一组通用的配置和集群级层政策(例如政策控制器限制条件),并在已注册和已连接的集群中根据 Git 中的单一可靠来源应用这些政策。您需要先创建配置和代码库,然后才能配置集群。

配置

配置是用 YAML 或 JSON 编写的 Kubernetes 配置声明。Config Sync 会读取配置并将其应用于一个或多个集群,以在这些集群中创建或配置 Kubernetes 对象或资源,或者提供 Config Sync 本身需要的信息。配置可以包含您可使用 kubectl editkubectl apply 应用于 Kubernetes 集群的任何配置详细信息。您也可以在单个文件中声明多个配置。 Config Sync 读取三种类型的文件:.yaml.yml.json。具有其他后缀的文件会被忽略。

在编写配置之前,您应该了解 Kubernetes 对象以便为它们编写配置。

如需了解详情,请参阅将配置添加到 Git 代码库创建配置

代码库

代码库(或 repo)是存储配置的 Git 代码库,其中包括 Config Sync 本身的配置。配置 Config Sync 时,您可以配置代码库、分支和子目录,以便 Config Sync 监控其是否发生更改。

借助 Config Sync,您可以将多个代码库中的配置同步到同一组集群。在 Config Sync 中,您可以使用每个代码库的 Git 引用(Git 网址、代码库分支、提交或标记和目录)来引用代码库。此配置会分离不同团队的配置部署生命周期。它还让您可以更自主地选择要布置代码库的位置以及如何进行构建。

您可以创建两种类型的代码库:根代码库和命名空间代码库:

  • 根代码库:通过根代码库,您可以同步集群级命名空间级的配置。根代码库使用管理员级凭据对应用命名空间强制执行政策,并替换从配置中声明的状态偏移的本地更改。根代码库通常由中央管理员管理。

    您可以为根代码库使用两种不同的结构:

    • 非结构化:使用非结构化源格式,您可以以最方便的方式组织代码库中的配置。如果您使用 kustomizekpthelm 等工具组织和/或生成配置,则此格式尤为有用。对于大多数用户而言,非结构化格式是推荐的格式;在通过 Google Cloud Console 配置 Config Sync 时,该格式是默认格式。如需了解详情,请参阅使用非结构化代码库
    • 分层或结构化源格式会将配置分成不同的类别,分别用于系统配置、集群元数据、集群级层配置和命名空间配置,以帮助您组织配置。它还支持基于目录结构跨多个命名空间的配置分层继承,如需了解详情,请参阅配置命名空间部分。如果未在清单中指定 sourceFormat,则分层格式是 Config Sync 的默认代码库格式。如需了解详情,请参阅分层代码库概览

    如需了解如何配置根代码库,请参阅安装 Config Sync

  • 命名空间代码库:命名空间代码库为可选项,可以包含同步到集群中特定命名空间的命名空间级配置。您可以将命名空间代码库的设置和控制权委派给非管理员用户。命名空间代码库必须使用非结构化代码库格式

下图简要介绍了团队如何将他们的集群同步到单个根代码库(由管理员管理)和多个命名空间代码库(由应用运维人员管理):

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

在上图中,中心管理员管理组织的集中式基础架构,并对集群和组织中的所有命名空间强制执行政策。负责管理实时部署的应用运维人员将配置应用于其处理的命名空间中的应用。

映像

从 Anthos Config Management 1.12.0 版及更高版本开始,您可以将 Config Sync 配置为从 OCI 映像同步。您可以将映像存储在 Artifact RegistryContainer Registry 中。如需使用此功能,您必须启用 RootSync API 和 RepoSync API

配置多个集群

Config Sync 可帮助您跨混合云和多云端环境的多个集群部署一致的配置和政策。

Config Sync 可为您提供以下选项,从而帮助您配置多个集群:

  • 您可以通过 Git 将配置更改编排部署到集群队列,而无需手动重复运行 kubectl apply 命令。如需了解详情,请参阅使用 Anthos Config Management 安全发布
  • 确保根据应用于每个集群的元数据,将更改推送到每个相关集群,并且仅推送到相关集群。如需了解详情,请参阅仅配置部分集群。对于非结构化分层代码库格式,集群元数据的管理方式略有不同。

我们强烈建议您注册集群。注册集群有助于通过 Google Cloud Console 观察所有集群的当前状态,并且可以跨已注册的集群集中配置和管理 Config Sync。有关详情,请参阅注册集群配置 Config Sync升级 Config Sync 版本

配置命名空间

使用 Config Sync 配置命名空间可为您提供以下功能:

  • 您可以通过跨已注册和已连接的集群,一致地使用使用命名空间范围的政策(例如 RBAC 角色)来预配 Kubernetes 命名空间。命名空间范围的政策可让您更轻松地在集群中实现和管理多租户
  • 将政策应用于多个相关的命名空间,而无需复制配置,并且能够替换或扩展一个指定命名空间或一组命名空间的配置,从而更轻松地跨租户应用一致的政策。

这些功能在非结构化分层代码库格式中的工作方式略有不同。

利用非结构化代码库,您可以使用层次结构控制器,在您为集群定义的命名空间层次结构中传播政策。如需了解详情,请参阅层次结构控制器概览

借助分层代码库,您可以使用称为“抽象命名空间”的命名空间组来控制应传播到哪些命名空间政策。抽象命名空间需要在代码库的目录树中以分层方式组织命名空间。如需了解详情,请参阅配置命名空间和命名空间级对象以及命名空间继承概览

非结构化和分层格式都还支持使用标签选择器定位非分层命名空间集。

nomos 命令

Config Sync 提供了一个 API。nomos(Windows 上的 nomos.exe)命令会使用 API、检查安装状态并验证配置

如需了解详情,请参阅使用 nomos 命令行工具

Config Sync RBAC/权限

以下部分列出了 Config Sync 及其组件在集群级层具有正确访问权限所需的权限。列出的权限默认处于启用状态,并且在 Config Sync 工作时不应停用这些权限。

组件 命名空间 服务帐号 权限 说明
reconciler-manager config-management-system reconciler-manager cluster-admin reconciler-manager 必须是 cluster-admin,以便预配根协调器并为根协调器创建 ClusterRoleBinding
root reconcilers config-management-system 根协调器的名称 cluster-admin 根协调器必须是 cluster-admin 才能应用集群级资源和自定义资源
namespace reconcilers config-management-system 命名空间协调器的名称 configsync.gke.io:ns-reconciler 命名空间协调器需要获取或更新 RepoSync 和 ResourceGroup 对象及其状态的权限
resource-group-controller-manager config-management-system resource-group-sa resource-group-manager-role resource-group-leader-election-role resource-group-controller-manager 需要这些角色以便检查对象状态并启用领导者选举
admission-webhook config-management-system admission-webhook cluster-admin 准入网络钩子必须是 cluster-admin 才能拒绝对集群上任何对象的请求。
importer config-management-system importer cluster-admin importer 必须是 cluster-admin 才能设置 RBAC 权限,这是由于用户的限制,必须拥有权限来设置它。

命名空间协调器的 RBAC

以下 API 定义显示了命名空间协调器的访问权限控制。

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: configsync.gke.io:ns-reconciler
  labels:
    configmanagement.gke.io/system: "true"
    configmanagement.gke.io/arch: "csmr"
rules:
- apiGroups: ["configsync.gke.io"]
  resources: ["reposyncs"]
  verbs: ["get"]
- apiGroups: ["configsync.gke.io"]
  resources: ["reposyncs/status"]
  verbs: ["get","list","update"]
- apiGroups: ["kpt.dev"]
  resources: ["resourcegroups"]
  verbs: ["*"]
- apiGroups: ["kpt.dev"]
  resources: ["resourcegroups/status"]
  verbs: ["*"]
- apiGroups:
  - policy
  resources:
  - podsecuritypolicies
  resourceNames:
  - acm-psp
  verbs:
  - use

资源组控制器的 RBAC

以下 API 定义显示了资源组控制器的访问控制权限。

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  creationTimestamp: null
  labels:
    configmanagement.gke.io/arch: "csmr"
    configmanagement.gke.io/system: "true"
  name: resource-group-manager-role
rules:
# This permission is needed to get the status for managed resources
- apiGroups:
  - '*'
  resources:
  - '*'
  verbs:
  - get
  - list
  - watch
# This permission is needed to watch/unwatch types as they are registered or removed.
- apiGroups:
  - apiextensions.k8s.io
  resources:
  - customresourcedefinitions
  verbs:
  - get
  - list
  - watch
# This permission is needed so that the ResourceGroup controller can reconcile a ResourceGroup CR
- apiGroups:
  - kpt.dev
  resources:
  - resourcegroups
  verbs:
  - create
  - delete
  - get
  - list
  - patch
  - update
  - watch
# This permission is needed so that the ResourceGroup controller can update the status of a ResourceGroup CR
- apiGroups:
  - kpt.dev
  resources:
  - resourcegroups/status
  verbs:
  - get
  - patch
  - update
# This permission is needed so that the ResourceGroup controller can work on a cluster with PSP enabled
- apiGroups:
  - policy
  resourceNames:
  - acm-psp
  resources:
  - podsecuritypolicies
  verbs:
  - use
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  labels:
    configmanagement.gke.io/arch: "csmr"
    configmanagement.gke.io/system: "true"
  name: resource-group-leader-election-role
  namespace: resource-group-system
rules:  // The following permissions are needed so that the leader election can work
- apiGroups:
  - ""
  resources:
  - configmaps
  verbs:
  - get
  - list
  - watch
  - create
  - update
  - patch
  - delete
- apiGroups:
  - ""
  resources:
  - configmaps/status
  verbs:
  - get
  - update
  - patch
- apiGroups:
  - ""
  resources:
  - events
  verbs:
  - create
- apiGroups:
  - coordination.k8s.io
  resources:
  - leases
  verbs:
  - '*'

后续步骤