267 votes

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

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

 containers:
  - name: mycontainer
    image: myimage:latest
 

Pendant le développement, je souhaite publier la dernière version et mettre à jour le déploiement. 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
 

276voto

Camil Points 2243

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

Exemple:

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

Je suis actuellement à l'aide de Jenkins pour les générations automatisées et le balisage d'image et il ressemble à quelque chose comme 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 est d'abord exécuter:

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

et puis:

kubectl set image deployment/my-deployment mycontainer=myimage

Il sera effectivement le déclenchement de la rolling-mise à jour, mais assurez-vous d'avoir également imagePullPolicy: "Always" ensemble.

Mise à jour:

un autre truc que j'ai trouvé, où vous n'avez pas à changer le nom de l'image, est de changer la valeur d'un champ qui va déclencher un roulement de mise à jour, comme terminationGracePeriodSeconds. Vous pouvez faire cela en utilisant kubectl edit deployment your_deployment ou kubectl apply -f your_deployment.yaml ou à l'aide d'un patch comme ça:

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

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

189voto

przemek Points 161

Et bien il y a une discussion intéressante sur ce sujet sur le kubernetes projet github. Voir la question: https://github.com/kubernetes/kubernetes/issues/33664

Des solutions qui y sont décrits, je dirais l'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 ligne):

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

Bien sûr, l' ImagePullPollicy: Always est requis sur les deux cas.

9voto

xpmatteo Points 4850

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 build: 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X