舰队软件包简介

本页面介绍了舰队软件包、FleetPackage API 以及它们与 Config Sync 的关系。

FleetPackage 是一种声明性 API,可让您管理整个舰队中的软件包。舰队软件包是一组用于定义集群配置的 Kubernetes YAML 清单。通过使用舰队软件包,您可以一次性或逐步向注册到舰队的集群部署软件包。

对于每个 FleetPackage 对象,您只需定义一次,之后便可使用新修订版本更新相应软件包。应用新修订版本时,舰队软件包服务会获取这些更改并将其部署到您的集群。

优势

使用舰队软件包向注册到舰队的所有集群部署 Kubernetes 资源。创建并应用舰队软件包后,该软件包会自动将 Git 代码库中的 Kubernetes 配置文件部署到新集群。舰队软件包基于 Config Sync 构建,除了 Config Sync 的优势(例如自动漂移校正)之外,还提供以下独特优势:

  • 自动发布资源:设置舰队软件包后,舰队软件包服务会自动在所有集群上部署该软件包指向的 Kubernetes 资源。

  • 自动配置新集群:如果您配置了舰队软件包,之后向舰队添加新集群,则舰队软件包定义的任何资源都会自动部署到该新集群。

  • 大规模管理 Kubernetes 配置:使用舰队软件包将资源部署到整个集群舰队,而无需逐个管理集群。

  • 最大限度降低错误更改造成的影响:选择一次性为尽可能多的集群部署资源。您可以密切监控每个集群的更改,确保错误的更改不会影响整个舰队。

  • 简化 Config Sync 配置:舰队软件包使用 Cloud Build 向 Git 进行身份验证,这意味着您只需为每个项目进行一次身份验证,而无需为每个 RootSyncRepoSync 对象进行一次身份验证。

如果您的应用场景符合以下一项或多项描述,则您可能会更倾向于将 Config Sync 与 RootSyncRepoSync 对象搭配使用,而不是使用舰队软件包:

  • 您管理的集群数量较少。

  • 您需要对资源部署到集群的方式进行更精细的控制,而舰队软件包 API 通过标签和变体提供的控制功能无法满足您的需求。

要求和限制

  • 配置舰队软件包时,仅支持将 Git 代码库作为可信来源

  • 存储在 Git 中的 Kubernetes 资源必须代表资源的最终状态。不支持用于转换存储在 Git 中的资源的其他叠加层。如需详细了解这些资源之间的差异,请参阅最佳实践:创建 WET 代码库

  • FleetPackage API 仅在 us-central1 区域提供。您仍然可以部署到其他区域中的集群,但必须在 us-central1 中设置 Cloud Build 并配置 gcloud CLI。

架构

您可以使用 FleetPackage API 将 Kubernetes 清单部署到集群舰队。FleetPackage API 使用 Cloud Build 从 Git 代码库同步和提取 Kubernetes 资源。然后,舰队软件包服务会将这些资源部署到您的集群。

显示 Git 同步中 Kubernetes 资源部署到集群舰队的流程示意图

应用场景示例

您可以使用舰队软件包将资源从 Git 代码库部署到整个集群舰队。您还可以配置舰队软件包,以控制部署资源的方式、位置和类型。

以下部分展示了不同的 FleetPackage 配置示例。如需详细了解如何应用舰队软件包,请参阅部署舰队软件包

部署到舰队中的所有集群

以下 FleetPackage 使用滚动策略一次性将 Kubernetes 资源部署到三个集群,并且后续会部署到舰队中的所有集群:

resourceBundleSelector:
  cloudBuildRepository:
    name: projects/my-project/locations/us-central1/connections/my-connection/repositories/my-repo
    tag: v1.0.0
    serviceAccount: projects/my-project/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com
target:
  fleet:
    project: projects/my-project
rolloutStrategy:
  rolling:
    maxConcurrent: 3

部署到部分集群

以下 FleetPackage 使用标签选择器将 Kubernetes 资源仅部署到舰队中成员资格标签 country"us" 匹配的集群:

resourceBundleSelector:
  cloudBuildRepository:
    name: projects/my-project/locations/us-central1/connections/my-connection/repositories/my-repo
    tag: v1.0.0
    serviceAccount: projects/my-project/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com
target:
  fleet:
    project: projects/my-project
    selector:
      matchLabels:
        country: "us"
rolloutStrategy:
  rolling:
    maxConcurrent: 3

将变体资源部署到集群

在此示例中,您的 Git 代码库中有一个名为“deployments”的文件夹,其中包含两个不同的部署规范:

副本数量:3

    # small.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
      labels:
        app: nginx
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx:1.14.2
            ports:
            - containerPort: 80
    

副本数量:10

    # large.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
      labels:
        app: nginx
    spec:
      replicas: 10
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx:1.14.2
            ports:
            - containerPort: 80
    

您可以使用这些变体根据需要向不同的集群部署“小型”或“大型”部署。每个集群都有一个标签,即 nginx-size=smallnginx-size=large

此示例中的 FleetPackage 将类似于以下内容:

resourceBundleSelector:
  cloudBuildRepository:
    name: projects/my-project/locations/us-central1/connections/my-connection/repositories/my-repo
    tag: v1.0.0
    serviceAccount: projects/my-project/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com
    path: deployments
    variantsPattern: "*.yaml"
rolloutStrategy:
  rolling:
    maxConcurrent: 2
target:
  fleet:
    project: projects/my-project
variantSelector:
  variantNameTemplate: ${membership.labels['nginx-size']}

后续步骤

部署舰队软件包