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 nouvelle extraction. Pourquoi?
image
pull
kubernetes
Torsten Bronger
la source
la source
imagePullPolicy
domaine.latest
, ne le faites pas. La dernière tirera l'image, enfin, la plus récente avec la dernière balise. Ce que vous voulez, c'est une gamme SemVer. ~ 1.2.3 par exemple. cela tirera les images avec des balises comprises entre> = 1.2.3 et <1.3.0. Tant que le fournisseur d'images suit SemVer votre connaissance (et c'est la partie importante), aucun changement de rupture en arrière n'a été ajouté (exprès) et qu'aucune nouvelle fonctionnalité n'a été ajoutée (problème de sécurité possible). Veuillez ne jamais utiliserlatest
dans les systèmes de production.Réponses:
Kubernetes tirera sur la création du pod si l'un ou l'autre (voir le document de mise à jour d'images ):
:latest
imagePullPolicy: Always
est spécifiéC'est génial si vous voulez toujours tirer. Mais que se passe-t-il si vous souhaitez le faire à la demande : par exemple, si vous souhaitez utiliser
some-public-image:latest
mais que vous souhaitez uniquement extraire une version plus récente manuellement lorsque vous le demandez. Vous pouvez actuellement:imagePullPolicy
surIfNotPresent
ouNever
et pré-extraire : tirez manuellement les images sur chaque nœud du cluster afin que le dernier soit mis en cache, puis faites unkubectl rolling-update
ou similaire pour redémarrer les pods (hack facile à casser!)imagePullPolicy
, faire unkubectl apply
, redémarrer le pod (par exemplekubectl rolling-update
), revenir en arrièreimagePullPolicy
, refaire unkubectl apply
(moche!)some-public-image:latest
vers votre référentiel privé et faites unkubectl rolling-update
(lourd!)Aucune bonne solution pour l'extraction à la demande. Si cela change, veuillez commenter; Je vais mettre à jour cette réponse.
la source
:latest
- qu'enpatch
est-il? tire-t-il également toujours la dernière / dernière image? Semble ne pas fonctionner pour moi :(:latest
balise qui pointait vers une nouvelle image, et lekubectl rolling-update
travail pour mettre à jour les pods.Il faut regrouper
imagePullPolicy
les données du conteneur au lieu des 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écification fonctionne:
la source
imagePullPolicy
(ou taguer:latest
) est bon si vous voulez toujours tirer, mais ne résout pas la question du tirage à la demande.imagePullPolicy: Always
intérieur de la définition du conteneur aura pour effet dekubernetes
récupérer des images étiquetées:latest
chaque fois qu'une version plus récente d'entre elles est poussée vers le registre?imagePullPolicy: Always
dit simplement à Kubernetes de toujours extraire l'image du registre. Quelle image il sera est configuré parimage
attribut. Si vous le configurez surimage: your-image:latest
, il tirera toujours l'your-image
image avec lalatest
balise.Mon hack pendant le développement est de changer mon manifeste de déploiement pour ajouter la dernière balise et toujours tirer comme ça
Ensuite, je supprime le pod manuellement
Comme il s'agit d'un déploiement, Kubernetes recrée automatiquement le pod et extrait la dernière image.
la source
Une solution de contournement courante consiste à corriger le déploiement avec une annotation factice (ou une étiquette):
En supposant que votre déploiement réponde à ces exigences , les K8 tireront toute nouvelle image et se redéployeront.
la source
ImagePullPolicy
comme Toujours . des annotations commedeployment.kubernetes.io/revision: "v-someversion"
etkubernetes.io/change-cause: the reason
peuvent être très utiles et se dirigent vers des déploiements immuables.Il y aura une nouvelle commande pour faire cela directement:
Créez une nouvelle
kubectl rollout restart
commande qui effectue un redémarrage progressif d'un déploiement.La demande d'extraction a été fusionnée. Il fera partie de la version
1.15
( changelog )la source
Apparemment maintenant, lorsque vous exécutez une mise à jour progressive avec l'
--image
argument identique à l'image de conteneur existante, vous devez également spécifier un fichier--image-pull-policy
. La commande suivante doit forcer une 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 source
la source
Désormais, la commande
kubectl rollout restart deploy YOUR-DEPLOYMENT
combinée à uneimagePullPolicy: Always
politique vous permettra de redémarrer tous vos pods avec une dernière version de votre image.la source
La commande de mise à jour progressive, lorsqu'elle est donnée un argument d'image, suppose que l'image est différente de ce qui existe actuellement dans le contrôleur de réplication.
la source
--image
drapeau.Vous pouvez définir
imagePullPolicy: Always
dans votre fichier de déploiement.la source
La politique d'extraction d'image aidera toujours à extraire l'image chaque fois qu'un nouveau pod est créé (cela peut être dans tous les cas comme la mise à l'échelle des répliques, ou le pod meurt et un nouveau pod est créé)
Mais si vous souhaitez mettre à jour l'image du pod en cours d'exécution, le déploiement est le meilleur moyen. Cela vous laisse une mise à jour sans faille sans aucun problème (principalement lorsque vous avez un volume persistant attaché au pod) :)
la source