¿Cómo fuerzo a Kubernetes a volver a extraer una imagen?


Tengo el siguiente controlador de replicación en Kubernetes en 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

Ahora, si digo

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

Se realiza la actualización continua, pero no se vuelve a tirar. ¿Por qué?

Author: Community, 2015-10-14

5 answers

Kubernetes tirará sobre la creación del Pod si cualquiera (véase updating-images doc):

  • Usando imágenes etiquetadas :latest
  • imagePullPolicy: Always se especifica

Esto es genial si quieres tirar siempre. Pero, ¿qué pasa si quieres hacerlo on demand: Por ejemplo, si quieres usar some-public-image:latest pero solo quieres extraer una versión más reciente manualmente cuando lo pidas? Usted puede actualmente:

  • Set imagePullPolicy a IfNotPresent o Never y pre-pull: Tire manualmente las imágenes en cada nodo del clúster para que el último se almacena en caché, a continuación, hacer un kubectl rolling-update o similar a reiniciar Pods(feo hack fácilmente roto!)
  • Temporalmente cambiar imagePullPolicy, hacer un kubectl apply, reiniciar el pod (por ejemplo, kubectl rolling-update), revertir imagePullPolicy, rehacer un kubectl apply (feo!)
  • Tirar y empujar some-public-image:latest a su repositorio privado y hacer un kubectl rolling-update (pesado!)

No hay una buena solución para el pull on-demande. Si eso cambia, por favor comente; Actualizaré este anwser.

 51
Author: Wernight,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-11 13:21:34

Uno tiene que agrupar imagePullPolicy dentro de los datos del contenedor en lugar de dentro de los datos de especificaciones. Sin embargo, presenté un problema sobre esto porque lo encuentro extraño. Además, no hay ningún mensaje de error.

Por lo tanto, este fragmento de especificación funciona:

spec:
  containers:
  - name: myapp
    image: myregistry.com/myapp:5c3dda6b
    ports:
    - containerPort: 80
    imagePullPolicy: Always
  imagePullSecrets:
    - name: myregistry.com-registry-key
 21
Author: Torsten Bronger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-14 09:46:03

Aparentemente ahora, cuando ejecuta una actualización continua con el argumento --image igual que la imagen contenedor existente, también debe especificar un --image-pull-policy. El siguiente comando debe forzar una extracción de la imagen cuando es la misma que la imagen contenedor:

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

 5
Author: sjking,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-19 23:06:05

El comando actualización continua, cuando se le da un argumento de imagen, asume que la imagen es diferente de lo que existe actualmente en el controlador de replicación.

 3
Author: Robert Bailey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-14 03:07:02

Mi truco durante el desarrollo es cambiar mi manifiesto de implementación para agregar la última etiqueta y siempre tirar así

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

Luego borro el pod manualmente

kubectl delete pod my-app-3498980157-2zxhd

Debido a que se trata de una implementación, Kubernetes recreará automáticamente el pod y extraerá la última imagen.

 3
Author: Everett Toews,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-27 16:53:01