关于可信来源

本文档介绍了 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 代码库在舰队的所有集群中强制执行基准政策。在这种情况下,您可能会将标准 NetworkPoliciesRoleBindingsResourceQuotas 存储在名为 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 的 RootSyncRepoSync 对象中定义图表来源、版本和任何自定义 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 流程构建的一组特定于应用的配置。

后续步骤