Kubernetes cómo hacer una implementación para actualizar la imagen
Tengo implementación con un solo pod, con mi imagen de docker personalizada como:
containers:
- name: mycontainer
image: myimage:latest
Durante el desarrollo quiero insertar la nueva versión más reciente y actualizar la implementación. No se puede encontrar cómo hacer eso, sin definir explícitamente la etiqueta / versión e incrementarla para cada compilación, y hacer
kubectl set image deployment/my-deployment mycontainer=myimage:1.9.1
2 answers
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 utilizar kubectl delete pod pod_name
.
Se creará un nuevo contenedor y se descargará automáticamente la imagen más reciente, luego se terminará el contenedor anterior.
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 ve algo como 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 inicialmente ejecutar:
kubectl set image deployment/my-deployment mycontainer=myimage:latest
Y luego:
kubectl set image deployment/my-deployment mycontainer=myimage
En realidad se activará la actualización continua, pero asegúrese de que también tiene imagePullPolicy: "Always"
establecido.
Actualización:
Otro truco que encontré, donde no tienes que cambiar el nombre de la imagen, es cambiar el valor de un campo que activará una actualización continua, como terminationGracePeriodSeconds
. Puedes hacer esto usando 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.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-31 09:56:26
Bueno, hay una discusión interesante sobre este tema en el proyecto kubernetes github. Ver el problema: https://github.com/kubernetes/kubernetes/issues/33664
De las soluciones allí descritas, 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 revestimiento):
kubectl patch deployment web -p \
"{\"spec\":{\"template\":{\"metadata\":{\"labels\":{\"date\":\"`date +'%s'`\"}}}}}"
Por supuesto, el ImagePullPollicy: Always
se requiere en ambos casos.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-14 06:55:19