持续集成 ¶
使用 kOps 的声明式清单,可以在 CI 环境中完全创建和管理集群。与其使用 kops create cluster
和 kops edit cluster
,不如将集群和实例组清单存储在版本控制中。这允许通过可审查的提交来进行集群更改,而不是在本地工作站上进行。对于大型团队来说,这是理想的选择,以避免同时进行更改可能导致的冲突。它还为运行的任何 kOps 命令提供审计跟踪、一致的环境和集中视图。
在 CI 环境中运行 kOps 对于升级 kOps 也很有用。只需在 CI 环境中下载较新版本并运行新的管道即可。这将允许在应用任何更改之前对其进行审查。此策略可以扩展到顺序地升级多个集群上的 kOps,从而允许首先在非生产环境中测试更改。
本页提供在 CI 环境中管理 kOps 集群的示例。该清单文档描述了如何在本地创建 YAML 清单文件,并包括对下面描述的命令的高级示例。
如果您有针对不同 CI 平台或部署策略的解决方案,请随时提交拉取请求!
GitLab CI ¶
GitLab CI 内置于 GitLab,并允许提交触发 CI 管道。
需求 ¶
- 运行作业的 GitLab 运行器需要适当的权限才能调用 kOps 命令。对于 AWS 中的集群,这意味着要提供 AWS IAM 凭据,要么使用设置为项目中秘密变量的 IAM 用户密钥,要么让运行器在附加了实例配置文件的 EC2 实例上运行。
示例工作流程 ¶
- 集群管理员对集群清单进行更改,提交并推送到 GitLab 上的分支,并打开合并请求
- 审查人员审查更改,以确认它按预期进行,并批准或合并 MR
- 从此合并提交触发“主”管道,该管道运行
kops update cluster
。 - 管理员审查
dryrun
作业的输出,以确认所需的更改,并启动运行kops update cluster --yes
的update
作业。 - 集群更新后,将运行
kops rolling-update cluster
,可用于确认需要替换的任何节点。然后,管理员启动运行kops rolling-update cluster --yes
并根据需要替换任何节点的roll
作业。
# .gitlab-ci.yml
stages:
- dryrun
- update
- roll
variables:
KOPS_CLUSTER_NAME: ...
KOPS_STATE_STORE: ...
dryrun:
stage: dryrun
only:
- master@namespace/project_name
script:
- kops replace --force -f cluster.yml
- kops update cluster
update:
stage: update
only:
- master@namespace/project_name
when: manual
script:
- kops update cluster --yes
- kops rolling-update cluster
roll:
stage: roll
only:
- master@namespace/project_name
when: manual
script:
- kops rolling-update cluster --yes
注意事项 ¶
- 每个作业中的
only:
字段需要更新,以反映实际项目的命名空间和名称。这两个变量也需要设置为实际值。 - 对集群进行实际更改的作业是手动调用的 (
when: manual
),但这很容易删除,使其自动执行。 - 此管道设置将在适当的位置创建和更新现有集群。它不执行多个集群的“蓝绿”部署。
- 可以通过为每个阶段为每个集群创建单独的作业来扩展管道以支持多个集群。确保为每组作业正确设置
KOPS_CLUSTER_NAME
变量。
在这种情况下,可以使用 kops toolbox template
来管理一个 YAML 模板和每个集群的值文件,用于渲染模板。有关更多信息,请参阅集群模板文档。kops toolbox template
随后会在 kops replace
之前运行。
限制 ¶
- 此管道没有真正的“dryrun”作业,该作业可以在非主分支上运行,例如在合并请求合并之前。这是因为在
kops update cluster
之前所需的kops replace
将更新状态存储中的活动资产,这可能会影响下载这些资产的新启动节点。PR #6465 添加了在kops replace
之前将状态存储复制到本地文件系统的支持,从而允许 dryrun 管道与活动状态存储完全隔离。例如,首先运行aws s3 sync "$KOPS_STATE_STORE"/"$CLUSTER_NAME" /some/local/path/"$CLUSTER_NAME" --exclude '*backups/*' --quiet
,然后将--state /some/local/path
传递给kops replace
和kops update cluster
。