update tag imagepullpolicy example deploy delete docker kubernetes

docker - tag - kubernetes deploy example



Kubernetes cómo hacer la implementación para actualizar la imagen (4)

Parece que k8s espera que proporcionemos una etiqueta de imagen diferente para cada implementación. Mi estrategia predeterminada sería hacer que el sistema CI genere y empuje las imágenes de la xpmatteo/foobar:456 acoplable, etiquetándolas con el número de compilación: xpmatteo/foobar:456 .

Para el desarrollo local puede ser conveniente usar un script o un archivo MAKE, como este:

# create a unique tag VERSION:=$(shell date +%Y%m%d%H%M%S) TAG=xpmatteo/foobar:$(VERSION) deploy: npm run-script build docker build -t $(TAG) . docker push $(TAG) sed s%IMAGE_TAG_PLACEHOLDER%$(TAG)% foobar-deployment.yaml | kubectl apply -f - --record

El comando sed reemplaza un marcador de posición en el documento de implementación con la etiqueta de imagen generada real.

Tengo implementación con un solo pod, con mi imagen personalizada de acoplador como:

containers: - name: mycontainer image: myimage:latest

Durante el desarrollo, quiero impulsar la nueva versión más reciente y actualizar Deployment. No puedo encontrar cómo hacer eso, sin definir explícitamente la etiqueta / versión e incrementarlo para cada compilación, y hacer

kubectl set image deployment/my-deployment mycontainer=myimage:1.9.1


Puede configurar su pod con un período de gracia (por ejemplo, 30 segundos o más, dependiendo del tiempo de inicio del contenedor y el tamaño de la imagen) y establecer "imagePullPolicy: "Always" . Y use kubectl delete pod pod_name . Se kubectl delete pod pod_name un nuevo contenedor y el última imagen descargada automáticamente, luego el contenedor anterior finalizó.

Ejemplo:

spec: terminationGracePeriodSeconds: 30 containers: - name: my_container image: my_image:latest imagePullPolicy: "Always"

Actualmente estoy usando Jenkins para compilaciones automatizadas y etiquetado de imágenes y se parece a esto:

kubectl --user="kube-user" --server="https://kubemaster.example.com" --token=$ACCESS_TOKEN set image deployment/my-deployment mycontainer=myimage:"$BUILD_NUMBER-$SHORT_GIT_COMMIT"

Otro truco es ejecutar inicialmente:

kubectl set image deployment/my-deployment mycontainer=myimage:latest

y entonces:

kubectl set image deployment/my-deployment mycontainer=myimage

En realidad, activará la actualización imagePullPolicy: "Always" pero asegúrese de que también tenga establecida imagePullPolicy: "Always" .

Actualizar:

Otro truco que encontré, donde no tiene que cambiar el nombre de la imagen, es cambiar el valor de un campo que desencadenará una actualización continua, como terminationGracePeriodSeconds . Puede hacerlo usando la kubectl edit deployment your_deployment o kubectl apply -f your_deployment.yaml o usando un parche como este:

kubectl patch deployment your_deployment -p / ''{"spec":{"template":{"spec":{"terminationGracePeriodSeconds":31}}}}''

Solo asegúrese de cambiar siempre el valor del número.


Uso Gitlab-CI para construir la imagen y luego implementarla directamente en GCK. Si usa un pequeño truco para lograr una actualización continua sin cambiar ninguna configuración real del contenedor, que está cambiando una etiqueta al commit-short-sha actual.

Mi comando se ve así:

kubectl patch deployment my-deployment -p "{/"spec/":{/"template/":{/"metadata/":{/"labels/":{/"build/":/"$CI_COMMIT_SHORT_SHA/"}}}}}}"

Donde puede usar cualquier nombre y cualquier valor para la etiqueta siempre que cambie con cada compilación.

¡Que te diviertas!


ACTUALIZACIÓN 2019-06-24

Según el comentario de @Jodiug, si tiene una versión 1.15 , puede utilizar el kubectl rollout restart deployment/demo .

Lea más sobre el tema:

https://github.com/kubernetes/kubernetes/issues/13488

Bueno, hay una discusión interesante sobre este tema en el proyecto Kubernetes GitHub. Vea el problema: https://github.com/kubernetes/kubernetes/issues/33664

De las soluciones descritas allí, sugeriría una de dos.

primero

1.Preparar el despliegue

apiVersion: extensions/v1beta1 kind: Deployment metadata: name: demo spec: replicas: 1 template: metadata: labels: app: demo spec: containers: - name: demo image: registry.example.com/apps/demo:master imagePullPolicy: Always env: - name: FOR_GODS_SAKE_PLEASE_REDEPLOY value: ''THIS_STRING_IS_REPLACED_DURING_BUILD''

2 desplegar

sed -ie "s/THIS_STRING_IS_REPLACED_DURING_BUILD/$(date)/g" deployment.yml kubectl apply -f deployment.yml

Segundo (un trazador de líneas):

kubectl patch deployment web -p / "{/"spec/":{/"template/":{/"metadata/":{/"labels/":{/"date/":/"`date +''%s''`/"}}}}}"

Por supuesto, imagePullPolicy: Always se requiere en ambos casos.