如何使用Jenkins将Docker容器从Amazon ECR自动部署到Kubernetes

Mas*_*Sat 7 continuous-deployment jenkins kubernetes devops aws-ecr

这是我们的环境:

  1. 我有一个在Amazon上运行的Kubernetes集群。
  2. 在Amazon上运行的Jenkins CI / CD,可连接到私有GitLab并将我们的服务构建为Docker映像。
  3. 存储我们的Docker映像的Amazon ECR。

我的问题:

  1. Jenkins管道将新建的映像推送到ECR后,如何将映像从ECR自动部署到Kubernetes(作为Pod)?
  2. 我可以在詹金斯管道中做到这一点吗?我读了很多材料,但是找不到如何做。

还有一个像Keel这样的第三方工具,但它不支持Amazon ECR(ECR的Webhook问题)。

任何帮助,将不胜感激。

dam*_*j07 12

我有类似的工作流程,希望这可以帮助您找到方向。我正在为CI使用bitbucket管道,但是我确信Jenkins也可以正常工作。

这是我在CI流程中所做的:

  • 构建我的代码并安装依赖项
  • 创建一个具有唯一标签(commit-id)>的容器 my-cntnr:12
  • 推送至ECR
  • 卷曲牧场主API为我-POD>设置(图片:my-cntnr:12
  • Kubernates更新容器并从ECR中拉出带有标签12的容器

这是供参考的脚本:

      - composer install --no-interaction
      - docker build -t cms .
      - docker tag myrepo:latest 123456789.dkr.ecr.my-region.amazonaws.com/myrepo:$BITBUCKET_BUILD_NUMBER
      - aws ecr get-login --no-include-email --region my-region >> login.sh
      - sh login.sh
      - docker push 123456799.dkr.ecr.my-region.amazonaws.com/myrepo:$BITBUCKET_BUILD_NUMBER
      - sh .docker/workload-update.sh // my curl script calling rancher API
Run Code Online (Sandbox Code Playgroud)

注意:由于我使用的是Rancher,因此可以使用Rancher API更新Pod及其配置。


现在,对于Kubernetes的ECR凭证部分,您必须创建一个密钥(仅Kubernetes实体),此密钥是使用您的AWS ECR详细信息创建的。然后,您可以在pod.yml中将此秘密用作image-pull-secret。这将告诉k8使用密码并从ECR中提取图像

我有一个简单的脚本可以快速做到这一点。

#
# RUN me where kubectl is available,& make sure to replace account,region etc
#
ACCOUNT=123456789
REGION=my-region
SECRET_NAME=${REGION}-ecr-registry
EMAIL=email@email.com ( can be anything)

#
# Fetch token (which will expire in 12 hours)
#

TOKEN=`aws ecr --region=$REGION get-authorization-token --output text --query authorizationData[].authorizationToken | base64 -d | cut -d: -f2`

#
# Create or replace registry secret
#

kubectl delete secret --ignore-not-found $SECRET_NAME
kubectl create secret docker-registry $SECRET_NAME \
 --docker-server=https://${ACCOUNT}.dkr.ecr.${REGION}.amazonaws.com \
 --docker-username=AWS \
 --docker-password="${TOKEN}" \
 --docker-email="${EMAIL}"
Run Code Online (Sandbox Code Playgroud)

这就是您可以在pod.yml中使用它的方式

apiVersion: v1
kind: Pod                                            
metadata:
  name: my-app   
  labels:
    app: my-app                              
spec:                                                
  containers:
    - image: 123456789.dkr.ecr.my-region.amazonaws.com/my-repo
      name: -cntnr                            
      ports:
        - containerPort: 8080    
  imagePullSecrets:
  - name: my-secret-name ( this will be same as name of secret we created earlier)
Run Code Online (Sandbox Code Playgroud)

我也撰写了有关该过程的详细文章。请在这里找到它。


Nic*_*Rak 1

对的,这是可能的。您可以将 Amazon ECR 用于 Kubernetes 集群,但需要使用凭证创建密钥。您可以为 Jenkins 开发一个管道,它将自动将更新部署到您的 Kubernetes 集群。为此,您需要配置一个触发器,例如成功完成构建图像的先前管道。您可以使用kubernetes-plugin来开发管道,也可以使用新的镜像标签调用 kubectl update。您可以使用部署的默认更新或第 3 方工具(例如helm )来更新集群来更新集群。

\n\n

*更新

\n\n

有一个很好的文档:使用 AWS EC2 容器注册表。\n对于 Jenkins 和 Kubernetes,我建议您使用kube2iam,它有助于避免授权令牌过期。\n为 Kubernetes 节点和 Jenkins 创建自定义角色,也不要忘记添加为 kube2iam 分配角色的权限。

\n