web-dev-qa-db-fra.com

Kubernetes comment faire le déploiement pour mettre à jour l'image

J'ai un déploiement avec un seul pod, avec mon image de menu fixe personnalisée comme:

containers:
  - name: mycontainer
    image: myimage:latest

Pendant le développement, je veux publier la dernière version et publier le déploiement à jour. Vous ne trouvez pas comment faire cela sans définir explicitement balise/version et l'incrémenter pour chaque construction

kubectl set image deployment/my-deployment mycontainer=myimage:1.9.1
71
abovesun

Vous pouvez configurer votre pod avec une période de grâce (par exemple 30 secondes ou plus, en fonction du temps de démarrage du conteneur et de la taille de l'image) et définir "imagePullPolicy: "Always". Et utilisez kubectl delete pod pod_name. Un nouveau conteneur sera créé et la dernière image automatiquement téléchargée, puis l'ancien conteneur sera résilié.

Exemple:

spec:
  terminationGracePeriodSeconds: 30
  containers:
  - name: my_container
    image: my_image:latest
    imagePullPolicy: "Always"

J'utilise actuellement Jenkins pour les constructions automatisées et le balisage d'images. Cela ressemble à ceci:

kubectl --user="kube-user" --server="https://kubemaster.example.com"  --token=$ACCESS_TOKEN set image deployment/my-deployment mycontainer=myimage:"$BUILD_NUMBER-$SHORT_GIT_COMMIT"

Une autre astuce consiste à lancer initialement:

kubectl set image deployment/my-deployment mycontainer=myimage:latest

puis:

kubectl set image deployment/my-deployment mycontainer=myimage

Cela déclenchera effectivement la mise à jour progressive, mais assurez-vous que vous avez également défini imagePullPolicy: "Always".

Mise à jour:

une autre astuce que j'ai trouvée, où vous n'avez pas besoin de changer le nom de l'image, est de changer la valeur d'un champ qui déclenchera une mise à jour progressive, comme terminationGracePeriodSeconds. Vous pouvez le faire en utilisant kubectl edit deployment your_deployment ou kubectl apply -f your_deployment.yaml ou en utilisant un patch comme celui-ci:

kubectl patch deployment your_deployment -p \
  '{"spec":{"template":{"spec":{"terminationGracePeriodSeconds":31}}}}'

Assurez-vous simplement de toujours changer la valeur numérique.

99
Camil

UPDATE 2019-06-24

Selon le commentaire @Jodiug, si vous avez une version 1.15, vous pouvez utiliser la commande kubectl rollout restart deployment/demo.

En savoir plus sur le sujet:

https://github.com/kubernetes/kubernetes/issues/13488


Il existe une discussion intéressante à ce sujet sur le projet kubernetes GitHub. Voir le numéro: https://github.com/kubernetes/kubernetes/issues/33664

Parmi les solutions décrites ici, je suggérerais un des deux.

Première

1.Préparer le déploiement

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: demo
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: demo
    spec:
      containers:
      - name: demo
        image: registry.example.com/apps/demo:master
        imagePullPolicy: Always
        env:
        - name: FOR_GODS_SAKE_PLEASE_REDEPLOY
          value: 'THIS_STRING_IS_REPLACED_DURING_BUILD'

2.Déployer

sed -ie "s/THIS_STRING_IS_REPLACED_DURING_BUILD/$(date)/g" deployment.yml
kubectl apply -f deployment.yml

Deuxième (une doublure):

kubectl patch deployment web -p \
  "{\"spec\":{\"template\":{\"metadata\":{\"labels\":{\"date\":\"`date +'%s'`\"}}}}}"

Bien entendu, le imagePullPolicy: Always est requis dans les deux cas.

31
Przemek Nowak

Il semble que k8s s’attende à ce que nous fournissions une balise d’image différente pour chaque déploiement. Ma stratégie par défaut serait de faire en sorte que le système de CI génère et pousse les images du menu fixe, en leur attribuant le numéro de construction: xpmatteo/foobar:456.

Pour le développement local, il peut être pratique d’utiliser un script ou un fichier make, comme ceci:

# create a unique tag    
VERSION:=$(Shell date +%Y%m%d%H%M%S)
TAG=xpmatteo/foobar:$(VERSION)

deploy:
    npm run-script build
    docker build -t $(TAG) . 
    docker Push $(TAG)
    sed s%IMAGE_TAG_PLACEHOLDER%$(TAG)% foobar-deployment.yaml | kubectl apply -f - --record

La commande sed remplace un espace réservé dans le document de déploiement par la balise d'image générée.

3
xpmatteo

J'utilise Gitlab-CI pour créer l'image, puis la déployer directement sur GCK. Si vous utilisez un petit truc bien astucieux pour réaliser une mise à jour propagée sans modifier aucun paramètre réel du conteneur, vous modifiez ainsi le libellé du commit-short-sha actuel.

Ma commande ressemble à ceci:

kubectl patch deployment my-deployment -p "{\"spec\":{\"template\":{\"metadata\":{\"labels\":{\"build\":\"$CI_COMMIT_SHORT_SHA\"}}}}}}"

Où vous pouvez utiliser n'importe quel nom et n'importe quelle valeur pour l'étiquette tant qu'il change à chaque construction.

S'amuser!

2
David Faber