web-dev-qa-db-fra.com

Comment déployer automatiquement les conteneurs Docker d'Amazon ECR vers Kubernetes à l'aide de Jenkins

Ceci est notre environnement:

  1. J'ai un cluster Kubernetes en cours d'exécution sur Amazon.
  2. Jenkins CI/CD exécuté sur Amazon qui se connecte à un GitLab privé et construit nos services en tant qu’images Docker.
  3. Amazon ECR qui stocke nos images Docker.

Mes questions:

  1. Comment puis-je déployer automatiquement des images d'ECR vers Kubernetes (en tant que pods) une fois que le pipeline Jenkins envoie les images nouvellement créées vers ECR?
  2. Puis-je faire cela dans le pipeline Jenkins? J'ai lu beaucoup de documents, mais je ne trouvais pas comment faire.

Il existe également un outil tiers comme Keel mais il ne prend pas en charge Amazon ECR (problème Webhook avec ECR).

Toute aide serait appréciée. 

3
MasoudSat

J'ai un flux de travail similaire et j'espère que cela vous aide à obtenir des indications. J'utilise bitbucket pipeline pour CI, mais je suis sûr que Jenkins fonctionnera également correctement.

Voici ce que je fais dans mon flux de CI:

  • Construire mon code et installer des dépendances
  • Créez un conteneur avec une balise unique (commit-id)> my-cntnr:12
  • Push to ECR
  • API Curl Rancher pour my-pod> set (image: my-cntnr:12)
  • Kubernates met à jour le pod et tire le conteneur avec l'étiquette 12 d'ECR

Voici le script pour référence: 

      - 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

remarque: depuis que j'utilise Rancher, je peux utiliser l'API Rancher pour mettre à jour les pods et leur configuration.


Maintenant, pour la partie des informations d'identification ECR pour Kubernetes, vous devez créer un secret (une entité réservée à Kubernetes). Ce secret est créé à l'aide de vos détails AWS ECR. Ensuite, vous pouvez utiliser ce secret dans votre pod.yml comme image-pull-secret. Cela indiquera à k8 d’utiliser le secret et de tirer l’image de la caisse enregistreuse électronique.

J'ai un script simple pour le faire rapidement.

#
# 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}"

Et voici comment vous pouvez l’utiliser dans votre 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)

J'ai également écrit un article détaillé sur le processus. Veuillez le trouver ici .

4
damitj07

Si vous voulez savoir comment automatiser des CI/CD avec plusieurs environnements sur Kubernetes en utilisant GitOps pour la promotion entre environnements et Aperçu des environnements sur les demandes d'extraction, vous pouvez consulter ma récente conférence sur Jenkins X sur DevOxx UK où I faites une démonstration en direct sur GKE. Bien que Jenkins X fonctionne sur AWS, AKS et GKE et d’autres clusters de kubernetes .

Lorsque vous fusionnez une modification dans la branche principale, Jenkins X crée une nouvelle distribution sémantiquement versionnée de votre application (pom.xml, jar, image du menu fixe, graphique de barre). Le pipeline automatise ensuite la génération de demandes d'extraction afin de promouvoir votre application dans tous les environnements via GitOps. Vous pouvez ensuite décider de restaurer des versions une fois le pipeline de versions d'applications terminé (car il existe également un pipeline d'environnement).

1
James Strachan

Oui c'est possible. Vous pouvez utiliser Amazon ECR pour votre cluster Kubernetes, mais vous devez créer un secret avec des informations d'identification . Vous pouvez développer un pipeline pour Jenkins qui déploiera automatiquement les mises à jour de votre cluster Kubernetes. Pour cela, vous devez configurer un déclencheur, par exemple l'achèvement réussi du pipeline précédent qui construit votre image. Vous pouvez utiliser kubernetes-plugin pour développer votre pipeline, ou simplement appeler kubectl update avec une nouvelle balise image. Vous pouvez mettre à jour votre cluster à l'aide de la mise à jour par défaut pour le déploiement ou d'un outil tiers, par exemple helm .

* mises à jour

Il existe un bon document: Using AWS EC2 Container Registry. Pour Jenkins et Kubernetes, je peux vous conseiller d’utiliser kube2iam , cela permet d’éviter l’expiration des jetons d’autorisation. Créez des rôles personnalisés pour les nœuds Kubernetes et pour Jenkins, n’oubliez pas non plus d’ajouter l’autorisation d’attribution des rôles pour kube2iam.

0
Nick Rak