Blog

Múltiples ficheros de configuración de Kubernetes

Múltiples ficheros de configuración de Kubernetes

Basado en https://releasehub.com/blog/how-to-make-kubernetes-config-files-not-suck

Este artículo trata sobre mantener ficheros de configuración de Kubernetes de cada entorno por separado. La gracia es asegurarse de dónde estamos ejecutando kubectl en cada momento, especificando el entorno explícitamente. De esta manera se evita aplicar por error configuraciones de test/desarrollo en producción y viceversa.

Escribiendo ficheros de configuración

Primero guardamos ficheros por separado para cada cluster (en el artículo de arriba explica también cómo separar credenciales AWS mediante la variable AWS_PROFILE):

j@bt ~ % AWS_PROFILE=prod aws eks --region eu-west-1 update-kubeconfig --name prod --kubeconfig=~/.kube/config-prod
Added new context arn:aws:eks:eu-west-1:481117482695:cluster/prod to /home/j/.kube/config-prod

j@bt ~ % AWS_PROFILE=test aws eks --region eu-west-1 update-kubeconfig --name test --kubeconfig=~/.kube/config-test            
Added new context arn:aws:eks:eu-west-1:576759405678:cluster/test to /home/j/.kube/config-test

Borramos o renombramos ~/.kube/config para que deje de tener efecto:

mv ~/.kube/config /.kube/_config

Especificando entorno mediante –kubeconfig

Ahora podemos especificar el entorno seleccionando el fichero de configuración mediante --kubeconfig:

j@bt ~ % kubectl get pods --kubeconfig ~/.kube/config-prod 
NAME                                                   READY   STATUS      RESTARTS        AGE
[...]

j@bt ~ % kubectl get pods --kubeconfig ~/.kube/config-test           
NAME                                      READY   STATUS      RESTARTS      AGE
[...]

Especificando entorno mediante –context

Ahora en .bash_profile (shell bash), o, en mi caso, .zshrc (shell zsh):

# https://medium.com/@alexgued3s/multiple-kubeconfigs-no-problem-f6be646fc07d
KUBE_CONFIG_FILES=$(find ~/.kube -type f -name "config*" -not -name "*.bak" -printf '%p:')
export KUBECONFIG="${KUBE_CONFIG_FILES%:}" # trim last colon # https://stackoverflow.com/a/34864713

Este script guarda en KUBECONFIG todos los ficheros de ~/.kube que empiecen por «config» y no terminen en «.bak«, porque a veces guardo copias de seguridad con extensión «.bak«. Se separan los ficheros por dos puntos (:).

Cerramos y abrimos la terminal y comprobamos:

j@bt ~ % echo $KUBECONFIG
/home/j/.kube/config-test:/home/j/.kube/config-prod

Ahora podremos utilizar --context en lugar de --kubeconfig:

j@bt ~ % kubectl get pods --context test
[...]
j@bt ~ % kubectl get pods --context prod
[...]

Borrando contexto por defecto

Sin embargo, todavía hay un contexto por defecto (que funciona sin escribir --context):

j@bt ~ % kubectl config current-context
test

Lo borramos, tantas veces como ficheros kubeconfig tengamos:

j@bt ~ % kubectl config unset current-context
Property "current-context" unset.
j@bt ~ % kubectl get pods
NAME                                                   READY   STATUS      RESTARTS     AGE
alpine-787d886d49-sp2jf                                1/1     Running     0            23h
j@bt ~ % kubectl config unset current-context
Property "current-context" unset.

Ahora ya no hay ningún contexto por defecto:

j@bt ~ % kubectl get pods                    
The connection to the server localhost:8080 was refused - did you specify the right host or port?