Cómo instalar un clúster Kubernetes con Kubeadm en Rocky Linux

Kubernetes o k8s es una plataforma de código abierto para la orquestación de contenedores que automatiza el despliegue, la gestión y el escalado de aplicaciones en contenedores. Kubernetes es una orquestación de contenedores creada por Google, que ahora se ha convertido en un proyecto de código abierto y se ha convertido en un estándar para el despliegue de aplicaciones y plataformas informáticas modernas.

Kubernetes es la solución para la era moderna de despliegue de contenedores. Proporciona descubrimiento de servicios y equilibrio de carga, orquestación de almacenamiento, despliegue y retroceso automatizados, servicio de autorreparación, gestión secreta y de configuración. Kubernetes permite un desarrollo nativo en la nube rentable.

En este tutorial, configurarás el Clúster Kubernetes mediante:

  1. Configurar los sistemas, lo que incluye: configurar el archivo /etc/hosts, configurar SELinux, habilitar los módulos del núcleo y deshabilitar SWAP.
  2. Configurar Firewalld añadiendo algunos puertos necesarios para Kubernetes.
  3. Instalar containerd como tiempo de ejecución de contenedores para Kubernetes.
  4. Instalar paquetes de Kubernetes como kubelet, kubeadm y kubectl.
  5. Instalar el plugin de red Flannel para Kubernetes Pods.
  6. Inicializar un nodo del plano de control y añadir dos nodos trabajadores.

Requisitos previos

Para completar este tutorial, necesitarás los siguientes requisitos:

  • Tres o más servidores Linux Rocky.
  • Un usuario no root con privilegios de root/administrador.

Configuración de los sistemas

Antes de empezar a instalar cualquier paquete para el despliegue de Kubernetes, tendrás que configurar todos tus sistemas como se requiere para el despliegue de Kubernetes. Esto incluye las siguientes configuraciones:

  • Configurar correctamente el archivo /etc/hosts: Cada nombre de host del servidor debe resolverse en la dirección IP correcta. Esto puede hacerse de varias maneras, pero la más fácil y sencilla es utilizando el archivo /etc/hosts en todos los servidores.
  • Configura Firewalld: Para el entorno de producción, siempre es recomendable habilitar el cortafuegos tanto en el plano de control como en los nodos trabajadores.
  • ConfiguraSELinux: Para este ejemplo, cambiaremos la regla por defecto del SELinux a «permisivo».
  • Habilita los Módulos del núcleo: Kubernetes requiere que se habiliten algunos módulos del kernel en el sistema Linux. Los módulos del kernel «overlay» y «br_netfilter» son necesarios para que iptables pueda ver el tráfico en puente.
  • Desactivar SWAP: Esto es obligatorio, debes desactivar SWAP en todos los nodos Kubernetes, tanto en el plano de control como en los nodos trabajadores. De lo contrario, el servicio kubelet funcionará con problemas.

Configurar el archivo /etc/hosts

En este primer paso, configurarás el nombre de host del sistema y el archivo /etc/hosts en todos tus servidores. Para esta demostración, utilizaremos los siguientes servidores.

Hostname              IP Address        Used as
-------------------------------------------------------
kube-master           192.168.5.10      control-plane
kube-kube-worker1     192.168.5.15      worker node
kube-kube-worker2     192.168.5.16      worker node

Ejecuta el siguiente comando hostnamectl para configurar el nombre de host del sistema en cada servidor.

Para el nodo del plano de control, ejecuta el siguiente comando para configurar el nombre de host del sistema en«kube-master«.

sudo hostnamectl set-hostname kube-master

Para los nodos trabajadores de Kubernetes, ejecuta el siguiente comando hostnamectl.

# setup hostname kube-worker1
sudo hostnamectl set-hostname kube-worker1

# setup hostname kube-worker2
sudo hostnamectl set-hostname kube-worker2

A continuación, modifica el archivo /etc/hosts en todos los servidores mediante el siguiente comando.

sudo nano /etc/hosts

Añade la siguiente configuración al archivo. Asegúrate de que cada nombre de host apunta a la dirección IP correcta.

192.168.5.10 kube-master
192.168.5.15 kube-worker1
192.168.5.16 kube-worker2

Guarda y cierra el archivo cuando hayas terminado.

Por último, si ejecutas el comando ping contra cada nombre de host, se te apuntará a la dirección IP correcta definida en el archivo /etc/hosts.

ping kube-master -c3
ping kube-worker1 -c3
ping kube-worker2 -c3

Configurar las reglas Firewalld

Kubernetes requiere que algunos puertos estén abiertos en todos tus sistemas. En el sistema por defecto basado en RHEL, Firewalld es la aplicación cortafuegos por defecto. Añadirás algunos puertos al Firewalld para el despliegue de Kubernetes.

Para el plano de control de Kubernetes, debes abrir los siguientes puertos:

Protocol  Direction Port Range  Purpose Used By
-----------------------------------------------
TCP       Inbound   6443        Kubernetes API server All
TCP       Inbound   2379-2380   etcd server client API  kube-apiserver, etcd
TCP       Inbound   10250       Kubelet API Self, Control plane
TCP       Inbound   10259       kube-scheduler  Self
TCP       Inbound   10257       kube-controller-manager Self

Para los nodos trabajadores de Kubernetes, necesitas abrir los siguientes puertos:

Protocol  Direction Port Range  Purpose Used By
--------------------------------------------------
TCP       Inbound   10250       Kubelet API Self, Control plane
TCP       Inbound   30000-32767 NodePort Services†  All

En el nodo del plano de control«kube-master«, ejecuta el siguiente comando firewall-cmd para abrir los puertos del plano de control de Kubernetes. A continuación, recarga las reglas Firewalld y comprueba la lista de reglas disponibles.

sudo firewall-cmd --add-port=6443/tcp --permanent
sudo firewall-cmd --add-port=2379-2380/tcp --permanent
sudo firewall-cmd --add-port=10250/tcp --permanent
sudo firewall-cmd --add-port=10259/tcp --permanent
sudo firewall-cmd --add-port=10257/tcp --permanent

sudo firewall-cmd –reload
sudo firewall-cmd –list-all

setup firewalld kubernetes plano de control

En los nodos trabajadores«kube-worker1» y«kube-worker2«, ejecuta el siguiente comando firewall-cmd para abrir algunos puertos trabajadores de Kubernetes. A continuación, vuelve a cargar Firewalld y comprueba la lista de reglas disponibles en Firewalld.

sudo firewall-cmd --add-port=10250/tcp --permanent
sudo firewall-cmd --add-port=30000-32767/tcp --permanent

sudo firewall-cmd –reload
sudo firewall-cmd –list-all

setup firewalld kubernetes nodo trabajador

Configura SELinux y los Módulos del Kernel y Desactiva SWAP

Para que el servicio kubelet de Kubernetes funcione correctamente, tendrás que cambiar el SELinux por defecto a «permisivo» o puedes desactivar SELinux por completo. En este ejemplo, cambiarás la política SELinux de «enforcing» a«permissive», lo que significa que sólo recibirás notificaciones de SELinux.

Ejecuta el siguiente comando para cambiar la política SELinux por defecto a «permisiva». A continuación, comprueba y verifica el estado actual de la política SELinux. Deberías ver que SELinux sigue activado, pero con la política «permisiva«.

sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

sestatus

Configuración de SELinux

A continuación, Kubernetes requiere que los módulos del kernel«overlay» y«br_netfilter» estén habilitados en todos los servidores. Esto permitirá que los iptbales vean el tráfico puenteado. Además, tendrás que habilitar el reenvío de puertos y deshabilitar SWAP.

Ejecuta el siguiente comando para habilitar los módulos del núcleo«overlay» y«br_netfilter«.

sudo modprobe overlay
sudo modprobe br_netfilter

Para hacerlo permanente, crea el archivo de configuración en«/etc/modules-load.d/k8s.conf«. Esto permitirá a los sistemas Linux habilitar los módulos del núcleo durante el arranque del sistema.

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

activar módulos del núcleo

A continuación, crea los parámetros sysctl necesarios utilizando el siguiente comando.

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

Para aplicar la nueva configuración de sysctl sin reiniciar el sistema, utiliza el siguiente comando. Deberías obtener la lista de parámetros sysctl por defecto de tu sistema y asegurarte de que obtienes los parámetros sysctl que acabas de añadir en el archivo«k8s.conf«.

sudo sysctl --system

configurar parámetros sysctl

Para desactivar SWAP, tendrás que comentar la configuración de SWAP en el archivo«/etc/fstab«. Esto se puede hacer utilizando el comando simple mediante sed (editor de secuencias) o editando manualmente el archivo /etc/fstab.

sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

o

sudo nano /etc/fstab

Ahora desactiva el SWAP en la sesión actual utilizando el siguiente comando. A continuación, comprueba que el SWAP está desactivado utilizando el comando«free -m«. Deberías ver que el SWAP tiene valores«0», lo que significa que ahora está desactivado.

sudo swapoff -a
free -m

desactivar intercambio

Instalar el tiempo de ejecución del contenedor: Containerd

Para configurar Kubernetes Cluster, debes instalar el tiempo de ejecución del contenedor en todos los servidores para que puedan ejecutarse los Pods. Se pueden utilizar varios tiempos de ejecución de contenedores para los despliegues de Kubernetes, como containerd, CRI-O, Mirantis Container Runtime y Docker Engine (a través de cri-dockerd).

En este ejemplo, utilizaremos «containerd» como contenedor para nuestro despliegue de Kubernetes. Por tanto, instalarás «containerd» en todos los nodos Kubernetes. Y hay varias formas de instalar containerd, la más sencilla es utilizando paquetes binarios preconstruidos proporcionados por el repositorio Docker.

Antes de añadir el repositorio, ejecuta el siguiente comando DNF para instalar herramientas adicionales«dnf-utils«.

sudo dnf install dnf-utils

Ahora ejecuta el siguiente comando para añadir el repositorio Docker para sistemas basados en CentOS.

sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

Ejecuta el siguiente comando para comprobar y verificar los repositorios en tus sistemas Rocky Linux. A continuación, genera una nueva caché de metadatos. Verás que el repositorio Docker se añade a Rocky Linux.

sudo dnf repolist
sudo dnf makecache

añadir repositorio docker

A continuación, instala el paquete containerd utilizando el siguiente comando DNF. Introduce Y para confirmar la instalación y pulsa INTRO, y comenzará la instalación. Cuando se te pida importar la clave GPG de Docker, introduce y para añadirla.

sudo dnf install containerd.io

instala containerd

Una vez finalizada la instalación, ejecuta el siguiente comando para hacer una copia de seguridad de la configuración predeterminada de containerd y generar un nuevo archivo de configuración de containerd.

sudo mv /etc/containerd/config.toml /etc/containerd/config.toml.orig
sudo containerd config default > /etc/containerd/config.toml

Ahora modifica el archivo de configuración containerd«/etc/containerd/config.toml» utilizando el siguiente comando.

sudo nano /etc/containerd/config.toml

Cambia el valor del controlador cgroup«SystemdCgroup = false» por«SystemdCgroup = true«. Esto habilitará el controlador cgroup de systemd para el tiempo de ejecución del contenedor containerd.

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
  ...
  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
    SystemdCgroup = true

Cuando hayas terminado, guarda y cierra el archivo.

A continuación, ejecuta el siguiente comando systemctl para iniciar y habilitar el servicio containerd. Esto hará que el servicio containerd se ejecute automáticamente al arrancar el sistema.

sudo systemctl enable --now containerd

Por último, comprueba y verifica el servicio containerd utilizando el siguiente comando. Deberías ver que el servicio containerd está habilitado y se ejecutará automáticamente al arrancar el sistema. Y el estado actual del servicio containerd es en ejecución.

sudo systemctl is-enabled containerd
sudo systemctl status containerd

start enable containerd

Instalación de paquetes Kubernetes

Has instalado el tiempo de ejecución de contenedores containerd. Ahora instalarás los paquetes Kubernetes en todos tus sistemas Linux Rocky. Esto incluye kubeadm para arrancar el clúster Kubernetes, kubelet el componente principal del clúster Kubernetes, y kubectl la utilidad de línea de comandos para gestionar el clúster Kubernetes.

En este ejemplo, instalaremos paquetes Kubernetes utilizando el repositorio proporcionado por Kubernetes. Por tanto, añadirás el repositorio de Kubernetes a todos tus sistemas Linux Rocky.

Ejecuta el siguiente comando para añadir el repositorio de Kubernetes para los sistemas operativos basados en RHEL/CentOS.

cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
enabled=1
gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF

Ahora comprueba la lista de repositorios y genera una nueva caché de metadatos utilizando el siguiente comando dnf. Y deberías ver que el repositorio de Kubernetes se ha añadido a los sistemas Linux Rocky.

sudo dnf repolist
sudo dnf makecache

añadir repositorio kubernetes

A continuación, instala los paquetes de Kubernetes utilizando el siguiente comando dnf. Introduce Y para confirmar la instalación y pulsa ENTER para continuar, y comenzará la instalación.

sudo dnf install kubelet kubeadm kubectl --disableexcludes=kubernetes

instalar paquetes kubernetes

Una vez finalizada la instalación, ejecuta el siguiente comando systemctl para iniciar y habilitar el servicio kubelet. A continuación, comprueba el servicio kubelet y asegúrate de que está habilitado y en ejecución en todos los nodos.

Este servicio es el servicio principal de Kubernetes que esperará cualquier evento cuando inicialices el clúster o cuando unas el nodo al clúster.

sudo systemctl enable --now kubelet

Instalación del Plugin CNI: Flannel

Kubernetes admite varios plugins de red de contenedores, como AWS VPC para Kubernetes, Azure CNI, Cilium, Calico, Flannel y muchos más. En este ejemplo, utilizaremos Flannel como plugin CNI para el despliegue de Kubernetes. Para ello, deberás instalar el archivo binario de Flannel en todos los nodos Kubernetes.

Ejecuta el siguiente comando para crear un nuevo directorio«/opt/bin«. A continuación, descarga en él el archivo binario de Flannel.

mkdir -p /opt/bin/
sudo curl -fsSLo /opt/bin/flanneld https://github.com/flannel-io/flannel/releases/download/v0.19.0/flanneld-amd64

Ahora haz que el archivo binario «flanneld« sea ejecutable cambiando el permiso del archivo mediante el siguiente comando. Este archivo binario «flanneld» se ejecutará automáticamente cuando configures el complemento de red Pod.

sudo chmod +x /opt/bin/flanneld

descargar flanneld

Inicializar el Plano de Control de Kubernetes

Has finalizado todas las dependencias y requisitos para desplegar el Cluster Kubernetes. Ahora iniciarás el Cluster Kubernetes inicializando el nodo Plano de Control por primera vez. En este ejemplo, el Plano de Control de Kubernetes se instalará en el servidor«kubem-master» con la dirección IP«192.168.5.10«.

Antes de inicializar el nodo del Plano de Control, ejecuta el siguiente comando para comprobar que los módulos del kernel«br_netfilter» están habilitados. Si obtienes una salida del comando, significa que el módulo «br_netfilter» está habilitado.

lsmod | grep br_netfilter

A continuación, ejecuta el siguiente comando para descargar las imágenes necesarias para el Cluster Kubernetes. Este comando descargará todas las imágenes de contenedor necesarias para crear el Cluster Kubernetes, como coredns, kube-api server, etcd, kube-controller, kube-proxy y la imagen de contenedor de pausa.

sudo kubeadm config images pull

comprobar los módulos del núcleo y descargar imágenes

Una vez finalizada la descarga, ejecuta el siguiente comando«kubeadm init» para inicializar el Clúster Kubernetes en el servidor «kube-master«. Este nodo«kube-master» se seleccionará automáticamente como Plano de Control de Kubernetes porque es la primera vez que se inicializa el clúster.

  • Además, en este ejemplo, especificamos que la red para los Pods sea«10.244.0.0/16«, que es el rango de red por defecto para el plugin CNI de Flannel.
  • El parámetro «–apiserver-advertise-address» determina en qué dirección IP se ejecutará el servidor API de Kubernetes; en este ejemplo se utiliza la dirección IP interna«192.168.5.10«.
  • Para la opción«–cri-socket» aquí especificamos el socket CRI al socket de tiempo de ejecución del contenedor que está disponible en«/run/containerd/containerd.sock«. Si utilizas un tiempo de ejecución del contenedor diferente, deberás cambiar la ruta del archivo del socket, o simplemente puedes eliminar esta opción «–cri-socket» porque el kubeadm detectará el socket del tiempo de ejecución del contenedor automáticamente.
sudo kubeadm init --pod-network-cidr=10.244.0.0/16 \
--apiserver-advertise-address=192.168.5.10 \
--cri-socket=unix:///run/containerd/containerd.sock

Cuando finalice la inicialización, podrás ver el mensaje«¡Tu plano de control de Kubernetes se ha inicializado correctamente!» con algunos mensajes de salida importantes para configurar las credenciales de Kubernetes y desplegar el complemento de red Pod, el cómo añadir el nodo trabajador a tu Cluster Kubernetes.

inicializando el plano contaol de kubernetes

Antes de empezar a utilizar el Clúster de Kubernetes, tendrás que configurar las credenciales de Kubernetes. Ejecuta el siguiente comando para configurar las credenciales de Kubernetes.

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

Ahora puedes utilizar el comando«kubectl» para interactuar con tu clúster Kubernetes. Ejecuta el siguiente comando«kubectl» para comprobar la información del clúster de Kubernetes. Y deberías ver el plano de control de Kubernetes y los coredns en ejecución.

kubectl cluster-info

Para obtener información completa sobre tu Kubernetes, puedes utilizar la opción dump – así «kubectl cluster-info dump«.

configura las credenciales de administrador y comprueba la información del clúster

Una vez que el Plano de Control de Kubernetes esté en marcha, ejecuta el siguiente comando para instalar el plugin de red Flannel Pod. Este comando ejecutará automáticamente el archivo binario«flanneld» y ejecutará algunos pods de Flannel.

kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

despliegue del plugin de red de franela

Comprueba la lista de pods en ejecución en tu Kubernetes utilizando el siguiente comando. si tu instalación de Kubernetes se ha realizado correctamente, deberías ver que se están ejecutando todos los pods principales de Kubernetes, entre los que se incluyen los pods de Flannel.

kubectl get pods --all-namespaces

comprobar pods kubernetes

Añadir Nodos Trabajadores a Kubernetes

Tras inicializar el Plano de Control de Kubernetes en el servidor «kube-master», añadirás los nodos trabajadores«kube-worker1» y«kube-worker2» al Cluster Kubernetes.

Desplázate al servidor «kube-worker1» y ejecuta el siguiente comando «kubeadm join» para añadir el«kube-worker1» al Clúster Kubernetes. Es posible que tengas diferentes token y ca-cert-hash, puedes ver los detalles de esta información en el mensaje de salida cuando inicialices el nodo del Plano de Control.

kubeadm join 192.168.5.10:6443 --token wlg23u.r5x2nxw2vdu95dvp \
        --discovery-token-ca-cert-hash sha256:71fd28ac2b8108a3d493648a9c702acd2e39a8a0e7efc07326d7b0384c929066

En la siguiente salida, puedes ver que el servidor«kube-worker1» está unido al Clúster Kubernetes.

añade kube-worker1 al cluster

A continuación, pasa al servidor «kube-worker2» y ejecuta el comando«kubeadm join» para añadir el«kube-worker2» al Cluster Kubernetes.

kubeadm join 192.168.5.10:6443 --token wlg23u.r5x2nxw2vdu95dvp \
        --discovery-token-ca-cert-hash sha256:71fd28ac2b8108a3d493648a9c702acd2e39a8a0e7efc07326d7b0384c929066

Verás el mismo mensaje de salida cuando finalice el proceso.

añade kube-worker2 al cluster

Ahora vuelve al servidor del Plano de Control«kube-master» y ejecuta el siguiente comando para comprobar todos los pods en ejecución de todos los espacios de nombres del Cluster Kubernetes. Deberías ver que hay pods adicionales en cada componente de Kubernetes.

kubectl get pods --all-namespaces

comprueba todas las vainas

Por último, comprueba y verifica todos los nodos disponibles en el Clúster Kubernetes utilizando el comando ‘kubectl» siguiente. Deberías ver que el servidor«kube-master» se ejecuta como Plano de Control de Kubernetes, y que los servidores«kube-worker1» y«kube-worker2» se ejecutan como nodo trabajador.

kubectl get nodes -o wide

comprobar todos los nodos kubernetes

Conclusión

A lo largo de este tutorial, has finalizado el despliegue del Clúster Kubernetes con tres servidores Linux Rocky. El Clúster Kubernetes se está ejecutando con un plano de control y dos nodos trabajadores. Se está ejecutando con el containerd como Container Runtime para tu Cluster Kubernetes, y el plugin de red Flannel para la conexión en red de los Pods en tu cluster. Ya tienes totalmente configurado el Clúster Kubernetes, puedes empezar a desplegar tus aplicaciones en el Clúster Kubernetes o intentar instalar el Panel Kubernetes para conocer mejor tu entorno Kubernetes.

También te podría gustar...