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

imagePullPolicycampo.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 uselatesten 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 ):
:latestimagePullPolicy: Alwaysestá especificadoEsto es genial si quieres tirar siempre. Pero, ¿qué sucede si desea hacerlo a pedido ? Por ejemplo, si desea usarlo
some-public-image:latestpero solo desea obtener una versión más nueva manualmente cuando lo solicite. Actualmente puedes:imagePullPolicyenIfNotPresentoNevery 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-updateo 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:latesta 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 conpatching? ¿también siempre saca la imagen más nueva / más reciente? Parece que no funciona para mí :(:latestetiqueta que apuntaba a una nueva imagen, ykubectl rolling-updatefuncionó para actualizar los pods.Uno tiene que agrupar
imagePullPolicydentro 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: Alwaysdentro de la definición del contenedor tendrákubernetesimágenes de búsqueda etiquetadas:latestcada vez que una versión más nueva de ellas se envíe al registro.imagePullPolicy: Alwayssimplemente le dice a Kubernetes que siempre extraiga la imagen del registro. Qué imagen se configurará porimageatributo. Si lo configuraimage: your-image:latest, siempre extraerá layour-imageimagen con lalatestetiqueta.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
ImagePullPolicycomo Siempre . Las anotaciones comodeployment.kubernetes.io/revision: "v-someversion"ykubernetes.io/change-cause: the reasonpueden ser bastante útiles y se dirigen hacia implementaciones inmutables.Habrá un nuevo comando para hacer eso directamente:
Cree un nuevo
kubectl rollout restartcomando 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
--imageargumento 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 Alwaysfuente
fuente
Ahora, el comando
kubectl rollout restart deploy YOUR-DEPLOYMENTcombinado con unaimagePullPolicy: Alwayspolí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
--imagebandera.Puede definir
imagePullPolicy: Alwaysen 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