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

Resuelto Torsten Bronger asked hace 8 años • 21 respuestas

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 extraer. ¿Por qué?

Torsten Bronger avatar Oct 14 '15 04:10 Torsten Bronger
Aceptado

Kubernetes realizará la creación del Pod si cualquiera de las dos situaciones (consulte el documento de actualización de imágenes ):

  • Usando imágenes etiquetadas:latest
  • imagePullPolicy: Alwaysestá especificado

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

  • Establecer imagePullPolicyen IfNotPresento Nevery extracción previa : extraiga manualmente imágenes en cada nodo del clúster para que la última se almacene en caché, luego haga algo kubectl rolling-updatesimilar para reiniciar los Pods (¡truco feo que se rompe fácilmente!)
  • Cambiar temporalmenteimagePullPolicy , hacer una kubectl apply, reiniciar el pod (por ejemplo kubectl rolling-update), revertir imagePullPolicy, rehacer una kubectl apply(¡feo!)
  • Tira y empuja some-public-image:latest a tu repositorio privado y haz un 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.

Wernight avatar Mar 11 '2016 13:03 Wernight

Hay que agrupar imagePullPolicydentro 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.

Entonces, 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
Torsten Bronger avatar Oct 14 '2015 09:10 Torsten Bronger

Hay un comando para hacer eso directamente:

Cree un nuevo kubectl rollout restartcomando que reinicie progresivamente una implementación.

La solicitud de extracción se fusionó. Es parte de la versión 1.15( changelog ) o superior.

S.Spieker avatar Apr 30 '2019 05:04 S.Spieker

Mi truco durante el desarrollo es cambiar mi manifiesto de implementación para agregar la última etiqueta y siempre hacerlo 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 imagen más reciente.

Everett Toews avatar Oct 27 '2017 16:10 Everett Toews

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

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

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

Tamlyn avatar Mar 18 '2019 12:03 Tamlyn