Automatiza tu primer clúster Kubernetes local con Ansible (¡sin complicaciones!)
La revolución del Kubernetes ya está aquí, y si gestionas varios servidores, probablemente ya estés pensando en cómo desplegar, orquestar y automatizar contenedores. Pero, ¿y si pudieras levantar un clúster Kubernetes completo (control plane + nodos de trabajo) desde cero y con solo ejecutar un pequeño playbook de Ansible? Hoy te traigo un playbook práctico para desplegar Kubernetes en dos o más nodos Ubuntu, ideal para desarrolladores y para quienes buscan un entorno de pruebas robusto.
¿Por qué usar Ansible para Kubernetes?
- Automatizas no solo la instalación, sino la configuración de los nodos y herramientas adicionales.
- Minimizas los errores humanos: evitarás olvidos en pasos críticos.
- ¡Escalable! Añadir nuevos nodos al clúster es cuestión de modificar el inventario y volver a correr el playbook.
- Perfecto tanto para laboratorios como para entornos de integración/QA.
El Playbook: kube-cluster.yml
Te presento un playbook preparado para Ubuntu Server 22.04+, que instala Docker, kubeadm/kubectl/kubelet y levanta un clúster de 1 master y n workers.
Solo necesitas editar tu inventario de Ansible así:
[masters] k8s-master ansible_host=192.168.56.10 [workers] k8s-worker1 ansible_host=192.168.56.11 k8s-worker2 ansible_host=192.168.56.12
Recuerda sustituir los nombres y direcciones IP por los tuyos.
El Playbook completo
--- - name: Preparar e Instalar Kubernetes Cluster hosts: all become: true vars: kubernetes_version: "1.29.0-00" tasks: - name: Actualizar APT apt: update_cache: yes - name: Instalar dependencias apt: name: - apt-transport-https - ca-certificates - curl - gnupg - lsb-release state: present - name: Instalar Docker apt: name: docker.io state: present - name: Habilitar e iniciar Docker systemd: name: docker enabled: yes state: started - name: Añadir clave GPG de Kubernetes apt_key: url: "https://packages.cloud.google.com/apt/doc/apt-key.gpg" state: present - name: Añadir repositorio de Kubernetes apt_repository: repo: "deb https://apt.kubernetes.io/ kubernetes-xenial main" state: present - name: Instalar kubelet, kubeadm y kubectl apt: name: - kubelet={{ kubernetes_version }} - kubeadm={{ kubernetes_version }} - kubectl={{ kubernetes_version }} state: present update_cache: yes - name: Marcar kubelet como hold apt: name: kubelet state: hold - name: Inicializar el cluster en el master hosts: masters become: true tasks: - name: Inicializar Kubernetes Master shell: "kubeadm init --pod-network-cidr=10.244.0.0/16" args: creates: /etc/kubernetes/admin.conf - name: Crear .kube/config para usuario become_user: "{{ ansible_user }}" shell: | mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config environment: KUBECONFIG: /etc/kubernetes/admin.conf - name: Instalar red Flannel become_user: "{{ ansible_user }}" shell: "kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml" environment: KUBECONFIG: /etc/kubernetes/admin.conf - name: Obtener el join command shell: kubeadm token create --print-join-command register: join_command_output changed_when: false - name: Guardar join command en facts set_fact: join_command: "{{ join_command_output.stdout }}" - name: Unir Workers al cluster hosts: workers become: true tasks: - name: Esperar a que el master esté listo (60s) wait_for: host: "{{ hostvars[groups['masters'][0]]['ansible_host'] }}" port: 6443 timeout: 60 - name: Unir nodo worker al clúster shell: "{{ hostvars[groups['masters'][0]]['join_command'] }} --ignore-preflight-errors=all" args: creates: /etc/kubernetes/kubelet.conf
¿Cómo lo uso?
- Define tu inventario como se muestra arriba.
- Guarda el playbook como
kube-cluster.yml
. - Ejecuta:
ansible-playbook -i hosts.ini kube-cluster.yml
- ¡Ya tienes tu clúster Kubernetes listo!
Consejos Extra y Troubleshooting
- Si la red Flannel no levanta, asegúrate de que los nodos puedan comunicarse entre sí por puertos internos.
- Revisa los logs de kubelet si algún nodo worker no aparece como Ready (
journalctl -u kubelet
). - Para añadir más workers, solo agrega su IP/nombre al grupo
[workers]
en el inventario y ejecuta otra vez el playbook. - Puedes cambiar la red de pods (CIDR) si lo necesitas (por defecto 10.244.0.0/16 para Flannel).
¿Te ha gustado este playbook? Este es perfecto para desarrollar, hacer demos, practicar Helm o testear tus primeras aplicaciones cloud native. Si te interesa una versión preparada para nubes públicas (AWS, Azure, GCP) házmelo saber en los comentarios del blog.