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 ):
: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:
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é!) imagePullPolicy
, faire un kubectl apply
, redémarrer le pod (par exemple kubectl rolling-update
), rétablir imagePullPolicy
, refaire un kubectl apply
(moche!) 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.