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.