本页面介绍了舰队软件包、FleetPackage
API 以及它们与 Config Sync 的关系。
FleetPackage
是一种声明性 API,可让您管理整个舰队中的软件包。舰队软件包是一组用于定义集群配置的 Kubernetes YAML 清单。通过使用舰队软件包,您可以一次性或逐步向注册到舰队的集群部署软件包。
对于每个 FleetPackage
对象,您只需定义一次,之后便可使用新修订版本更新相应软件包。应用新修订版本时,舰队软件包服务会获取这些更改并将其部署到您的集群。
优势
使用舰队软件包向注册到舰队的所有集群部署 Kubernetes 资源。创建并应用舰队软件包后,该软件包会自动将 Git 代码库中的 Kubernetes 配置文件部署到新集群。舰队软件包基于 Config Sync 构建,除了 Config Sync 的优势(例如自动漂移校正)之外,还提供以下独特优势:
自动发布资源:设置舰队软件包后,舰队软件包服务会自动在所有集群上部署该软件包指向的 Kubernetes 资源。
自动配置新集群:如果您配置了舰队软件包,之后向舰队添加新集群,则舰队软件包定义的任何资源都会自动部署到该新集群。
大规模管理 Kubernetes 配置:使用舰队软件包将资源部署到整个集群舰队,而无需逐个管理集群。
最大限度降低错误更改造成的影响:选择一次性为尽可能多的集群部署资源。您可以密切监控每个集群的更改,确保错误的更改不会影响整个舰队。
简化 Config Sync 配置:舰队软件包使用 Cloud Build 向 Git 进行身份验证,这意味着您只需为每个项目进行一次身份验证,而无需为每个
RootSync
或RepoSync
对象进行一次身份验证。
如果您的应用场景符合以下一项或多项描述,则您可能会更倾向于将 Config Sync 与 RootSync
或 RepoSync
对象搭配使用,而不是使用舰队软件包:
您管理的集群数量较少。
您需要对资源部署到集群的方式进行更精细的控制,而舰队软件包 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 代码库部署到整个集群舰队。您还可以配置舰队软件包,以控制部署资源的方式、位置和类型。
以下部分展示了不同的 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=small
或 nginx-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']}