images ifnotpresent force ecr delete image pull kubernetes

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



kubernetes force pull image (8)

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

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

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

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


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


Habrá un nuevo comando para hacer eso directamente:

Cree un nuevo kubectl rollout restart que haga un reinicio continuo de una implementación.

La solicitud de extracción se fusionó. Formará parte de la versión 1.15 ( changelog )


Kubernetes utilizará la creación de Pod si cualquiera de los dos (ver el documento de actualización de imágenes ):

  • Uso de imágenes etiquetadas :latest
  • imagePullPolicy: Always se especifica

Esto es genial si quieres tirar siempre. Pero, ¿qué sucede si desea hacerlo a pedido ? Por ejemplo, si desea usar some-public-image:latest pero solo desea obtener una versión más nueva manualmente cuando la solicite. Actualmente puedes:

  • Establezca imagePullPolicy en IfNotPresent o Never y pre-pull : pre-pull manualmente las imágenes en cada nodo del clúster para que se kubectl rolling-update el último en caché, luego realice una kubectl rolling-update o similar para reiniciar Pods (¡truco feo que se rompe fácilmente!)
  • Cambie temporalmente imagePullPolicy , kubectl apply , reinicie el pod (por ejemplo, kubectl rolling-update ), revierta imagePullPolicy , kubectl apply una kubectl apply (¡feo!)
  • Tire y empuje some-public-image:latest a su repositorio privado y realice una kubectl rolling-update (¡pesado!)

No hay una buena solución para la extracción bajo demanda. Si eso cambia, por favor comente; Actualizaré esta respuesta.


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 elimino el pod manualmente

kubectl delete pod my-app-3498980157-2zxhd

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


Puede definir imagePullPolicy: Always en su archivo de implementación.


Una solución popular es parchear la implementación con una anotación ficticia (o etiqueta):

kubectl patch deployment <name> -p / "{/"spec/":{/"template/":{/"metadata/":{/"annotations/":{/"date/":/"`date +''%s''`/"}}}}}"

Suponiendo que su implementación cumpla con estos requisitos , esto hará que los K8 extraigan cualquier imagen nueva y la vuelvan a implementar.


Uno tiene que agrupar imagePullPolicy dentro de los datos del contenedor en lugar de dentro de los datos de la especificación. Sin embargo, presenté un issue respecto porque me parece extraño. Además, no hay mensaje de error.

Entonces, este fragmento de especificaciones funciona:

spec: containers: - name: myapp image: myregistry.com/myapp:5c3dda6b ports: - containerPort: 80 imagePullPolicy: Always imagePullSecrets: - name: myregistry.com-registry-key