¿Reiniciar los pods cuando se actualice el mapa de configuración en Kubernetes?

120

¿Cómo reinicio automáticamente los pods de Kubernetes y los pods asociados con las implementaciones cuando se cambia / actualiza su mapa de configuración?


Sé que se ha hablado de la capacidad de reiniciar automáticamente los pods cuando cambia un mapa de configuración, pero que yo sepa, esto aún no está disponible en Kubernetes 1.2.

Entonces, lo que (creo) me gustaría hacer es un "reinicio continuo" del recurso de implementación asociado con los pods que consumen el mapa de configuración. ¿Es posible, y de ser así, cómo, forzar un reinicio continuo de una implementación en Kubernetes sin cambiar nada en la plantilla real? ¿Es esta actualmente la mejor manera de hacerlo o hay una mejor opción?

Johan
fuente
$ kubectl set env deployment my deployment --env="LAST_RESTART=$(date)" --namespace ...haz el trabajo por mí
maciek

Respuestas:

60

La señalización de un pod en la actualización del mapa de configuración es una característica en proceso ( https://github.com/kubernetes/kubernetes/issues/22368 ).

Siempre puede escribir un pid1 personalizado que note que confimap ha cambiado y reinicie su aplicación.

También puede, por ejemplo: montar el mismo mapa de configuración en 2 contenedores, exponer una verificación de estado http en el segundo contenedor que falla si el hash del contenido del mapa de configuración cambia, y empujar eso como la sonda de vida del primer contenedor (porque los contenedores en un pod comparten el mismo espacio de nombres de red). El kubelet reiniciará su primer contenedor cuando la sonda falle.

Por supuesto, si no le importa en qué nodos se encuentran los pods, simplemente puede eliminarlos y el controlador de replicación los "reiniciará" por usted.

Prashanth B
fuente
Con "eliminar pods" te refieres a: recopilar todos los nombres de pod, eliminar uno, esperar hasta que se reemplace, eliminar el segundo, esperar hasta que se reemplace, etc. ¿Correcto?
Torsten Bronger
6
usando una implementación, la reduciría y luego la aumentaría. Sin embargo, todavía tendrá ese pequeño tiempo de inactividad. Puedes hacerlo en una línea para reducir eso ... kubectl scale deployment/update-demo --replicas=0; kubectl scale deployment/update-demo --replicas=4;
Nick H
Si no desea encontrar todos los pods y no le importa el tiempo de inactividad, simplemente retire el RC y luego vuelva a crear el RC.
Drew
1
¿Significa esto que el volumen en el que está montado está actualizado y solo necesita volver a leer el archivo en el pod sin reiniciar todo el pod?
Matt Williamson
@NickH Rápido y sucio, afortunadamente el tiempo de inactividad fue aceptable en mi caso y funcionó muy bien, ¡gracias!
ChocolateAndCheese
129

La mejor solución actual para este problema (a la que se hace referencia en https://github.com/kubernetes/kubernetes/issues/22368 vinculado en la respuesta del hermano) es usar Implementaciones y considerar que sus ConfigMaps son inmutables.

Cuando desee cambiar su configuración, cree un nuevo ConfigMap con los cambios que desea realizar y apunte su implementación al nuevo ConfigMap. Si la nueva configuración está rota, la implementación se negará a reducir su ReplicaSet en funcionamiento. Si la nueva configuración funciona, su antiguo ReplicaSet se escalará a 0 réplicas y se eliminará, y los nuevos pods se iniciarán con la nueva configuración.

No es tan rápido como editar el ConfigMap en su lugar, pero es mucho más seguro.

Simétrico
fuente
2
Este es el enfoque que hemos adoptado también
Johan
4
Vale la pena mencionar que la nueva herramienta experimental kustomizeadmite la creación automática de un hash de mapa de configuración determinista, lo que significa que no es necesario crear manualmente un nuevo mapa de configuración: github.com/kubernetes-sigs/kustomize/blob/…
Symmetric
Esto es lo que hace Spinnaker detrás de escena, por lo que si lo usa, no tendrá que preocuparse por esto.
Gus
32

La mejor manera que he encontrado para hacerlo es ejecutar Reloader

Le permite definir mapas de configuración o secretos para observar, cuando se actualizan, se realiza una actualización continua de su implementación. He aquí un ejemplo:

Tiene una implementación fooy un ConfigMap llamado foo-configmap. Desea rodar los pods de la implementación cada vez que se cambia el mapa de configuración. Necesita ejecutar Reloader con:

kubectl apply -f https://raw.githubusercontent.com/stakater/Reloader/master/deployments/kubernetes/reloader.yaml

Luego, especifique esta anotación en su implementación:

kind: Deployment
metadata:
  annotations:
    configmap.reloader.stakater.com/reload: "foo-configmap"
  name: foo
...
George Miller
fuente
Reloader es compatible con kubernetes> = 1.9
jacktrade
31

https://github.com/kubernetes/helm/blob/master/docs/charts_tips_and_tricks.md#user-content-automatically-roll-deployments-when-configmaps-or-secrets-change

A menudo, los mapas de configuración o los secretos se inyectan como archivos de configuración en contenedores. Dependiendo de la aplicación, es posible que sea necesario reiniciar si se actualizan con unahelm upgrade , pero si la especificación de implementación en sí no cambió, la aplicación se seguirá ejecutando con la configuración anterior, lo que dará como resultado una implementación inconsistente.

La sha256sumfunción se puede usar junto con la includefunción para garantizar que una sección de la plantilla de implementaciones se actualice si cambia otra especificación:

kind: Deployment
spec:
  template:
    metadata:
      annotations:
        checksum/config: {{ include (print $.Template.BasePath "/secret.yaml") . | sha256sum }}
[...]

En mi caso, por algunas razones, $.Template.BasePathno funcionó pero $.Chart.Namesí:

spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: admin-app
      annotations:
        checksum/config: {{ include (print $.Chart.Name "/templates/" $.Chart.Name "-configmap.yaml") . | sha256sum }}
cuantos
fuente
8
No se aplica al uso general de Kubernetes, solo se aplica a Helm
Emii Khaos
2
La respuesta es útil pero probablemente no sea relevante para esta pregunta
Anand Singh Kunwar
helm3 fue lanzado recientemente. Por lo tanto, el enlace está desactualizado. Apunta a la masterrama. La siguiente URL conducirá a los últimos helm2 documentos (actualmente) : github.com/helm/helm/blob/release-2.16/docs/…
Marcel Hoyer
Solución fría. Cambié a sha1sum, ya que en mi caso sha256sum tenía 65 caracteres que dieron como resultado Deployment.apps "xxx" is invalid: metadata.labels: Invalid value: "xxx": must be no more than 63 characters. La alternativa sería | trunc 63, pero sha1sum debería ser "más exclusivo".
iptizer
11

Puede actualizar una etiqueta de metadatos que no sea relevante para su implementación. activará una actualización continua

por ejemplo:

metadata:
  labels:
    configmap-version: 1
Maoz Zadok
fuente
Estoy buscando documentos sobre metadatos: etiquetas: configmap-versión: 1
c4f4t0r
7
cambios en las etiquetas de metadatos no desencadenan un reinicio de las vainas
Dan Carter
Esta respuesta es positiva, así que necesito preguntar. Si actualizamos los metadatos, ¿el clúster de Kubernetes activará una actualización continua? @ maoz-zadok
titus
1
Creo que esto funciona siempre que la etiqueta de metadatos esté debajotemplate.spec
Saikiran Yerram
1

Tuve este problema donde la implementación estaba en un sub-gráfico y los valores que lo controlaban estaban en el archivo de valores del gráfico principal. Esto es lo que usamos para activar el reinicio:

spec:
  template:
    metadata:
      annotations:
        checksum/config: {{ tpl (toYaml .Values) . | sha256sum }}

Obviamente, esto activará el reinicio en cualquier cambio de valor, pero funciona para nuestra situación. Lo que estaba originalmente en el gráfico secundario solo funcionaría si el config.yaml en el gráfico secundario cambiara:

    checksum/config: {{ include (print $.Template.BasePath "/config.yaml") . | sha256sum }}
Bryji
fuente
0

Hago la solución de los cuantos y funciona perfectamente. Pero lo que no entiendo es que el pod no se está reiniciando ... El pod sigue siendo el mismo, ¡pero hay cambios!

Por ejemplo: el pod se está ejecutando desde 50min y cambio algo y el cambio está en línea. Puedo verlo en mi navegador y el pod todavía se está ejecutando + 50min !! Estoy usando Helm3 ... ¿Sabes qué hace esto posible sin reiniciar la actualización de configmap?

Ibrahim Yesilay
fuente
1
¡Okay! Lo descubrí ... Porque montamos nuestro mapa de configuración como un volumen y lo actualizamos dinámicamente ... ¡Es por eso que cuando hago esto de "'suma de verificación' ', entonces mi pod no se reinicia pero los cambios están ahí! buena solución :)
Ibrahim Yesilay
-1

Otra forma es pegarlo en la sección de comandos de la implementación:

...
command: [ "echo", "
  option = value\n
  other_option = value\n
" ]
...

Alternativamente, para hacerlo más parecido a ConfigMap, use una implementación adicional que solo alojará esa configuración en la commandsección y la ejecutará kubectl createmientras agrega una 'versión' única a su nombre (como calcular un hash del contenido) y modifica todos los implementaciones que usan esa configuración:

...
command: [ "/usr/sbin/kubectl-apply-config.sh", "
  option = value\n
  other_option = value\n
" ]
...

Probablemente lo publique kubectl-apply-config.shsi termina funcionando.

(no hagas eso; se ve muy mal)

Velkan
fuente