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
Author: abovesun, 2016-11-01

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.

 44
Author: Camil,
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.

 4
Author: Przemek Nowak,
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