Automatizar la configuración de ACLs en LKE con Linode CLI

Ya sea por segregar ambientes, pruebas de compatibilidad de versiones, o preferencias personales, existen muchos escenarios en que un equipo necesita tener acceso a múltiples clústeres de Kubernetes. Esto conlleva a diferentes retos de administración, uno de los cuales es la restricción de la comunicación con el cluster.

Además de la protección de las credenciales de acceso, y la asignación de los permisos usando el principio de mínimo privilegio, otra de las herramientas que podemos aprovechar es la restricción a nivel de IPs.

En el caso de Linode Kubernetes Engine (LKE), esto se logra con la configuración de ACLs. Si bien es un proceso bastante sencillo de hacer, replicar la misma configuración en múltiples clústeres puede ser tedioso y sujeto a errores. En este post veremos como automatizar este trabajo usando la CLI de Linode.

El primer paso es definir las IPs que queremos usar en nuestro ACL. Como primer ejemplo, voy a usar la IP pública del lugar donde me conecto la mayor parte del tiempo, obteniendo la información del sitio ipinfo

~ IP=$(curl https://ipinfo.io/ip)
~ echo $IP

XXX.XXX.XXX.93

Ahora vamos a listar todos los clusters en mi cuenta usando el CLI de Linode

~ linode lke clusters-list

| id     │ label     │ region […]
├────────┼───────────┼───────
│ 999997 │ lke-mia   │ us-mia […]
├────────┼───────────┼───────
│ 999998 │ lke-e-mia │ us-mia […]

En el resultado podemos ver distintos valores, pero en este caso sólo nos interesa el id del cluster LKE, que usaremos como parámetro más adelante, por lo que agregaremos parámetros adicionales a nuestro comando de modo que ignoremos todo lo demás.

~ linode lke clusters-list --format id --text --no-headers
  • format = seleccionar solamente los campos que nos interesan
  • text = quitar el formato tabla
  • no-headers = obtener solo los valores, sin encabezados

dando como resultado algo así:

999997
999998

Con estos valores podemos iterar para ejecutar la configuración que deseamos. Probemos primero que obtenemos los mismos resultados

~ linode lke clusters-list --format id --text --no-headers | while read -r line;\
do \
echo Configurando ACL para el cluster con ID $line; \
done

Finalmente, el script completo queda así

~ linode lke clusters-list --format id --text --no-headers | while read -r line;\
do \
echo Configurando ACL para el cluster con ID $line; \
linode lke cluster-acl-update $line \
--acl.addresses.ipv4 $IP \
--acl.enabled true \
done

El resultado que obtenemos es

Configurando ACL para el cluster con ID 999997
┌─────────────┬────────────────────┬────────────────────┬──────────────────────────────────┐
│ acl.enabled │ acl.addresses.ipv4 │ acl.addresses.ipv6 │ acl.revision-id                  │
├─────────────┼────────────────────┼────────────────────┼──────────────────────────────────┤
│ True        │ XXX.XXX.XXX.93     │                    │ f1b4ce5f1cd044ceac9dacef91aa8682 │
└─────────────┴────────────────────┴────────────────────┴──────────────────────────────────┘
Configurando ACL para el cluster con ID 999998
┌─────────────┬────────────────────┬────────────────────┬──────────────────────────────────┐
│ acl.enabled │ acl.addresses.ipv4 │ acl.addresses.ipv6 │ acl.revision-id                  │
├─────────────┼────────────────────┼────────────────────┼──────────────────────────────────┤
│ True        │ XXX.XXX.XXX.93     │                    │ c5b9d711ef8a4095bae316ccd7cb4124 │
└─────────────┴────────────────────┴────────────────────┴──────────────────────────────────┘

Con esto tenemos una manera sencilla de asegurarnos de que sólo puede accederse desde la IP que decidimos al control plane de todos los clústeres de LKE de nuestra cuenta.

Ahora que pasa si necesitamos múltiples IPs?

En ese caso podemos colocarlas como lista en otra variable, 

~ IPs=(XXX.XXX.XXX.168 XXX.XXX.XXX.31)

y crear dinámicamente los argumentos necesarios.

~ args=--acl.enabled=true; \
for ip in $IPs; \
do \
args+=( --acl.addresses.ipv4 $ip); \
done

Modificamos el script para leer los argumentos de la variable, quedando de la siguiente manera

~ linode lke clusters-list --format id --text --no-headers | while read -r line;\
do \
echo Configurando ACL para el cluster con ID $line; \
linode lke cluster-acl-update $line $args
done

Conclusión

Aunque la UI de Akamai Cloud es bastante intuitiva y fácil de utilizar, muchas veces resulta más eficiente aprovechar otras herramientas para automatizar las tareas que pueden darnos dolores de cabeza en el futuro. A la vez que tenemos menos trabajo repetitivo, esto nos deja con más tiempo para cosas que realmente valen la pena.

Latest Posts