web-dev-qa-db-ja.com

Jenkinsを使用してAmazon ECRからKubernetesにDockerコンテナーを自動デプロイする方法

これが私たちの環境です。

  1. AmazonでKubernetesクラスターを実行しています。
  2. プライベートGitLabに接続し、Dockerイメージとしてサービスを構築するAmazonで実行されているJenkins CI/CD。
  3. Dockerイメージを保存するAmazon ECR。

私の質問:

  1. Jenkinsパイプラインが新しく作成されたイメージをECRにプッシュしたら、ECRからKubernetesにイメージを(ポッドとして)自動的に展開できますか?
  2. Jenkinsパイプライン内でそれを行うことはできますか?たくさんの資料を読みましたが、どうすればいいのかわかりませんでした。

Keel のようなサードパーティのツールもありますが、Amazon ECR(ECRでのWebhookの問題)はサポートしていません。

任意の助けをいただければ幸いです。

7
MasoudSat

同様のワークフローがあり、これが何らかの方向性の獲得に役立つことを願っています。私はCIにbitbucketパイプラインを使用していますが、Jenkinsも同様に動作するはずです。

これは、CIフローで行うことです。

  • コードをビルドして依存関係をインストールする
  • 一意のタグ(commit-id)を持つコンテナーを作成します> my-cntnr:12
  • ECRにプッシュ
  • My-podのCurl Rancher API> set(image: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

注:Rancherを使用しているため、Rancher APIを使用してポッドとその構成を更新できます。


次に、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 protected] ( 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}"

そして、これが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)

プロセスについての詳細な記事も書いています。それを見つけてください こちら

12
damitj07

環境間のプロモーションのためにGitOpsを使用してKubernetesの複数の環境でCI/CDを自動化し、プルリクエストで環境をプレビューする方法を確認したい場合は、チェックアウトしたいかもしれません DevOxx UKでのJenkins Xに関する最近の講演 ここでこれをGKEでライブデモします。 Jenkins Xは AWS、AKS、GKE、およびその他のkubernetesクラスター で動作しますが。

マスターブランチへの変更をマージすると、 Jenkins X はアプリの新しいセマンティックバージョン管理されたディストリビューション(pom.xml、jar、docker image、helmチャート)を作成します。その後、パイプラインはプルリクエストの生成を自動化し、GitOpsを介してすべての環境でアプリケーションを宣伝します。その後、アプリのリリースパイプラインの完了後にバージョンをロールバックすることを決定できます(環境パイプラインもあるため)。

1
James Strachan

はい、可能です。 KubernetesクラスターにAmazon ECRを使用できますが、 認証情報でシークレットを作成する が必要です。 Kubernetesクラスターに更新を自動的に展開するJenkinsのパイプラインを開発できます。このためには、トリガーを構成する必要があります。たとえば、イメージを構築する前のパイプラインが正常に完了したなどです。 kubernetes-plugin を使用してパイプラインを開発するか、新しいイメージタグでkubectl updateを呼び出すことができます。 helm など、展開用のデフォルト更新またはサードパーティツールを使用してクラスターを更新できます。

* updates

良いドキュメントがあります: AWS EC2 Container Registryを使用 JenkinsとKubernetesの場合、 kube2iam を使用することをお勧めします。これは、認証トークンの期限切れを回避するのに役立ちます。 KubernetesノードとJenkinsのカスタムロールを作成します。また、kube2iamのロールを割り当てる権限を追加することを忘れないでください。

0
Nick Rak