Actualice k8s ConfigMap o Secret sin eliminar el existente

100

He estado usando K8S ConfigMap y Secret para administrar nuestras propiedades. Mi diseño es bastante simple, mantiene los archivos de propiedades en un repositorio de git y usa un servidor de compilación como Thoughtworks GO para implementarlos automáticamente para que sean ConfigMaps o Secrets (en la condición de elección) en mi clúster k8s.

Actualmente, descubrí que no es realmente eficiente que siempre tenga que eliminar el ConfigMap y Secret existentes y crear el nuevo para actualizar como se muestra a continuación:

  1. kubectl delete configmap foo

  2. kubectl create configmap foo --from-file foo.properties

¿Existe una forma agradable y sencilla de hacer que el paso anterior sea más eficiente que eliminar el actual? potencialmente, lo que estoy haciendo ahora puede comprometer el contenedor que usa estos mapas de configuración si intenta montar mientras se elimina el mapa de configuración anterior y no se ha creado el nuevo.

Gracias por adelantado.

James Jiang
fuente
Acabo de crear un proyecto para mapear el mapa de configuración a los valores del entorno automáticamente, puede ser útil para alguien. github.com/Acanguven/kubernetes-configmap-update
Ahmet Can Güven

Respuestas:

161

Puede obtener YAML desde el kubectl create configmapcomando y canalizarlo kubectl replace, así:

kubectl create configmap foo --from-file foo.properties -o yaml --dry-run | kubectl replace -f -
Jordan Liggitt
fuente
3
Pipe the command es el camino a seguir, ¡no estaba pensando en --dry-run que parece ser la parte clave del comando!
James Jiang
5
Por lo que vale, este mismo patrón puede funcionar para Secrets además del ejemplo de ConfigMaps que se muestra aquí.
rwehner
2
intentando esto con kubernetes 1.10 pero sigo recibiendo el errorerror: error validating "STDIN": error validating data: [apiVersion not set, kind not set]; if you choose to ignore these errors, turn validation off with --validate=false
yee379
2
eso es un error en 1.10 resuelto en 1.10.1 - ver github.com/kubernetes/kubernetes/issues/61780 y github.com/kubernetes/kubernetes/pull/61808
Jordan Liggitt
2
Gran respuesta. usando en kubectl applylugar de kubectl replace, funcionará tanto para el mapa de
configuración
34

Para referencia futura, kubectl replaceahora es una forma muy práctica de lograr esto.

kubectl replace -f some_spec.yaml Le permite actualizar un configMap completo (u otros objetos)

Ver documentos y ejemplos directamente aquí

Copiar / pegar de la ayuda:

# Replace a pod using the data in pod.json.
kubectl replace -f ./pod.json

# Replace a pod based on the JSON passed into stdin.
cat pod.json | kubectl replace -f -

# Update a single-container pod's image version (tag) to v4
kubectl get pod mypod -o yaml | sed 's/\(image: myimage\):.*$/\1:v4/' | kubectl replace -f -

# Force replace, delete and then re-create the resource
kubectl replace --force -f ./pod.json
Sébastien Portebois
fuente
2
Esto no cumplió con el --from-filerequisito. Los mapas de configuración se pueden crear a partir de un archivo arbitrario, no solo el archivo yaml.
Dave Hillier
@ sébastien-portebois ¡gracias! No conocía la --forceopción, qué nos permitiría usar el <dry-run ConfigMap creation> | kubectl replace --force -f -comando de aproximación incluso la primera vez, cuando el ConfigMap aún no existe. Pero no estoy seguro de si es seguro eliminar el ConfigMap ya que los Pods pueden romperse durante su falta debido a que no lo encuentran. ¿Quizás es mejor el enfoque <dry-run ConfigMap creation> | kubectl apply -f -? Este punto fue introducido por @ karthic-c, ¿qué piensas? También @ jordan-liggitt, ¿qué piensas?
Alex MM
19

Para pequeños cambios en configMap, useedit

kubectl edit configmap <cfg-name>

Esto abrirá configMap en el vieditor. Realice los cambios y guárdelo.

bucear profundo
fuente
1
Frio. Sin embargo, como OP mencionó, se trata de cómo lograr el objetivo con procesos automatizados, por ejemplo. con ThoughtWorks Go como servidor de construcción en mi escenario.
James Jiang
5

kubectl replace falla si ya existe un mapa de configuración:

$ kubectl create configmap foo --from-file foo.properties -o yaml --dry-run | kubectl replace -f -

Error from server (NotFound): error when replacing "STDIN": configmaps "falco-config" not found

La mejor solución es usar el kubectl applyque crearía el mapa de configuración si no está presente; de ​​lo contrario, actualice el mapa de configuración si está presente:

$ kubectl create configmap foo --from-file foo.properties -o yaml --dry-run | kubectl apply -f -

configmap/falco-config configured

Karthik C
fuente
6
Creo que te refieres a " kubectl replacefalla si no existe un mapa de configuración ".
David Dooling