Tutorial para gestionar clústeres de Kubernetes usando funciones Lambda en AWS
Lambda permite ejecutar acciones en un clúster de EKS utilizando la librería del cliente Kubernetes en los lenguajes de programación soportados por AWS Lambda.
Lambda permite ejecutar acciones en un clúster de EKS utilizando la librería del cliente Kubernetes en los lenguajes de programación soportados por AWS Lambda.
POR EMMANUEL CRUZ, SRE - ALPHA TEAM
La posibilidad de gestionar un clúster de Kubernetes mediante código expande las posibilidades para crear integraciones económicas, seguras y eficientes. Por eso, a continuación, te decimos cómo gestionar clústeres de Kubernetes usando funciones Lambda en Amazon Web Services (AWS).
Antes de que sigamos profundizando es necesario mencionar algunos conceptos básicos:
En ocasiones se requiere ejecutar ciertas tareas en un clúster de EKS desde la misma infraestructura de AWS y para ello el uso de kubectl limita las opciones que se tienen para ejecutarlas.
Algunas de las opciones más comunes que se tienen para interactuar con EKS desde AWS son:
La inconveniencia de estas opciones es que dependen de mantener infraestructura (servidores, orquestadores de contenedores, etc.) y que su administración genera costos.
Una alternativa sencilla, segura, rápida y relativamente barata es utilizar funciones AWS Lambda, debido a que es un servicio automático que permite ejecutar código sin aprovisionar o administrar servidores. A continuación, mostramos algunos de los principales conceptos de esta alternativa:
La función Lambda requiere algunos permisos de AWS Identity and Access Management (IAM) y Kubernetes Role Based Access Control (RBAC):
Para lograr que la función Lambda se comunique con EKS mediante código se necesita utilizar la librería del cliente oficial de Kubernetes. Éste permitirá la comunicación con el API de Kubernetes sin la necesidad de usar kubectl. El cliente tiene soporte para varios lenguajes de programación (Go, Python, JavaScript, entre otros).
El código tendrá dos partes:
Ejemplo:
El siguiente fragmento de código en Python lista los pods en el namespace default, en un clúster EKS con endpoint (dirección del API) público.
...
from kubernetes import client, config
...
def lambda_handler(_event, _context):
"Lambda handler"
if cluster_name in cluster_cache:
cluster = cluster_cache[cluster_name]
else:
# not present in cache retrieve cluster info from EKS service
cluster = get_cluster_info()
# store in cache for execution environment reuse
cluster_cache[cluster_name] = cluster
kubeconfig = {
'apiVersion': 'v1',
'clusters': [{
'name': 'cluster1',
'cluster': {
'certificate-authority-data': cluster["ca"],
'server': cluster["endpoint"]}
}],
'contexts': [{'name': 'context1', 'context': {'cluster': 'cluster1', "user": "user1"}}],
'current-context': 'context1',
'kind': 'Config',
'preferences': {},
'users': [{'name': 'user1', "user" : {'token': get_bearer_token()}}]
}
config.load_kube_config_from_dict(config_dict=kubeconfig)
v1_api = client.CoreV1Api() # api_client
ret = v1_api.list_namespaced_pod("default")
return f"There are {len(ret.items)} pods in the default namespace."
print(lambda_handler(None, None))
Básicamente lo que hace la función Lambda es:
Como se puede ver, el uso de una función Lambda permite ejecutar acciones en un clúster de EKS de una manera consistente y segura, utilizando la librería del cliente Kubernetes en cualquiera de los lenguajes de programación soportados por AWS Lambda.
Los casos de uso son demasiados y estarán limitados sólo por el tipo de tareas que se deseen realizar con el clúster de EKS. Algunos de los casos más comunes serian:
El ejemplo del código sólo usa una acción de lectura. La documentación del cliente para Kubernetes tiene el listado completo de APIs y los métodos disponibles para realizar las acciones de lectura, escritura y ejecución.
Por último, cabe mencionar que si se requiere que la función Lambda se conecte a un clúster EKS con endpoint privado o público con Allowlist restringido, la función Lambda necesitara las configuraciones, permisos y reglas correspondientes de redes para poder alcanzar el endpoint del clúster.