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.

También te podría gustar...