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?