[CircleCI] 使用aws-eks和kubernetes orbs来配置ECR -> EKS的滚动更新

使用CircleCI和cicleci/kubernetes orbs以及aws-eks/kubernetes orbs的组合,将推送到ECR的镜像应用于更新EKS的pods。

这是一篇针对那些使用过CicleCI的kubernetes orbs的人的文章,因为这只是我个人的笔记,所以只写了最基本的内容。如果您要参考,请补充完整。

为什么写这篇文章:
– 在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的自动化。

※需要提前建立条件,即在向分支进行push时,需要配置CicleCI进行操作。

■ 设置上下文
• 请参考设置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  

结束了。

bannerAds