[CircleCI] 使用aws-eks和kubernetes orbs来配置ECR -> EKS的滚动更新
使用CircleCI和cicleci/kubernetes orbs以及aws-eks/kubernetes orbs的组合,将推送到ECR的镜像应用于更新EKS的pods。
为什么写这篇文章:
– 在2021年12月8日的更新中,kubeconfig的dry-run从bool值变为了只支持string值。
由于这一改变,导致之前使用的ECR镜像推送->EKS自动滚动更新的流水线被破坏,因此需要重新配置,故进行了调查。
为什么EKS的自动更新停止工作了?
使用`aws-eks orbs`中的`[update-kubeconfig-with-authenticator]`命令可以设置dry-run,但只允许设置布尔值。默认值为’false’。
由于执行了aws-eks orbs的[update-container-image]命令的dry-run选项为false,因此出现错误:不允许使用bool值,而应该使用”none”、”server”或”client”这样的string值。
■探索中的解决方法:
我认为aws-eks/kubernetes orbs的[update-container-image]命令只能在工作流中声明,但通过与circleci/kubernetes orbs的配置结合使用,可以尝试在作业中声明。
什么情况下使用:
– 当想要指定kubectl的版本时
– 当想要使用jobs生成的变量时
– 当Kubernetes有更新且更新反映到aws-eks/orbs较慢时
⬆︎ 这是我考虑要做的原因。
使用AWS-EKS的aws-eks/kubernetes orbs工具,通过指定AWS的地区和EKS的集群名称,可以将cicleci/kubernetes的orbs执行目标指向AWS。只需执行命令,即可实现ECR到EKS的自动化。
■ 设置上下文
• 请参考设置CicleCI环境变量的方法来设置所需的环境变量以访问AWS资源。
※参考网址中给出的是项目环境变量的设置方法,但后续的代码中将使用上下文。
在使用该上下文时,预定义变量将自动在命令执行时加载。
https://circleci.com/docs/ja/2.0/ecs-ecr/
\${AWS_ACCESS_KEY_ID}:用于访问ECR、EKS的AWS访问密钥
\${AWS_SECRET_ACCESS_KEY}:用于访问ECR、EKS的AWS密钥
・请给这个参数赋予一个你喜欢的变量名,因为它将用于执行命令的参数值。
\${AWS_REGION}:AWS的区域名称
\${AWS_ECR_REPOSITORY_NAME}:AWS ECR的仓库名称
\${AWS_EKS_CLUSTER_NAME}:AWS EKS的集群名称
■ CircleCI的预定义变量
\${CIRCLE_SHA1}:当注册到ECR存储库时生成的唯一摘要值
1. 在AWS EKS上配置认证器。
为了将后续的cicleci/kubernetes指向AWS,您需要将AWS的认证信息等内容配置到上述上下文中。
参考链接:
https://circleci.com/developer/ja/orbs/orb/circleci/aws-eks?version=1.1.0#jobs-update-container-image
2. 在Kubernetes中声明命令(例如通过kubectl set image对EKS进行滚动更新)。
参考链接为:https://circleci.com/developer/orbs/orb/circleci/kubernetes?version=1.0.1#commands-update-container-image
以下为代码片段。详细信息请参见注释。
使用光环
orbs:
node: circleci/node@3.0.0
aws-ecr: circleci/aws-ecr@7.0.0 # イメージをECRへpushする
aws-eks: circleci/aws-eks@1.1.0 # ECRリポジトリに登録されているイメージでEKSを更新する
kubernetes: circleci/kubernetes@1.0.1 # authenticator を設定する
工作①:使用aws-ecr/build-and-push-image将镜像推送到ECR
ecr-push-image:
executor: aws-ecr/default
steps:
- checkout
# - https://circleci.com/developer/orbs/orb/circleci/aws-ecr
- aws-ecr/build-and-push-image:
repo: ${AWS_ECR_REPOSITORY_NAME}
tag: ${CIRCLE_SHA1}
工作②:将推送到ECR存储库的镜像反映到EKS上。
eks-update-container-image:
executor: aws-eks/python3
steps:
# 不意なkubernetesのアップデートでorbsの更新が間に合っていない時などに,
# 過去のバージョンでkubectlのバージョンを指定することも可能。
# - kubernetes/install-kubectl:
# kubectl-version: "1.22"
- aws-eks/update-kubeconfig-with-authenticator: # AWS-EKSのorbs
cluster-name: "${AWS_EKS_CLUSTER_NAME}"
aws-region: "${AWS_REGION}"
install-kubectl: true
- kubernetes/update-container-image: # kubernetesのorbs
resource-name: deployment/web # yamlのリソース名
namespace: web # pods の名前空間
# `kubectl set image`を介してリソースに適用するコンテナイメージの更新のARN
container-image-updates: "web=${リポジトリ名など}:${CIRCLE_SHA1}"
show-kubectl-command: true # CircleCIにkubectlのコマンドログを残す
get-rollout-status: false # check the rollout successfully
dry-run: "none" # 2021-12-08より、bool値が廃止されstring値になった
工作流程:记录工作的执行顺序
- ecr-push-image: # job①
context: context # jobで使用するコンテキストの名前を指定する
filters: # フィルターを使用すると特定のブランチのプッシュ時のみ実行する
branches:
only: dev # ブランチ名
- eks-update-container-image: # job②
context: context
filters:
branches:
only: dev
requires: # 指定したworkflowが完了してから実行するように順序を指定する
- ecr-push-image
结束了。