Agregar un nuevo Worker node con AlmaLinux¶
Prerrequisitos¶
- Sincronización de tiempo: Un mecanismo activo como
chronydontpd. - Sistema Operativo: Instalación limpia de AlmaLinux 9.6 con acceso a internet.
- Drivers: Controladores de NVIDIA y CUDA correctamente instalados y verificados.
Notas de administración
- Se asume que todos los comandos son ejecutados por el usuario
root. - El término "admin" se refiere exclusivamente al administrador del nodo maestro (Control Plane).
Deshabilitar swap
Este comando solo lo hace temporal. Para deshabilitar swap permanentemente en el nodo, comente la línea que diga swap en el archivo /etc/fstab.
1. Instalar y configurar el Runtime (containerd)¶
Basodo en la documentación de kubernetes.
1.1. Configuración del sistema¶
Primero, cargamos los módulos del kernel necesarios para el enrutamiento de la red
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter
Configuramos los parámetros de sysctl
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
sysctl --system
1.2. Instalación del runtime¶
1.2.1. Instalación de CNI Plugins¶
Puede encontrar la última versión en el repositorio oficial de CNI.
Descargamos la versión de plugin. En este tutorial es uso la versión v1.3.0
wget https://github.com/containernetworking/plugins/releases/download/v1.3.0/cni-plugins-linux-amd64-v1.3.0.tgz
Extraemos en el directorio /opt/cni/bin
1.2.2. Instalación de containerd y runc¶
dnf install -y runc
dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
dnf install -y containerd.io containerd config default | sudo tee /etc/containerd/config.toml
En el archivo /etc/containerd/config.toml activamos SystemdCgroup
Habilitamos el servicio
1.2.3. Instalación y configuración de nvidia-container-toolkit¶
Instalamos prerequisitos
dnf install libseccomp
dnf install libseccomp-devel
dnf install -y apt-transport-https ca-certificates curl gpg socat conntrack
Configuramos el repositorio de NVIDIA
curl -s -L https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo | \
sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo
Instalamos los paquetes de NVIDIA
export NVIDIA_CONTAINER_TOOLKIT_VERSION=1.18.0-1
dnf install -y \
nvidia-container-toolkit-${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
nvidia-container-toolkit-base-${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
libnvidia-container-tools-${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
libnvidia-container1-${NVIDIA_CONTAINER_TOOLKIT_VERSION}
1.2.4. Configuración de containerd para NVIDIA¶
Configuramos runtime para que Kubernetes orqueste cargas de trabajo con GPU
nvidia-ctk runtime configure --runtime=containerd
sed -i 's/default_runtime_name = "runc"/default_runtime_name = "nvidia"/' /etc/containerd/config.d/99-nvidia.toml
systemctl restart containerd
2. Instalación de herramientas de Kubernetes¶
2.1. Descargamos crictl¶
export DOWNLOAD_DIR="/usr/local/bin"
mkdir -p "$DOWNLOAD_DIR"
CRICTL_VERSION="v1.29.0"
export ARCH="amd64"
curl -L "https://github.com/kubernetes-sigs/cri-tools/releases/download/${CRICTL_VERSION}/crictl-${CRICTL_VERSION}-linux-${ARCH}.tar.gz" | sudo tar -C $DOWNLOAD_DIR -xz
chown root.root /usr/local/bin/crictl
2.2. Decargamos kubeadm y kubelet¶
export RELEASE="$(curl -sSL https://dl.k8s.io/release/stable.txt)"
cd $DOWNLOAD_DIR
curl -L --remote-name-all https://dl.k8s.io/release/${RELEASE}/bin/linux/${ARCH}/{kubeadm,kubelet}
chmod +x {kubeadm,kubelet}
export RELEASE_VERSION="v0.16.2"
curl -sSL "https://raw.githubusercontent.com/kubernetes/release/${RELEASE_VERSION}/cmd/krel/templates/latest/kubelet/kubelet.service" | sed "s:/usr/bin:${DOWNLOAD_DIR}:g" | sudo tee /etc/systemd/system/kubelet.service
mkdir -p /etc/systemd/system/kubelet.service.d
curl -sSL "https://raw.githubusercontent.com/kubernetes/release/${RELEASE_VERSION}/cmd/krel/templates/latest/kubeadm/10-kubeadm.conf" | sed "s:/usr/bin:${DOWNLOAD_DIR}:g" | sudo tee /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
systemctl enable --now kubelet
3. Instalación y configuración de la VPN¶
Basado en la documentación oficial de instalación de wireguard.
Antes de empezar, contacte con el administrador del control plane para recibir una nueva dirección IP dentro de la VPN y los datos de servidor VPN.
Advertencia
Si se encuentra conectado dentro de una institución es posible que el equipo de seguridad informática tenga bloqueadas las conexiones. Si es su caso, favor de contactarlos y pedirles que habiliten las conexiones (IP y puertos que le administrador de PIG dicte). De lo contrario, no se podrá realizar la conexión con el control plane.
3.1. Instalación de wireguard¶
3.2. Crear clave privada del nodo¶
3.3. Configuración de wireguard¶
Creamos el archivo /etc/wireguard/wg0.conf con el siguiente contenido
[Interface]
Address = <Dirección IP asignada por el admin>/24
PrivateKey = <Clave generada en el paso anterior>
ListenPort = 21841
[Peer]
PublicKey = <Clave pública dada por el admin>
Endpoint = <IP:puerto dados por el admin>
AllowedIPs = <Segmento de red dado por el admin>/24
PersistentKeepalive = 25
3.4. Levantamiento de la interfaz virtual de la VPN¶
Nota
Asegúrese de siempre levantar la interfaz si el nodo es reiniciado.
3.5. Obtener clave pública¶
Comparte con el admin la clave pública.
4. Conexión al clúster¶
El administrador de clúster deberá generar el token / hash para integrar el nodo y enviarselos. Pida al admin los siguientes parámetros:
- IP:PUERTO (Del nodo maestro)
- TOKEN
- HASH
4.1. Incorporación del nodo al clúster¶
Ejecutamos el comando kubeadm join con los parámetros anteriores dados por el admin
4.2. Configuración de kubeadm para usar la interfaz virtual para conectarse al clúster¶
Editamos el arachivo var/lib/kubelet/kubeadm-flags.env y gregamos la dandera --node-ip seguida de la dirección IP asignada por el admin del control plane.
Ejemplo
4.3. Reiniciar kubelet¶
5. Instalación de s3fs¶
Advertencia
Es posible que se requiera el siguiente paso: ln -s /etc/resolv.conf /run/systemd/resolve/resolv.conf
Éxito
El administrador del clúster le dirá si el nodo se agregó correctamente. De igual forma, si el nodo aparece al executar kubectl get nodes entonces se agregó con éxito.