Comment forcer Kubernetes à extraire une image?

J’ai le contrôleur de réplication suivant dans Kubernetes sur GKE:

apiVersion: v1 kind: ReplicationController metadata: name: myapp labels: app: myapp spec: replicas: 2 selector: app: myapp deployment: initial template: metadata: labels: app: myapp deployment: initial spec: containers: - name: myapp image: myregistry.com/myapp:5c3dda6b ports: - containerPort: 80 imagePullPolicy: Always imagePullSecrets: - name: myregistry.com-registry-key 

Maintenant, si je dis

 kubectl rolling-update myapp --image=us.gcr.io/project-107012/myapp:5c3dda6b 

la mise à jour continue est effectuée, mais pas de nouvelle extraction. Pourquoi?

Les Kubernetes vont tirer sur la création de Pod si l’un ou l’autre (voir doc de update-images ):

  • En utilisant des images marquées :latest
  • imagePullPolicy: Always spécifié

C’est génial si vous voulez toujours tirer. Mais que faire si vous voulez le faire à la demande : Par exemple, si vous souhaitez utiliser some-public-image:latest mais que vous souhaitez uniquement extraire une nouvelle version manuellement lorsque vous le demandez. Vous pouvez actuellement:

  • Définissez imagePullPolicy sur IfNotPresent ou Never et pré-pull : extrayez manuellement les images sur chaque nœud du cluster afin que la dernière soit mise en cache, puis effectuez une kubectl rolling-update ou similaire pour redémarrer les pods (hack moche facilement cassé!)
  • Changer temporairement imagePullPolicy , faire un kubectl apply , redémarrer le pod (par exemple kubectl rolling-update ), rétablir imagePullPolicy , refaire un kubectl apply (moche!)
  • Tirez et poussez some-public-image:latest vers votre repository privé et faites un kubectl rolling-update (lourd!)

Pas de bonne solution pour tirer sur demande. Si cela change, veuillez commenter; Je vais mettre à jour cette réponse.

Il faut regrouper imagePullPolicy dans les données du conteneur plutôt que dans les données de spécification. Cependant, j’ai déposé un problème à ce sujet parce que je trouve cela étrange. De plus, il n’y a pas de message d’erreur.

Donc, cet extrait de spécifications fonctionne:

 spec: containers: - name: myapp image: myregistry.com/myapp:5c3dda6b ports: - containerPort: 80 imagePullPolicy: Always imagePullSecrets: - name: myregistry.com-registry-key 

Apparemment, maintenant que vous exécutez une mise à jour continue avec l’argument --image identique à l’image de conteneur existante, vous devez également spécifier une --image-pull-policy . La commande suivante devrait forcer une traction de l’image lorsqu’elle est identique à l’image du conteneur:

kubectl rolling-update myapp --image=us.gcr.io/project-107012/myapp:5c3dda6b --image-pull-policy Always

La commande de mise à jour continue, lorsqu’un argument image est donné, suppose que l’image est différente de celle qui existe actuellement dans le contrôleur de réplication.

Mon hack pendant le développement est de changer mon manifeste de déploiement pour append la dernière balise et toujours tirer comme ça

 image: etoews/my-image:latest imagePullPolicy: Always 

Puis je supprime le pod manuellement

 kubectl delete pod my-app-3498980157-2zxhd 

Comme il s’agit d’un déploiement, Kubernetes recrée automatiquement le pod et extrait la dernière image.