Cómo instalar un clúster de Kubernetes en CentOS 8


El proceso de instalación de un clúster de Kubernetes en CentOS 8 es casi similar al de CentOS 7 (que puede seguir aquí), pero el proceso aquí tiene algunos cambios. Estos cambios, en su mayoría, giran en torno a la instalación de Docker.

A partir de CentOS 8 (y por extensión RHEL 8), la ventana acoplable ahora ha sido reemplazada de forma nativa por podman y buildah, que son herramientas de Redhat. De hecho, el paquete de la ventana acoplable ahora se ha eliminado del repositorio de paquetes predeterminado.

Con este movimiento, el equipo de Redhat pretende simplificar el proceso de creación y uso de contenedores, sin necesidad de permisos especiales, mientras que al mismo tiempo, mantiene la compatibilidad con las imágenes de la ventana acoplable y las opera sin necesidad de un demonio. Podman promete ofrecer más flexibilidad cuando se ejecuta en entornos de Kubernetes, pero el jurado sigue ahí.

Para este artículo, analizaremos el proceso de instalación de Kubernetes en una plataforma CentOS 8, que se ejecuta en Docker-CE (Community Edition). En un artículo posterior, también realizaremos una instalación similar, utilizando podman para nuestros contenedores.

  1. Tres servidores que ejecutan CentOS 8: 1 nodo maestro y 2 nodos de trabajo.
  2. Se recomienda que sus nodos tengan al menos 2 CPU con 2 GB de RAM o más por máquina. Este no es un requisito estricto, pero depende en gran medida de las necesidades de la aplicación que desea ejecutar.
  3. Conectividad a Internet en todos sus nodos. Obtendremos paquetes de Kubernetes y Docker del repositorio. Del mismo modo, deberá asegurarse de que el administrador de paquetes DNF esté instalado de forma predeterminada y pueda recuperar paquetes de forma remota.
  4. Todos sus nodos también deberían poder conectarse entre sí, ya sea en una red pública o privada, la que esté disponible.
  5. También necesitará acceso a una cuenta con privilegios de root o sudo. En este tutorial, usaré mi cuenta raíz.

La mayoría de los nodos generalmente vienen con direcciones MAC únicas; sin embargo, en algunos casos únicos, algunas Máquinas virtuales pueden tener direcciones MAC idénticas. Por lo tanto, se recomienda que confirme que Product_UUID y la dirección MAC no son idénticos en ninguno de los nodos.

Kubernetes usa estos valores para identificar de forma única los nodos del clúster. Si estos valores no son únicos para cada nodo, el proceso de instalación puede fallar.

Para verificar la dirección MAC de la interfaz de red y compararla.

# ip link

Para verificar product_uuid y comparar, ejecute el siguiente comando.

# cat /sys/class/dmi/id/product_uuid 

Nuestra instalación está diseñada para que el Master-Node controle los Worker Nodes. Al final de esta instalación, nuestra arquitectura lógica se verá así.

Nodo maestro: esta máquina generalmente actúa como el plano de control y ejecuta la base de datos del clúster y el servidor API (con el que se comunica la CLI de kubectl).

Nuestro clúster de Kubernetes de 3 nodos se verá así:

Instalación de Kubernetes Cluster en Master-Node

Para que Kubernetes funcione, necesitará un motor de contenedorización. Como se mencionó, usaremos Docker-CE.

Las siguientes instituciones se realizarán en CentOS 8 Master-Node.

En su nodo principal de CentOS 8, configure el nombre de host del sistema y actualice el DNS en su archivo/etc/hosts.

# hostnamectl set-hostname master-node
# cat <<EOF>> /etc/hosts
192.168.0.47 master-node
192.168.0.48 node-1 worker-node-1
192.168.0.49 node-2 worker-node-2
EOF

Luego, haga ping a su worker-node-1 y worker-node-2 para verificar si su archivo de host actualizado está funcionando correctamente usando el comando ping.

# ping 192.168.0.48
# ping 192.168.0.49

A continuación, desactive Selinux, ya que es necesario para permitir que los contenedores accedan al sistema de archivos del host, que necesitan las redes de pod y otros servicios.

# setenforce 0

Establecer setenforce en 0 efectivamente establece SELinux en permissive, lo que efectivamente deshabilita SELinux hasta el próximo reinicio. Para deshabilitarlo por completo, use el siguiente comando y reinicie.

# sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
# reboot

Kubernetes hace uso de varios puertos para la comunicación y el acceso, y estos puertos deben ser accesibles para Kubernetes y no estar limitados por el firewall.

Configure las reglas del firewall en los puertos.

# firewall-cmd --permanent --add-port=6443/tcp
# firewall-cmd --permanent --add-port=2379-2380/tcp
# firewall-cmd --permanent --add-port=10250/tcp
# firewall-cmd --permanent --add-port=10251/tcp
# firewall-cmd --permanent --add-port=10252/tcp
# firewall-cmd --permanent --add-port=10255/tcp
# firewall-cmd --reload
# modprobe br_netfilter
# echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables

Primero deberá agregar el repositorio de Docker, ya que ya no está en la lista de paquetes predeterminados usando el siguiente comando dnf config-manager.

# dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo

También instale el paquete containerd.io, que está disponible como un demonio que administra el ciclo de vida completo del contenedor de su sistema host, desde la transferencia y el almacenamiento de imágenes hasta la ejecución y supervisión del contenedor, el almacenamiento de bajo nivel, los adjuntos de red y más.

# dnf install https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm

Ahora instale la última versión de un paquete docker-ce.

# dnf install docker-ce

Ahora puede habilitar e iniciar el servicio Docker.

# systemctl enable docker
# systemctl start docker

A continuación, deberá agregar los repositorios de Kubernetes manualmente, ya que no vienen instalados de forma predeterminada en CentOS 8.

# cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

Kubeadm lo ayuda a iniciar un clúster de Kubernetes viable mínimo que se ajuste a las mejores prácticas. Con kubeadm, su clúster debe pasar las pruebas de conformidad de Kubernetes.

Kubeadm también admite otras funciones del ciclo de vida del clúster, como actualizaciones, degradaciones y administración de tokens de arranque. Kubeadm también se integra fácilmente con otras herramientas de orquestación como Ansible y Terraform.

Con el repositorio de paquetes ahora listo, puede continuar e instalar el paquete kubeadm.

# dnf install kubeadm -y 

Cuando la instalación se complete correctamente, habilite e inicie el servicio.

# systemctl enable kubelet
# systemctl start kubelet

El maestro de Kubernetes, que actúa como plano de control para el clúster, ejecuta algunos servicios críticos necesarios para el clúster. Como tal, el proceso de inicialización realizará una serie de comprobaciones previas para garantizar que la máquina esté lista para ejecutar Kubernetes. Estas comprobaciones previas exponen advertencias y salen en caso de errores. kubeadm init luego descarga e instala los componentes del plano de control del clúster.

Ahora es el momento de inicializar el maestro de Kubernetes, pero antes de eso, debe deshabilitar el intercambio para ejecutar el comando "kubeadm init".

# swapoff -a

La inicialización del maestro de Kubernetes es un proceso completamente automatizado que se controla mediante el comando "kubeadm init", como se muestra.

# kubeadm init

A continuación, copie el siguiente comando y guárdelo en algún lugar, ya que es necesario ejecutar este comando en los nodos trabajadores más adelante.

kubeadm join 192.168.0.47:6443 --token nu06lu.xrsux0ss0ixtnms5  \ --discovery-token-ca-cert-hash ha256:f996ea35r4353d342fdea2997a1cf8caeddafd6d4360d606dbc82314683478hjmf7

Sugerencia: A veces, el comando anterior puede arrojar errores sobre los argumentos pasados, por lo que para evitar errores, debe eliminar el carácter ‘\’ y su comando final se verá así.

# kubeadm join 192.168.0.47:6443 --token nu06lu.xrsux0ss0ixtnms5 –discovery token-ca-cert-hash sha256:f996ea35r4353d342fdea2997a1cf8caeddafd6d4360d606dbc82314683478hjmf7

Una vez que Kubernetes se haya inicializado correctamente, debe permitir que su usuario comience a usar el clúster. En nuestro escenario, usaremos el usuario root. También puede iniciar el clúster usando sudo user como se muestra.

Para usar root, ejecute:

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

Para usar un usuario habilitado para sudo, ejecute:

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

Ahora confirme que el comando kubectl está activado.

# kubectl get nodes

En este momento, verá que el estado del nodo principal es "NotReady". Esto se debe a que aún no hemos implementado la red de pod en el clúster.

La red de pod es la red superpuesta para el clúster, que se implementa en la parte superior de la red de nodos actual. Está diseñado para permitir la conectividad a través del módulo.

La implementación del clúster de red es un proceso muy flexible según sus necesidades y hay muchas opciones disponibles. Como queremos mantener nuestra instalación lo más simple posible, usaremos el complemento Weavenet que no requiere ninguna configuración ni código adicional y proporciona una dirección IP por pod, lo cual es excelente para nosotros. Si desea ver más opciones, consulte aquí.

Estos comandos serán importantes para configurar la red del pod.

# export kubever=$(kubectl version | base64 | tr -d '\n')
# kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$kubever"

Ahora, si comprueba el estado de su nodo principal, debería estar "Listo".

# kubectl get nodes

A continuación, agregamos los nodos trabajadores al clúster.

Agregar nodos de trabajo al clúster de Kubernetes

Las siguientes instrucciones se realizarán en cada nodo trabajador al unirse al clúster de Kubernetes.

Primero establezca el nombre de host en su worker-node-1 y worker-node-2, y luego agregue las entradas de host al archivo/etc/hosts.

# hostnamectl set-hostname 'node-1'
# cat <<EOF>> /etc/hosts
192.168.0.47 master-node
192.168.0.48 node-1 worker-node-1
192.168.0.49 node-2 worker-node-2
EOF

A continuación, haga ping a su nodo maestro desde sus nodos de trabajo para confirmar que su archivo de host actualizado está funcionando bien usando el comando ping.

# 192.168.0.47

A continuación, desactive SElinux y actualice las reglas de su firewall.

# setenforce 0
# sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
# firewall-cmd --permanent --add-port=6783/tcp
# firewall-cmd --permanent --add-port=10250/tcp
# firewall-cmd --permanent --add-port=10255/tcp
# firewall-cmd --permanent --add-port=30000-32767/tcp
# firewall-cmd --reload
# echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables

Agregue el repositorio de Docker primero usando DNF config-manager.

# dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo

A continuación, agregue el paquete containerd.io.

# dnf install https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm

Con estos dos paquetes instalados, instale la última versión de docker-ce.

# dnf install docker-ce

Habilite e inicie el servicio Docker.

# systemctl enable docker
# systemctl start docker

Deberá agregar repositorios de Kubernetes manualmente, ya que no vienen preinstalados en CentOS 8.

# cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

Con el repositorio de paquetes ahora listo, puede continuar e instalar kubeadm.

# dnf install kubeadm -y 

Inicie y habilite el servicio.

# systemctl enable kubelet
# systemctl start kubelet

Ahora necesitamos el token que generó kubeadm init para unirse al clúster. Puede copiarlo y pegarlo en su nodo-1 y nodo-2 si lo ha copiado en algún lugar.

# kubeadm join 192.168.0.47:6443 --token nu06lu.xrsux0ss0ixtnms5  --discovery-token-ca-cert-hash sha256:f996ea35r4353d342fdea2997a1cf8caeddafd6d4360d606dbc82314683478hjmf78

Como se sugiere en la última línea, regrese a su nodo principal y verifique si el nodo trabajador-1 y el nodo trabajador-2 se han unido al clúster mediante el siguiente comando.

# kubectl get nodes

Si todos los pasos se ejecutan correctamente, debería ver el nodo 1 y el nodo 2 en estado listo en el nodo principal. En este punto, ha implementado con éxito un clúster de Kubernetes en CentOS 8.

Lectura recomendada: Cómo implementar Nginx en un clúster de Kubernetes

El clúster que hemos creado aquí tiene un solo nodo maestro y, como tal, si el nodo maestro falla, su clúster puede perder datos y es posible que deba volver a crearlo desde cero.

Por esta razón, recomiendo una configuración de alta disponibilidad.