Cómo configurar un clúster Kubernetes en Ubuntu 22.04
Kubernetes es una herramienta gratuita de orquestación de contenedores que te ayuda a conseguir un despliegue, escalado y gestión automatizados de aplicaciones en contenedores. Un clúster Kubernetes consta de un nodo Maestro y un nodo Trabajador. El nodo maestro se encarga de gestionar los nodos y pods del clúster. El nodo trabajador se utiliza para desplegar la carga de trabajo de la aplicación. Con Kubernetes, puedes desplegar y gestionar aplicaciones nativas de la nube utilizando infraestructura local o plataformas de nube pública.
Este tutorial te mostrará cómo configurar el clúster Kubernetes en un servidor Ubuntu 22.04.
Requisitos previos
- Un servidor que ejecute Ubuntu 22.04.
- Una contraseña de root configurada en el servidor.
Cómo empezar
En primer lugar, tendrás que actualizar y actualizar los paquetes del sistema a la última versión. Puedes hacerlo con el siguiente comando:
apt update -y apt upgrade -y
Una vez actualizados todos los paquetes, también tendrás que desactivar el Swap en tu sistema. Puedes desactivarlo con el siguiente comando:
swapoff -a
A continuación, tendrás que cargar algunos módulos del núcleo necesarios en todos los nodos. Para ello, edita el archivo /etc/modules-load.d/containerd.conf:
nano /etc/modules-load.d/containerd.conf
Añade las siguientes líneas:
overlay br_netfilter
Guarda y cierra el archivo, y luego carga los módulos con el siguiente comando:
modprobe overlay modprobe br_netfilter
A continuación, también tendrás que crear una multa y definir algunos parámetros necesarios del núcleo:
nano /etc/sysctl.d/kubernetes.conf
Añade las siguientes líneas:
net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1
Guarda y cierra el archivo, luego ejecuta el siguiente comando para aplicar los cambios:
sysctl --system
Instalar Containerd
A continuación, tendrás que instalar el Containerd para el clúster Kubernetes. En primer lugar, instala todas las dependencias necesarias utilizando el siguiente comando:
apt install curl gnupg2 software-properties-common apt-transport-https ca-certificates -y
Tras instalar todas las dependencias, añade el repositorio Docker con el siguiente comando:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmour -o /etc/apt/trusted.gpg.d/docker.gpg add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
A continuación, actualiza el repositorio e instala el Containerd con el siguiente comando:
apt update -y apt install containerd.io -y
A continuación, tendrás que configurar el Contenedor para que se inicie por systemd. Puedes hacerlo con el siguiente comando:
containerd config default | tee /etc/containerd/config.toml >/dev/null 2>&1 sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml
A continuación, reinicia el servicio Containerd para aplicar los cambios:
systemctl restart containerd
Instalar componentes de Kubernetes
Por defecto, los componentes de Kubernetes no están incluidos en el repositorio por defecto de Ubuntu. Así que tendrás que añadir el repositorio de Kubernetes a tu sistema. Puedes añadirlo con el siguiente comando:
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
A continuación, actualiza el repositorio e instala todos los componentes de Kubernetes con el siguiente comando:
apt update -y apt install kubelet kubeadm kubectl -y
Una vez instalados todos los paquetes, puedes pasar al siguiente paso.
Inicializar el Cluster Kubernetes
En este punto, todos los componentes de Kubernetes están instalados. Ahora, ejecuta el siguiente comando en el nodo maestro para inicializar el clúster:
kubeadm init --control-plane-endpoint=kubernetes-master-ip
Obtendrás la siguiente salida:
To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config Alternatively, if you are the root user, you can run: export KUBECONFIG=/etc/kubernetes/admin.conf You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ You can now join any number of control-plane nodes by copying certificate authorities and service account keys on each node and then running the following as root: kubeadm join kubernetes-master-ip:6443 --token chmz7m.fbjgdcqne1q0ff4t \ --discovery-token-ca-cert-hash sha256:c614bf14af27472e470546539a9a2ff63e5d558dbbb3cc06d6f7a030fcb55426 \ --control-plane Then you can join any number of worker nodes by running the following on each as root: kubeadm join kubernetes-master-ip:6443 --token chmz7m.fbjgdcqne1q0ff4t \ --discovery-token-ca-cert-hash sha256:c614bf14af27472e470546539a9a2ff63e5d558dbbb3cc06d6f7a030fcb55426
Nota: Copia el comando kubeadm join de la salida anterior. Tendrás que ejecutar este comando en el nodo Trabajador para unirte al clúster. A continuación, tendrás que ejecutar los siguientes comandos para interactuar con el clúster Kubernetes:
mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config
Unir el Nodo Trabajador al Clúster
A continuación, inicia sesión en el nodo Trabajador y ejecuta el siguiente comando para unir el nodo Trabajador al clúster Kubernetes:
kubeadm join kubernetes-master-ip:6443 --token chmz7m.fbjgdcqne1q0ff4t --discovery-token-ca-cert-hash sha256:c614bf14af27472e470546539a9a2ff63e5d558dbbb3cc06d6f7a030fcb55426
Obtendrás el siguiente resultado:
[preflight] Running pre-flight checks [WARNING SystemVerification]: missing optional cgroups: blkio [preflight] Reading configuration from the cluster... [preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml' [kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml" [kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env" [kubelet-start] Starting the kubelet [kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap... This node has joined the cluster: * Certificate signing request was sent to apiserver and a response was received. * The Kubelet was informed of the new secure connection details. Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
Instalar el Complemento de Red Calico Pod
A continuación, tendrás que instalar la Red Calico Pod en el nodo Maestro Kubernetes para gestionar la red.
Puedes descargarlo e instalarlo con el siguiente comando:
curl https://projectcalico.docs.tigera.io/manifests/calico.yaml -O calico.yaml kubectl apply -f calico.yaml
Obtendrás la siguiente salida:
poddisruptionbudget.policy/calico-kube-controllers created serviceaccount/calico-kube-controllers created serviceaccount/calico-node created configmap/calico-config created customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/bgppeers.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/blockaffinities.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/caliconodestatuses.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/clusterinformations.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/felixconfigurations.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/globalnetworkpolicies.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/globalnetworksets.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/hostendpoints.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/ipamblocks.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/ipamconfigs.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/ipamhandles.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/ipreservations.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/kubecontrollersconfigurations.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/networkpolicies.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/networksets.crd.projectcalico.org created clusterrole.rbac.authorization.k8s.io/calico-kube-controllers created clusterrole.rbac.authorization.k8s.io/calico-node created clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers created clusterrolebinding.rbac.authorization.k8s.io/calico-node created
A continuación, comprueba el estado de los pods con el siguiente comando:
kubectl get pods -n kube-system
Obtendrás la siguiente salida:
NAME READY STATUS RESTARTS AGE calico-kube-controllers-58dbc876ff-nh2st 1/1 Running 0 5m58s calico-node-7cfz7 1/1 Running 0 5m58s calico-node-lt5cv 1/1 Running 0 5m58s coredns-565d847f94-dm6qc 1/1 Running 0 21m coredns-565d847f94-zhng9 1/1 Running 0 21m etcd-k8smaster.example.net 1/1 Running 0 22m kube-apiserver-k8smaster.example.net 1/1 Running 0 22m kube-controller-manager-k8smaster.example.net 1/1 Running 0 22m kube-proxy-9w2xp 1/1 Running 0 14m kube-proxy-gdb97 1/1 Running 0 21m kube-scheduler-k8smaster.example.net 1/1 Running 0 22m
Ahora puedes comprobar el estado del clúster Kubernetes con el siguiente comando:
kubectl get nodes
Deberías ver que tanto el nodo Maestro como el Trabajador están en estado listo:
NAME STATUS ROLES AGE VERSION k8smaster.example.net Ready control-plane 22m v1.25.0 kubernetes Ready 14m v1.25.0
Despliega una aplicación Nginx en Kubernetes
Para probar Kubernetes, desplegaremos una aplicación Nginx en el clúster.
Ejecuta el siguiente comando para desplegar una aplicación Nginx:
kubectl create deployment nginx-app --image=nginx --replicas=2
Puedes verificar tu aplicación con el siguiente comando:
kubectl get deployment nginx-app
Obtendrás la siguiente salida:
NAME READY UP-TO-DATE AVAILABLE AGE nginx-app 2/2 2 2 13s
A continuación, despliega tu aplicación en el puerto 80 con el siguiente comando:
kubectl expose deployment nginx-app --type=NodePort --port=80
A continuación, verifica el estado del servicio Nginx con el siguiente comando:
kubectl get svc nginx-app
Obtendrás la siguiente salida:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-app NodePort 10.109.89.196 80:30921/TCP 14s
También puedes ver la información detallada de tu aplicación Nginx con el siguiente comando:
kubectl describe svc nginx-app
Deberías ver la siguiente salida:
Name: nginx-app Namespace: default Labels: app=nginx-app Annotations: Selector: app=nginx-app Type: NodePort IP Family Policy: SingleStack IP Families: IPv4 IP: 10.109.89.196 IPs: 10.109.89.196 Port: 80/TCP TargetPort: 80/TCP NodePort: 30921/TCP Endpoints: 192.168.192.129:80,192.168.192.130:80 Session Affinity: None External Traffic Policy: Cluster Events:
Ahora, anota la dirección IP de la aplicación Nginx de la salida anterior y verifica tu aplicación Nginx utilizando el comando curl:
curl http://10.109.89.196
Si todo va bien, obtendrás la siguiente salida:
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
Enhorabuena! has desplegado con éxito el clúster Kubernetes en el servidor Ubuntu 22.04.