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
enIfNotPresent
oNever
y pre-pull : pre-pull manualmente las imágenes en cada nodo del clúster para que sekubectl rolling-update
el último en caché, luego realice unakubectl 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
), reviertaimagePullPolicy
,kubectl apply
unakubectl apply
(¡feo!) -
Tire y empuje
some-public-image:latest
a su repositorio privado y realice unakubectl 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