Saltar al contenido principal

Orquestación de Kubernetes con Ansible

Este proyecto demuestra la capacidad de gestionar configuraciones complejas de forma idempotente y escalable. Hemos diseñado un rol de Ansible (kubernetes_bootstrap) que automatiza el ciclo de vida de la instalación de binarios v1.35 en un entorno multi-nodo.

1. Diseño de la Configuración (ansible.cfg)

Hemos optimizado la comunicación SSH y la salida visual para mejorar la experiencia de depuración del ingeniero.

ansible.cfg
[defaults]
# 1. Definimos el inventario y usuario
inventory = ./inventory.ini
remote_user = candidate
host_key_checking = False

# 2. ELIMINACIÓN DEL ERROR DEL CALLBACK
# En lugar de usar 'yaml', usamos el plugin 'default' de ansible-core
stdout_callback = ansible.builtin.default
# Activamos los callbacks para comandos ad-hoc (como el ping)
bin_ansible_callbacks = True

# 3. SILENCIAR WARNINGS DE PYTHON
# Esto elimina los mensajes amarillos sobre el descubrimiento del intérprete
interpreter_python = auto_silent

roles_path = ./roles
forks = 5

# 4. CONFIGURACIÓN ESPECÍFICA DEL FORMATO YAML
[callback_default]
# Aquí es donde activamos el formato YAML que antes hacía el plugin externo
result_format = yaml

[ssh_connection]
ssh_args = -C -o ControlMaster=auto -o ControlPersist=60s
pipelining = True

2. Inventario Semántico

El inventario separa las responsabilidades de red de la lógica de negocio, agrupando nodos por función (Masters vs Workers).

inventory.ini.example
[masters]
cluster1-master1 ansible_host=10.2.3.4

[workers]
cluster1-worker1 ansible_host=10.2.3.45
cluster1-worker2 ansible_host=10.2.3.46
cluster1-worker3 ansible_host=10.2.3.47

[k8s_cluster:children]
masters
workers

[k8s_cluster:vars]
ansible_user=candidate

3. Implementación del Rol: kubernetes_bootstrap

La arquitectura del rol sigue el principio de Responsabilidad Única, dividiendo las tareas en unidades lógicas.

Este es el orquestador del rol que detecta el sistema operativo y llama a las subtareas.

---
- name: Actualizar cache de APT y Upgrade de sistema
ansible.builtin.apt:
upgrade: dist
update_cache: yes
when: ansible_os_family == "Debian"

- ansible.builtin.include_tasks: setup_repo.yml
- ansible.builtin.include_tasks: install.yml

4. Análisis de Ingeniería (Interview Ready)

Durante el desarrollo de este proyecto, se implementaron las siguientes mejores prácticas de DevOps:

  1. Idempotencia: Los playbooks pueden ejecutarse múltiples veces sin alterar el estado final si el clúster ya está configurado correctamente.
  2. Mantenibilidad: El uso de variables (k8s_version) permite actualizar la versión de todo el clúster cambiando un solo valor en defaults/main.yml.
  3. Handlers: Solo reiniciamos el kubelet si ha habido un cambio real en los archivos de configuración o binarios, minimizando el downtime de los nodos.
  4. Seguridad: El uso de remote_user: candidate con privilegios de sudo controlados garantiza el principio de mínimo privilegio.
Puntos Clave para la Entrevista

Si te preguntan por qué Ansible y no solo Bash: "Ansible nos permite garantizar el Estado Deseado y facilita la escalabilidad. Si mañana necesitamos 100 workers, solo hay que añadirlos al inventory.ini y ejecutar el playbook; con Bash, el manejo de errores sería inmanejable".


Documentación Relacionada: