Crear un cluster Kubernetes en Fedora

Bradley G Smith, Versión F37,F38,F39,F40,rawhide Last review: 2024-07-24

Esta página analiza fuentes de software de terceros que no están afiliadas ni respaldadas oficialmente por el Proyecto Fedora. Úselas a su propia discreción. Fedora recomienda el uso de software libre y de código abierto, y evitar el software protegido por patentes.

Creación de un clúster de Kubernetes con kubeadm usando rpms de Fedora

Debajo está una guía para crear un cluster Kubernete funcional sobre una máquina Fedora que es apropiada como un entorno de aprendizaje y exploración. Esta guía no se intenta crear un entorno de producción.

La guía de abajo generalmente sigue y propone sustancialmente desde la guía Crear un clúster con kubeadm creada por el equipo de Kubernetes.

Fedora 41 has both versioned and unversioned (v1.29) Kubernetes rpms. Kubernetes 1.29 is no longer supported by the Kubernetes community.

  1. Actualiza el sistema con DNF. Reinicia si es necesario, sin embargo un reinicio puede ser diferido hasta tras el siguiente paso.

    sudo dnf update
  2. Desactivar el intercambio. El proceso de instalación de kubeadm generará una advertencia si se detecta el intercambio (consulte este ticket para más detalles). En un entorno de aprendizaje y laboratorio, puede ser más fácil desactivar el intercambio. El intercambio se puede dejar activado si se desea y kubeadm está configurado para no detenerse si se detecta. Los sistemas Fedora modernos usan zram por defecto. Reinicie después de desactivar el intercambio.

    sudo systemctl stop swap-create@zram0
    sudo dnf remove zram-generator-defaults
    sudo reboot now
  3. SELinux. La mayoría de las guías para instalar Kubernetes en Fedora recomiendan deshabilitar SELinux. Kubernetes funcionará correctamente con SELinux habilitado y muchos contenedores funcionarán correctamente. Si surgen problemas, deshabilitar SELinux podría ser una opción. Consulte the Quick Doc SELinux guide to changing SELinux states para obtener más información.

  4. Deshabilita el cortafuegos. Kubeadm generará una advertencia de instalación si el cortafuegos está en ejecución. Deshabilitar el cortafuegos elimina un origen de complexidad en un entorno de aprendizaje. Los sistemas modernos de Fedora utilizan firewalld.

    sudo systemctl disable --now firewalld

    Consulte la sección de Reglas de Cortafuegos en el artículo de Roman Gherta Kubernetes with CRI-O on Fedora 39 para la mejor manera de configurar el cortafuegos de Fedora para trabajar con Kubernetes,

    El listado actual de puertos y protocolos utilizados para un cluster Kubernetes puede encontrarse en https://kubernetes.io/docs/reference/networking/ports-and-protocols/.

  5. Instala iptables e iproute-tc. Los paquetes rpm más recientes de Kubernetes incluyen estos paquetes de forma predeterminada.

    sudo dnf install iptables iproute-tc
  6. Configure el reenvío de IPv4 y los filtros de puente. A continuación, se muestra información copiada del siguiente https://kubernetes.io/docs/setup/production-environment/container-runtimes/

    sudo cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
    overlay
    br_netfilter
    EOF
  7. Cargue los módulos de filtro de superposición y puente.

    sudo modprobe overlay
    sudo modprobe br_netfilter
  8. Agregue los parámetros sysctl requeridos y persista.

    # sysctl params required by setup, params persist across reboots
    sudo cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
    net.bridge.bridge-nf-call-iptables  = 1
    net.bridge.bridge-nf-call-ip6tables = 1
    net.ipv4.ip_forward                 = 1
    EOF
  9. Aplica parámetros sysctl sin un reinicio.

    sudo sysctl --system
  10. Verify br_filter and overlay modules are loaded.

    lsmod | grep br_netfilter
    lsmod | grep overlay
  11. Verifique que las variables del sistema net.bridge.bridge-nf-call-iptables, net.bridge.bridge-nf-call-ip6tables y net.ipv4.ip_forward estén fijadas en 1 en su configuración de sysctl ejecutando el siguiente comando:

    sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward
  12. Install a container runtime. CRI-O is installed in this example. Containerd is also an option. Note: If using CRI-O, verify that the major:minor version of cri-o is the same as the version of Kubernetes (installed below). CRI-O rpms are versioned like Kubernetes rpms. Install the CRI-O version that matches the target Kubernetes version.

    sudo dnf install cri-o1.31 containernetworking-plugins
  13. Compruebe las versiones de Kubernetes disponibles. Si no está seguro de qué versiones de Kubernetes están disponibles actualmente en Fedora 41 o versiones posteriores, el siguiente comando puede ser útil. En el ejemplo a continuación, los RPM con versiones de Kubernetes 1.29, 1.30, 1.31 y 1.32 están disponibles en Fedora 41. Puede encontrar información actualizada sobre las versiones compatibles y las fechas de finalización en el Historial de versiones, página mantenida por el equipo de Kubernetes.

    sudo dnf list kubernetes1.??

    La salida se verá así:

    > sudo dnf list kubernetes1.??
    Updating and loading repositories:
    Repositories loaded.
    Available packages
    kubernetes1.29.x86_64 1.29.11-2.fc41 updates
    kubernetes1.30.x86_64 1.30.7-1.fc41  updates
    kubernetes1.31.x86_64 1.31.3-1.fc41  updates
    kubernetes1.32.x86_64 1.32.0-1.fc41  updates
  14. Instalar Kubernetes. En este ejemplo, las tres aplicaciones de Kubernetes (kubectl, kubelet y kubeadm) están instaladas en esta máquina de un solo nodo. Consulte las notas anteriores sobre los paquetes recomendados para el plano de control o los nodos de trabajo si el clúster tendrá ambos tipos de máquinas.

    sudo dnf install kubernetes1.31 kubernetes1.31-kubeadm kubernetes1.31-client
  15. Inicia y habilita cri-o.

    sudo systemctl enable --now crio
  16. Extraiga las imágenes del contenedor del sistema necesarias para Kubernetes. Esto es opcional. El comando kubeadm init a continuación extraerá las imágenes, si es necesario.

    sudo kubeadm config images pull
  17. Inicie y habilite kubelet. Kubelet entrará en un bucle de fallos hasta que se inicialice el clúster en el siguiente paso.

    sudo systemctl enable --now kubelet
  18. Inicializar el cluster.

    sudo kubeadm init --pod-network-cidr=10.244.0.0/16
  19. kubeadm generará una salida en la terminal que rastrea los pasos de inicialización. Si se ejecuta correctamente, se mostrará la salida a continuación. En este punto, hay un clúster ejecutándose en esta única máquina. Una vez finalizado kubeadm, debería ver:

    ¡Su plano de control de Kubernetes se ha inicializado correctamente!
    
    Para comenzar a usar su clúster, debe ejecutar lo siguiente como usuario normal:
    
      mkdir -p $HOME/.kube
      sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
      sudo chown $(id -u):$(id -g) $HOME/.kube/config
    
    Alternativamente, si es el usuario root, puede ejecutar:
    
      export KUBECONFIG=/etc/kubernetes/admin.conf
  20. Los pasos anteriores permiten que un usuario no root use kubectl, la herramienta de línea de comandos de Kubernetes. Ejecute estos comandos ahora.

    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
  21. Permita que la máquina del plano de control también ejecute pods para aplicaciones. De lo contrario, se necesita más de una máquina en el clúster.

    kubectl taint nodes --all node-role.kubernetes.io/control-plane-
  22. Instale Flannel en el clúster para proporcionar conectividad de red. Existen muchas otras soluciones de red además de Flannel. Flannel es sencillo y adecuado para esta guía.

    kubectl apply -f https://github.com/coreos/flannel/raw/master/Documentation/kube-flannel.yml
  23. Display list of running pods in the cluster. All pods should display a status of Running. A status of CrashLoopBackOff may show up for the coredns pod. This happens commonly when installing Kubernetes on a virtual machine and the DNS service in the cluster may not select the proper network. Use your favorite internet search engine to find possible solutions. See also the troubleshooting section below for two possible solutions.

    kubectl get pods --all-namespaces

En este punto hay una sola máquina en el clúster que ejecuta el plano de control y está disponible para trabajar como nodo.

Upgrades to Kubernetes clusters requires care and planning. See Upgrading kubeadm clusters for more information.

The DNF Versionlock plugin is useful in blocking unplanned updates to Kubernetes rpms. Occasionally, the Kubernetes version in a Fedora release reaches end-of-life and a new version of Kubernetes is added to the repositories. Or, an upgrade to Fedora on a cluster machine will also result in a different version of Kubernetes. Once DNF Versionlock is installed, the following command will hold kubernetes rpms and the cri-o rpm at the 1.31 major:minor version but still allow patch updates to occur:

sudo dnf versionlock add kubernetes*-1.31.* cri-o-1.31.*

Troubleshooting CrashLoopBackOff

The CoreDNS team provides a guide to troubleshooting loops in Kubernetes clusters with several options to help resolve the problem.

A "quick and dirty" option, as described by the CoreDNS team, is to edit the CoreDNS configmap using kubectl. In the configmap, replace forward . /etc/resolv.conf with the IP address of the DNS server for your network. If the DNS server has an IP address of 192.168.110.201 then the result would look like forward . 192.168.110.201. To edit the CoreDNS configmap use:

kubectl edit configmap coredns -n kube-system

kubectl will launch the editor for your instance of Fedora. The Fedora default is nano which can be easily changed.

Otra opción es inhabilitar la resolución del resguardo resuelto por systemd en la máquina que aloja el clúster mediante el código a continuación. Muchas gracias a @jasonbrooks (https://pagure.io/user/jasonbrooks) por su revisión y recomendaciones.

sudo mkdir -p /etc/systemd/resolved.conf.d/
sudo cat <<EOF | sudo tee /etc/systemd/resolved.conf.d/stub-listener.conf
[Resolve]
DNSStubListener=no
EOF