Automatiza tu primer clúster Kubernetes local con Ansible (¡sin complicaciones!)

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?

  1. Define tu inventario como se muestra arriba.
  2. Guarda el playbook como kube-cluster.yml.
  3. Ejecuta:
    ansible-playbook -i hosts.ini kube-cluster.yml
  4. ¡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.

Avatar

Por Mid