web-dev-qa-db-fra.com

Comment forcer Kubernetes à reprendre 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 progressive est effectuée, mais pas de ré-extraction. Pourquoi?

98
Torsten Bronger

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
46
Torsten Bronger

Kubernetes s’appuiera sur la création du pod si l’un ou l’autre (voir doc-update-images ):

  • Utilisation d'images marquées :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:

  • Définissez 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!)
  • Temporairement changez imagePullPolicy, faites un kubectl apply, redémarrez le module (par exemple, kubectl rolling-update), restaurez imagePullPolicy, refaites un kubectl apply (moche!)
  • Tirer et pousser 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.

85
Wernight

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.

16
Everett Toews

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.

8
Tamlyn

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

5
sjking

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.

3
Robert Bailey

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 )

2
S.Spieker

Vous pouvez définir imagePullPolicy: Always dans votre fichier de déploiement.

0
Sachin Arote