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 progressive est effectuée, mais pas de ré-extraction. Pourquoi?
Il faut grouper imagePullPolicy
à l'intérieur des données du conteneur plutôt qu'à l'intérieur des données de spécification. Cependant, j'ai déposé un numéro à ce sujet parce que je trouve cela étrange. De plus, il n'y a pas de message d'erreur.
Donc, cet extrait de spécification fonctionne:
spec:
containers:
- name: myapp
image: myregistry.com/myapp:5c3dda6b
ports:
- containerPort: 80
imagePullPolicy: Always
imagePullSecrets:
- name: myregistry.com-registry-key
Kubernetes s’appuiera sur la création du pod si l’un ou l’autre (voir doc-update-images ):
:latest
imagePullPolicy: Always
est spécifiéC'est génial si vous voulez toujours tirer. Mais que se passe-t-il si vous voulez le faire à la demande : Par exemple, si vous souhaitez utiliser some-public-image:latest
mais souhaitez uniquement extraire manuellement une version plus récente quand vous le demandez. Vous pouvez actuellement:
imagePullPolicy
sur IfNotPresent
ou Never
et pré-extraction : extrait manuellement les images sur chaque nœud du cluster afin la dernière est mise en cache, puis faites un kubectl rolling-update
ou similaire pour redémarrer Pods (laid bidouillage facile!)imagePullPolicy
, faites un kubectl apply
, redémarrez le module (par exemple, kubectl rolling-update
), restaurez imagePullPolicy
, refaites un kubectl apply
(moche!)some-public-image:latest
vers votre référentiel privé et faire 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.
Mon bidouillage pendant le développement consiste à changer mon manifeste de déploiement pour ajouter la dernière balise et toujours tirer comme si
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éera automatiquement le pod et extraira la dernière image.
Un solution de contournement populaire consiste à corriger le déploiement avec une annotation factice (ou une étiquette):
kubectl patch deployment <name> -p \
"{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"date\":\"`date +'%s'`\"}}}}}"
En supposant que votre déploiement satisfait à ces exigences , les K8 extrairont toute nouvelle image et se redéployeront.
Apparemment, maintenant, lorsque vous exécutez une mise à jour progressive avec l'argument --image
identique à l'image de conteneur existante, vous devez également spécifier un --image-pull-policy
. La commande suivante devrait forcer l'extraction 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 progressive, lorsqu'un argument d'image est attribué, suppose que l'image est différente de ce qui existe actuellement dans le contrôleur de réplication.
Il y aura une nouvelle commande pour le faire directement:
Créez une nouvelle commande kubectl rollout restart
qui effectue un redémarrage progressif d'un déploiement.
Le demande d'extraction a été fusionné. Cela fera partie de la version 1.15
( changelog )
Vous pouvez définir imagePullPolicy: Always
dans votre fichier de déploiement.