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é?
image
pull
kubernetes
Torsten Bronger
fuente
fuente
imagePullPolicy
campo.latest
, no lo hagas. Latest extraerá, bueno, la imagen más reciente con la última etiqueta. Lo que quieres es una gama SemVer. ~ 1.2.3 por ejemplo. esto extraerá imágenes con etiquetas entre el rango de> = 1.2.3 y <1.3.0. Siempre y cuando el proveedor de la imagen siga SemVer, usted sabe (y esta es la parte importante) que no se agregaron cambios atrasados (a propósito) y que no se agregaron nuevas características (posible preocupación de seguridad). Por favor, nunca lo uselatest
en sistemas de producción.Respuestas:
Kubernetes utilizará la creación de Pod si cualquiera de los dos (ver el documento de actualización de imágenes ):
:latest
imagePullPolicy: Always
está especificadoEsto es genial si quieres tirar siempre. Pero, ¿qué sucede si desea hacerlo a pedido ? Por ejemplo, si desea usarlo
some-public-image:latest
pero solo desea obtener una versión más nueva manualmente cuando lo solicite. Actualmente puedes:imagePullPolicy
enIfNotPresent
oNever
y extracción previa : extraiga manualmente las imágenes en cada nodo del clúster para que el último se almacene en caché, luego haga unakubectl rolling-update
o similar para reiniciar Pods (¡truco feo que se rompe fácilmente!)imagePullPolicy
, haz unkubectl apply
, reinicia el pod (por ejemplokubectl rolling-update
), revierteimagePullPolicy
, rehace unkubectl apply
(¡feo!)some-public-image:latest
a su repositorio privado y haga unkubectl rolling-update
(¡pesado!)No hay una buena solución para la extracción bajo demanda. Si eso cambia, por favor comente; Actualizaré esta respuesta.
fuente
:latest
, ¿qué pasa conpatch
ing? ¿también siempre saca la imagen más nueva / más reciente? Parece que no funciona para mí :(:latest
etiqueta que apuntaba a una nueva imagen, ykubectl rolling-update
funcionó para actualizar los pods.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 al respecto porque me parece extraño. Además, no hay mensaje de error.Entonces, este fragmento de especificaciones funciona:
fuente
imagePullPolicy
(o etiquetado:latest
) es bueno si siempre quieres tirar, pero no resuelve la cuestión de tirar de la demanda.imagePullPolicy: Always
dentro de la definición del contenedor tendrákubernetes
imágenes de búsqueda etiquetadas:latest
cada vez que una versión más nueva de ellas se envíe al registro.imagePullPolicy: Always
simplemente le dice a Kubernetes que siempre extraiga la imagen del registro. Qué imagen se configurará porimage
atributo. Si lo configuraimage: your-image:latest
, siempre extraerá layour-image
imagen con lalatest
etiqueta.Mi truco durante el desarrollo es cambiar mi manifiesto de implementación para agregar la última etiqueta y siempre tirar así
Luego elimino el pod manualmente
Debido a que es una implementación, Kubernetes recreará automáticamente el pod y extraerá la última imagen.
fuente
Una solución popular es parchear la implementación con una anotación ficticia (o etiqueta):
Suponiendo que su implementación cumpla con estos requisitos , esto hará que los K8 extraigan cualquier imagen nueva y la vuelvan a implementar.
fuente
ImagePullPolicy
como Siempre . Las anotaciones comodeployment.kubernetes.io/revision: "v-someversion"
ykubernetes.io/change-cause: the reason
pueden ser bastante útiles y se dirigen hacia implementaciones inmutables.Habrá un nuevo comando para hacer eso directamente:
Cree un nuevo
kubectl rollout restart
comando que reinicie continuamente una implementación.La solicitud de extracción se fusionó. Será parte de la versión
1.15
( registro de cambios )fuente
Aparentemente, ahora, cuando ejecuta una actualización continua con el
--image
argumento igual que la imagen del 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 del contenedor:kubectl rolling-update myapp --image=us.gcr.io/project-107012/myapp:5c3dda6b --image-pull-policy Always
fuente
fuente
Ahora, el comando
kubectl rollout restart deploy YOUR-DEPLOYMENT
combinado con unaimagePullPolicy: Always
política le permitirá reiniciar todos sus pods con una última versión de su imagen.fuente
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.
fuente
--image
bandera.Puede definir
imagePullPolicy: Always
en su archivo de implementación.fuente
La política de extracción de imágenes siempre ayudará a extraer la imagen cada vez que se cree un nuevo pod (esto puede ser en cualquier caso como escalar las réplicas, o el pod muere y se crea un nuevo pod)
Pero si desea actualizar la imagen del pod en ejecución actual, la implementación es la mejor manera. Te deja una actualización perfecta sin ningún problema (principalmente cuando tienes un volumen persistente conectado al pod) :)
fuente