如何在.gitlab-ci.yml中同时使用AWS CLI与kubectl?
GitLab CI中连接EKS并重启Deployment的解决方案
一、解决工具共存的核心问题
你遇到的entrypoint报错和无法安装AWS CLI的问题,本质是kubectl镜像默认entrypoint为kubectl,导致无法直接执行bash/apk命令。只需覆盖entrypoint为bash,就能在同一个job里同时使用AWS CLI和kubectl:
方案1:基于kubectl镜像安装AWS CLI
deploy_to_eks: image: bitnami/kubectl:latest # 覆盖默认entrypoint,允许执行bash命令 entrypoint: ["bash", "-c"] before_script: # 安装AWS CLI(alpine系统用apk) - apk add --no-cache aws-cli # 配置EKS集群kubeconfig - aws eks update-kubeconfig --region ${AWS_REGION} --name ${EKS_CLUSTER_NAME} script: # 重启指定Deployment - kubectl rollout restart deployment/${DEPLOYMENT_NAME} -n ${K8S_NAMESPACE} # 配置CI变量(建议在GitLab项目CI/CD变量中设置,避免硬编码) variables: AWS_REGION: "your-aws-region" EKS_CLUSTER_NAME: "your-eks-cluster-name" DEPLOYMENT_NAME: "your-target-deployment" K8S_NAMESPACE: "default" only: - main # 按需触发分支
方案2:基于AWS CLI镜像安装kubectl
如果更习惯用AWS官方镜像,也可以反过来操作:
deploy_to_eks: image: public.ecr.aws/aws-cli/aws-cli:latest before_script: # 安装kubectl - curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" - install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl # 配置EKS集群kubeconfig - aws eks update-kubeconfig --region ${AWS_REGION} --name ${EKS_CLUSTER_NAME} script: - kubectl rollout restart deployment/${DEPLOYMENT_NAME} -n ${K8S_NAMESPACE} variables: # 同上配置变量
二、更简便的重启方式
如果不想手动处理工具安装,还可以:
- 使用预集成工具的镜像:比如
alpine/k8s,内置kubectl、helm等工具,只需安装AWS CLI即可 - 利用GitLab Runner的IAM角色:如果你的GitLab Runner部署在AWS EC2上,给EC2实例附加能访问EKS的IAM角色,无需在CI中配置AWS密钥,直接执行
aws eks update-kubeconfig即可
注意事项
- 确保CI job拥有足够的AWS权限:需要
eks:DescribeCluster权限(更新kubeconfig),以及EKS集群中对Deployment的rollout权限 - AWS密钥建议通过GitLab项目的CI/CD变量设置为受保护变量,避免泄露
内容的提问来源于stack exchange,提问作者Kasper Kooijman
相关产品推荐
相关产品推荐

