本文档介绍了 Config Sync 可以用作同步来源的不同类型的可靠来源。
GitOps 工作流中的一个关键概念是“可靠来源”,即存储配置文件的中央代码库。配置文件通常是定义 Kubernetes 资源的 YAML 或 JSON 文件。通常,您可以使用 kubectl 命令行工具手动应用 Kubernetes 对象,但 Config Sync 可以从 Git 代码库等单一可靠来源自动应用这些资源。然后,Config Sync 会监控您指定的可靠来源,并将所有更改自动应用到集群。
Config Sync 可以从三种不同类型的来源同步配置文件:Git 代码库、Open Container Initiative (OCI) 映像和 Helm 图表。本文档将介绍每种来源类型以及 Config Sync 如何与它们互动。阅读本文档有助于您为自己的工作流程和环境选择最佳来源选项。
Git 代码库
Git 是一种广泛使用的版本控制和协作技术。借助 Git,您可以采用符合您需求的方式组织代码库,并在需要时获得版本控制和分支方面的优势。由于 Git 是一项被广泛采用的成熟技术,因此您在提供商和工具方面具有丰富的选择。
当您将 Config Sync 配置为使用 Git 代码库作为可靠来源时,Config Sync 会使用协调器 Pod 中的 git-sync 容器从 Git 代码库拉取配置。您可以配置代码库网址、分支和修订版本(提交或标记),以便更好地控制从 Git 代码库中的哪个位置拉取配置。
RootSync 配置示例
以下示例展示了一个从 Git 代码库同步的 RootSync 清单:
apiVersion: configsync.gke.io/v1beta1
kind: RootSync
metadata:
name: root-sync
namespace: config-management-system
spec:
sourceType: git
sourceFormat: unstructured
git:
repo: https://github.com/example/my-configs.git
revision: main
dir: cluster-configs
auth: none # replace with your authentication method such as ssh or token
period: 60s
此配置可将 Config Sync 设置为从 Git 代码库同步清单。Config Sync 会监控 https://github.com/example/my-configs.git 代码库的 main 分支中的 cluster-configs 目录,每 60 秒检查一次更新,且不使用身份验证。
使用情形示例:集中式管理
假设您是一位平台管理员,想要使用 Git 代码库在舰队的所有集群中强制执行基准政策。在这种情况下,您可能会将标准 NetworkPolicies、RoleBindings 和 ResourceQuotas 存储在名为 standard-configs 的中央 Git 代码库中。在预配新集群时,Config Sync 会配置为从 standard-configs 代码库同步,从而帮助确保所有集群从一开始就符合组织标准。
OCI 映像
OCI 映像是一种用于封装应用及其依赖项的标准格式。此方法将配置视为制品,类似于您处理容器映像的方式。这种方法具有不可变性和大规模运行速度更快等优势。借助 OCI,您可以使用容器映像基础设施和工具(例如 Artifact Registry)来管理映像,并使用 Workload Identity Federation for GKE 来帮助简化身份验证。
使用 OCI 作为配置来源通常需要一个单独的流程来将配置文件构建为 OCI 映像,然后将其推送到 Artifact Registry 等注册数据库平台。与在 Git 代码库中以文件形式存储的配置相比,这种方法的人类可读性可能较低。
当您将 Config Sync 配置为使用 OCI 映像作为可靠来源时,Config Sync 会使用协调器 Pod 中的 oci-sync 容器从注册数据库中拉取包含配置的 OCI 映像。
RootSync 配置示例
以下示例展示了一个 RootSync 清单,该清单可从 Artifact Registry 中存储的 OCI 映像同步:
apiVersion: configsync.gke.io/v1beta1
kind: RootSync
metadata:
name: root-sync
namespace: config-management-system
spec:
sourceType: oci
sourceFormat: unstructured
oci:
image: us-central1-docker.pkg.dev/my-project/my-repo/my-config-image:v1.0.0
dir: .
auth: k8sserviceaccount
此配置可将 Config Sync 设置为从 OCI 映像同步。Config Sync 通过使用 Kubernetes 服务账号进行身份验证,从 Artifact Registry 拉取 us-central1-docker.pkg.dev/my-project/my-repo/my-config-image:v1.0.0 映像。
使用情形示例:CI/CD 流水线集成
假设您想将 OCI 映像创建集成到组织的 CI/CD 流水线中。当配置文件的更改合并后,您可以设置流水线来运行验证测试(例如 nomos vet 命令)、将 YAML 文件构建为 OCI 映像,并将该映像推送到 Artifact Registry。然后,Config Sync 会自动检测新版本的映像并将其应用到您的集群,从而确保所有配置更改的推出都经过了验证并进行了版本管理。
Helm 图表
Helm 是 Kubernetes 的热门软件包管理系统,使用一种称为图表的打包格式。Config Sync 可以提取、呈现和同步 Helm 图表中定义的资源。
Helm 提供了一种一致的方式来打包和重用 Kubernetes 应用。您可以使用模板或预构建的 Helm 图表来实现一致且可重用的配置。
如果您还不熟悉 Helm,模板化和发布流程可能会增加配置管理流水线的复杂性。
当您将 Config Sync 配置为使用 Helm 图表作为可靠来源时,Config Sync 会使用协调器 Pod 中的 helm-sync 容器从 Helm 代码库(例如 Artifact Registry)或 Git 代码库拉取图表,然后呈现该图表以生成 Kubernetes 清单。或者,您也可以将 Config Sync 与 Kustomize 搭配使用来呈现 Helm 图表。如需详细了解此方法,请参阅将 Config Sync 与 Kustomize 和 Helm 搭配使用。
RootSync 配置示例
以下示例展示了一个 RootSync 清单,该清单可从 Artifact Registry 中存储的 Helm 图表同步:
apiVersion: configsync.gke.io/v1beta1
kind: RootSync
metadata:
name: root-sync
namespace: config-management-system
spec:
sourceType: helm
helm:
repo: oci://us-central1-docker.pkg.dev/my-project/my-helm-repo
chart: my-chart
version: 1.2.0
auth: gcpserviceaccount
gcpServiceAccountEmail: my-service-account@my-project.s3ns.iam.gserviceaccount.com
releaseName: my-chart-release
namespace: my-app-namespace # Namespace where the chart resources will be deployed
此配置可将 Config Sync 设置为从 OCI 代码库同步 Helm 图表。Config Sync 从 oci://us-central1-docker.pkg.dev/my-project/my-helm-repo 代码库中提取 1.2.0 版本的 my-chart 图表,并使用 my-service-account@my-project.s3ns.iam.gserviceaccount.com 服务账号进行身份验证。它可以将图表的资源部署到 my-chart-release 发布名称下的 my-app-namespace 命名空间中。
使用情形示例:部署第三方应用
假设您是应用团队的一员,想要将 Prometheus 部署到集群。您可以将 Config Sync 配置为从部署 Prometheus 的预建 Helm 图表中拉取数据。您无需手动运行 Helm 命令,只需在 Config Sync 的 RootSync 或 RepoSync 对象中定义图表来源、版本和任何自定义 values 即可。然后,Config Sync 会将部署与指定的图表版本和配置保持同步。
选择来源类型
最佳来源类型取决于您团队的现有工具、工作流和偏好设置。您可以参考下表了解每种来源类型的主要特征,以便做出明智的决定:
| 特性 | Git 代码库 | OCI 映像 | Helm 图表 |
|---|---|---|---|
| 适用场景 | 通用配置管理;灵活性;可读性 | 已纳入版本控制的不可变配置;利用容器基础设施 | 打包和分发复杂应用 |
| 可变性 | 可更改 | 不可变 | 可变(图表版本不可变,但值可以更改) |
| 回滚 | 还原提交或更改分支 | 部署之前的映像标记 | 回滚到之前的图表版本 |
| 工具 | 标准 Git 客户端、CI/CD 流水线 | Docker 或 Podman、容器注册表 | Helm CLI、Helm 代码库 |
| 性能 | 对于大型代码库,速度可能会较慢 | 速度更快,尤其是在大规模操作时 | 从图表仓库提取时速度快 |
| 身份验证 | 灵活(SSH、令牌),设置可能比较复杂 | 使用 Workload Identity Federation for GKE 进行了简化(例如,向 Artifact Registry 进行身份验证) | 使用 Workload Identity Federation for GKE 进行了简化(例如,向 Artifact Registry 进行身份验证) |
您还可以在同一集群上使用不同的来源类型来实现不同的目的。例如,集群可能具有以下配置:
- 从 Git 代码库进行的
RootSync同步,该代码库包含平台团队管理的基本集群级资源和政策。 - 在特定命名空间中从 Helm 图表 进行的
RepoSync同步,用于部署由应用团队管理的 Redis 实例。 - 在其他命名空间中从 OCI 映像进行的
RepoSync同步,该映像包含由单独的 CI/CD 流程构建的一组特定于应用的配置。