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.
[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).
[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.
- Task: main.yml
- Task: install.yml
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
Gestión de paquetes y Versioning Pinning para evitar el drift de configuración.
---
- name: Instalar binarios de Kubernetes
ansible.builtin.apt:
name:
- kubelet
- kubeadm
- kubectl
state: present
notify: Reload systemd
- name: Prevenir actualización automática (hold)
ansible.builtin.dpkg_selections:
name: "{{ item }}"
selection: hold
loop: [kubelet, kubeadm, kubectl]
- name: Habilitar servicio kubelet
ansible.builtin.systemd:
name: kubelet
enabled: yes
state: started
4. Análisis de Ingeniería (Interview Ready)
Durante el desarrollo de este proyecto, se implementaron las siguientes mejores prácticas de DevOps:
- Idempotencia: Los playbooks pueden ejecutarse múltiples veces sin alterar el estado final si el clúster ya está configurado correctamente.
- Mantenibilidad: El uso de variables (
k8s_version) permite actualizar la versión de todo el clúster cambiando un solo valor endefaults/main.yml. - Handlers: Solo reiniciamos el
kubeletsi ha habido un cambio real en los archivos de configuración o binarios, minimizando el downtime de los nodos. - Seguridad: El uso de
remote_user: candidatecon privilegios de sudo controlados garantiza el principio de mínimo privilegio.
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: