====== Kubernetes ====== ===== Introducción ===== **Kubernetes**, también conocido como **K8s**, es una herramienta de código abierto para la orquestación de contenedores, y que se utiliza para desplegar aplicaciones en ellos. Desarrollada por Google, permite orquestar contenedores en múltiples hosts. Con Kubernetes, se puede configurar el balanceo de carga entre contenedores y ejecutar varios contenedores en múltiples sistemas. Es compatible con servidores físicos locales, OpenStack, nubes públicas como Google, Azure, AWS, etc. ===== Características ===== Kubernetes le ofrece amplia funcionalidad, a saber: * **Descubrimiento de servicios y balanceo de carga**. Kubernetes puede exponer un contenedor usando el nombre DNS o su propia dirección IP. Si el tráfico hacia un contenedor es alto, Kubernetes puede balancear la carga y distribuir el tráfico de red para que la implementación sea estable. * **Orquestación de almacenamiento**. Kubernetes le permite montar automáticamente el sistema de almacenamiento que prefiera, como almacenamiento local, proveedores de nube pública, etc. * **Implementaciones y reversiones automatizadas**. Puede describir el estado deseado para sus contenedores implementados con Kubernetes, que puede cambiar el estado actual al deseado a un ritmo controlado. Por ejemplo, puede automatizar Kubernetes para crear nuevos contenedores para su implementación, eliminar los existentes y adaptar todos sus recursos al nuevo contenedor. * **Empaquetado automático de contenedores**. Usted proporciona a Kubernetes un cluster de nodos que puede usar para ejecutar tareas en contenedores. Le indica a Kubernetes cuánta CPU y RAM necesita cada contenedor. Kubernetes puede integrar contenedores en sus nodos para optimizar sus recursos. * **Autorreparación**. Kubernetes reinicia los contenedores que fallan, los reemplaza, elimina los que no responden a la comprobación de estado definida por el usuario y no los anuncia a los clientes hasta que estén listos para funcionar. * **Gestión de secretos y configuración** Kubernetes le permite almacenar y gestionar información confidencial, como contraseñas, tokens OAuth y claves SSH. Puede implementar y actualizar secretos y la configuración de la aplicación sin reconstruir las imágenes de sus contenedores ni exponerlos en la configuración de su pila. * **Ejecución por lotes**. Además de los servicios, Kubernetes puede gestionar sus cargas de trabajo por lotes y de CI, reemplazando los contenedores que fallan, si lo desea. * **Escalado horizontal**. Escale su aplicación hacia arriba y abajo con un simple comando, con una interfaz de usuario o automáticamente según el uso de la CPU. * **Doble pila IPv4/IPv6**. Asignación de direcciones IPv4 e IPv6 a pods y servicios. * **Diseñado para la extensibilidad**. Añada funciones a su cluster de Kubernetes sin modificar el código fuente. {{ ::kubernetes-history.png?nolink |}} //Figura 1. Evolución histórica de la virtualización// {{ ::kubernetes-cluster-arch.png?nolink |}} //Figura 2. Componentes de un cluster Kubernetes// ===== Empezando la configuración ===== En esta guía, explicaremos cómo configurar un cluster de Kubernetes en Debian 12. Empezaremos con cuatro servidores virtuales, todos instalados de manera mínima y sin swap, y preconfigurados con lo que necesitemos, incluyendo contraseñas y los utilitarios que precisemos: apt install mc screen rsync iptraf ccze zsh htop gnupg2 curl apt-transport-https ca-certificates software-properties-common ufw La primer VM será el nodo Master, y las otras tres serán nodos Worker. Para empezar Kubernetes necesita el swap desactivado, y si el nodo fue instalado sin prever eso, se debe desactivar. Para ello, editar el archivo /etc/fstab y comentar las líneas similares a la siguiente: # UUID=18b43798-486f-499d-9edf-2c551b34b5a1 none swap sw 0 0 Y desactivarlo con el siguiente comando: swapoff -a A continuación, también deberá activar el reenvío de IP y otros parámetros editando el archivo /etc/sysctl.conf o bien agregarlos en un archivo específico de configuración: cat < cat < Y cargar dichos módulos: modprobe overlay modprobe br_netfilter Instalar containder: apt install containerd Y configurarlo para Kubernetes: containerd config default | tee /etc/containerd/config.toml > /dev/null 2>&1 Editar el archivo /etc/containerd/config.toml: nano /etc/containerd/config.toml Buscar la sección [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options] y cambiar a true la variable SystemdCgroup: "SystemdCgroup = true" Reiniciar el demonio y activarlo en SystemD: systemctl restart containerd systemctl enable containerd ===== Kubernetes ===== Agregar los repositorios de Kubernetes: echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /' | tee /etc/apt/sources.list.d/kubernetes.list curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg Instalar las herramientas de Kubernetes: apt update apt install kubelet kubeadm kubectl apt-mark hold kubelet kubeadm kubectl systemctl enable --now kubelet En el nodo master crear el archivo kubeadm-config.yaml: nano kubeadm-config.yaml Y agregar el siguiente contenido: apiVersion: kubeadm.k8s.io/v1beta3 kind: InitConfiguration --- apiVersion: kubeadm.k8s.io/v1beta3 kind: ClusterConfiguration kubernetesVersion: "v1.30.0" controlPlaneEndpoint: "kmaster1:6443" networking: podSubnet: "10.244.0.0/16" --- apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration cgroupDriver: systemd ====== REVISAR HACIA ABAJO ====== ===== Instalar Docker CE en los nodos master y worker ===== Para ello, agregue el repositorio de Docker CE con los siguientes comandos: curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list A continuación, actualice el listado de paquetes e instale Docker CE: apt update && apt install docker-ce docker-ce-cli containerd.io Una vez instalado Docker CE, verifique la versión instalada: docker -v ===== Instalar los componentes de Kubernetes en los nodos master y worker ===== A continuación, deberá instalar el componente de Kubernetes en los nodos. Primero, agregue el repositorio de Kubernetes: echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg A continuación, actualice el repositorio e instale todos los componentes necesarios: apt update && apt install kubelet kubeadm kubectl Una vez instalados todos los paquetes de Kubernetes, puede continuar con el siguiente paso. ===== Inicializar el cluster Kubernetes ===== A continuación, deberá inicializar el clúster de Kubernetes en el nodo maestro: kubeadm init Obtendrá el siguiente resultado: ¡Su plano de control de Kubernetes se ha inicializado correctamente! Para empezar a usar el 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 Ahora debería implementar una red de pods en el clúster. Ejecute "kubectl apply -f [podnetwork].yaml" con una de las opciones que se indican en: https://kubernetes.io/docs/concepts/cluster-administration/addons/. A continuación, puede unir cualquier número de nodos de trabajo ejecutando lo siguiente en cada uno como usuario root: kubeadm join 69.28.91.245:6443 --token 3kwruw.iz4wiwbnr1l31o6t \ --discovery-token-ca-cert-hash sha256:c199b45b1abffe99f8ec539d5c6681a8857aac51b423a4e4efebf9ad86b86705 A continuación, ejecute el siguiente comando para activar la configuración 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 Nota: Recuerde el comando "kubeadm join" del resultado anterior. Deberá ejecutarlo en el nodo de trabajo para unirse al clúster. ===== Bibliografía ===== * Documentación de Kubernetes: https://kubernetes.io/docs/home/