Kubernetes (k8s) es una herramienta de orquestación de contenedores gratuita y de código abierto. Se utiliza para implementar, escalar y administrar aplicaciones basadas en contenedores. En este artículo, demostraremos cómo instalar Kubernetes Cluster en Ubuntu 20.04 LTS Server (Focal Fossa) usando kubeadm. En la configuración de mi laboratorio, he usado tres servidores Ubuntu 20.04 LTS. Los siguientes son los requisitos del sistema en cada sistema Ubuntu.
- Mínimo de 2 GB de RAM
- 2 núcleos (2 vCPU)
- 15 GB de espacio libre en /var
- Usuario privilegiado con derechos sudo
- Conexión estable a Internet
Los siguientes son los detalles de la configuración de mi laboratorio:
- Máquina 1 (Servidor Ubuntu 20.04 LTS) – K8s-master – 192.168.1.40
- Máquina 2 (Servidor Ubuntu 20.04 LTS) – K8s-node-0 – 192.168.1.41
- Máquina 3 (Servidor Ubuntu 20.04 LTS) – K8s-node-1 – 192.168.1.42
Ahora pasemos a los pasos de instalación de Kubernetes.
Paso 1) Establecer nombre de host y agregar entradas en el archivo /etc/hosts
Use el comando hostnamectl para establecer el nombre de host en cada nodo, el ejemplo se muestra a continuación:
$ sudo hostnamectl set-hostname "k8s-master" // Run this command on master node $ sudo hostnamectl set-hostname "k8s-node-0" // Run this command on node-0 $ sudo hostnamectl set-hostname "k8s-node-1" // Run this command on node-1
Agregue las siguientes entradas en los archivos /etc/hosts en cada nodo,
192.168.1.40 k8s-master 192.168.1.41 k8s-node-0 192.168.1.42 k8s-node-1
Paso 2) Instale Docker (Container Runtime) en los 3 nodos
Inicie sesión en cada nodo y ejecute los siguientes comandos para instalar Docker,
$ sudo apt update $ sudo apt install -y docker.io
Ahora inicie y habilite el servicio docker en cada nodo usando el comando systemctl debajo,
$ sudo systemctl enable docker.service --now
Ejecute el siguiente comando para verificar el estado del servicio docker y su versión,
$ systemctl status docker $ docker --version
Paso 3) Deshabilite el intercambio y habilite el reenvío de IP en todos los nodos
Para deshabilitar el intercambio, edite el archivo /etc/fstab y comente la línea que incluye la entrada, ya sea la partición de intercambio o el archivo de intercambio.
$ sudo vi /etc/fstab
Guardar y salir del archivo
Ejecute el comando swapoff para deshabilitar el intercambio sobre la marcha
$ sudo swapoff -a
Para habilitar el reenvío de ip de forma permanente, edite el archivo “/etc/sysctl.conf” y busque la línea “net.ipv4.ip_forward=1” y descoméntalo. Después de realizar los cambios en el archivo, ejecute el siguiente comando
$ sudo sysctl -p net.ipv4.ip_forward = 1 $
Paso 4) Instale Kubectl, kubelet y kubeadm en todos los nodos
Ejecute los siguientes comandos en los 3 nodos para instalar la utilidad kubectl, kubelet y kubeadm
$ sudo apt install -y apt-transport-https curl $ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add $ sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main" $ sudo apt update $ sudo apt install -y kubelet kubeadm kubectl
Nota : Al momento de escribir este artículo, el repositorio Kubernetes de Ubuntu 16.04 (Xenial Xerus) estaba disponible, pero en el futuro, cuando el repositorio de Kubernetes esté disponible para Ubuntu 20.04, reemplace xenial con la palabra focal en el comando anterior ‘apt-add-repository’.
Paso 4) Inicialice el clúster de Kubernetes mediante kubeadm (desde el nodo principal)
Inicie sesión en su nodo maestro (k8s-master) y ejecute debajo del comando ‘kubeadm init’ para inicializar el clúster de Kubernetes,
$ sudo kubeadm init
Una vez que el clúster se inicialice correctamente, obtendremos el siguiente resultado
Para comenzar a usar el clúster como un usuario normal, ejecutemos los siguientes comandos, los comandos ya están allí en la salida, simplemente copie y pegue.
[email protected]:~$ mkdir -p $HOME/.kube [email protected]:~$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config [email protected]:~$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
Ahora una los nodos trabajadores (k8s-node-0/1) al clúster, el comando para unirse al clúster ya está en la salida. Copie el comando «kubeadm join» y péguelo en ambos nodos (nodos de trabajo).
Inicie sesión en Node-0 y ejecute el siguiente comando,
[email protected]:~$ sudo kubeadm join 192.168.1.40:6443 --token b4sfnc.53ifyuncy017cnqq --discovery-token-ca-cert-hash sha256:5078c5b151bf776c7d2395cdae08080faa6f82973b989d29caaa4d58c28d0e4e
Inicie sesión en Node-1 y ejecute el siguiente comando para unirse al clúster,
[email protected]:~$ sudo kubeadm join 192.168.1.40:6443 --token b4sfnc.53ifyuncy017cnqq --discovery-token-ca-cert-hash sha256:5078c5b151bf776c7d2395cdae08080faa6f82973b989d29caaa4d58c28d0e4e
Desde el nodo principal, ejecute el comando «kubectl get nodes» para verificar el estado de los nodos
[email protected]:~$ kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master NotReady master 27m v1.18.3 k8s-node-0 NotReady <none> 8m3s v1.18.3 k8s-node-1 NotReady <none> 7m19s v1.18.3 [email protected]:~$
Como podemos ver, tanto los nodos trabajadores como el nodo maestro se han unido al clúster, pero el estado de cada nodo es «No está listo”. Para hacer el estado “Listo” debemos implementar complementos de red Pod basados en la interfaz de red de contenedores (CNI) como calicó, enrutador kube y red de tejido. Como sugiere el nombre, los complementos de red de pod permiten que los pods se comuniquen entre sí.
Paso 5) Implementar el complemento Calico Pod Network (nodo principal)
Desde el nodo maestro, ejecute el siguiente comando para instalar el complemento de red Calico pod,
[email protected]:~$ kubectl apply -f https://docs.projectcalico.org/v3.14/manifests/calico.yaml
Una vez que se haya implementado correctamente, el estado de los nodos estará listo, volvamos a ejecutar el comando kubectl para verificar el estado de los nodos.
[email protected]:~$ kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master Ready master 39m v1.18.3 k8s-node-0 Ready <none> 19m v1.18.3 k8s-node-1 Ready <none> 19m v1.18.3 [email protected]:~$
Ejecute el siguiente comando para verificar el estado de los pods de todos los espacios de nombres
Perfecto, lo anterior confirma que todos los pods están funcionando y en buen estado. Intentemos implementar pods, servicios e implementaciones para ver si nuestro clúster de Kubernetes funciona bien o no.
Nota: Para habilitar la función de finalización de bash en su nodo maestro, ejecute lo siguiente
[email protected]:~$ echo 'source <(kubectl completion bash)' >>~/.bashrc [email protected]:~$ source .bashrc
Leer también : Cómo configurar el clúster de Kubernetes en Google Cloud Platform (GCP)
Paso 6) Probar y verificar el clúster de Kubernetes
Vamos a crear una implementación llamada nginx-web con la imagen del contenedor nginx en el espacio de nombres predeterminado, ejecute el siguiente comando kubectl desde el nodo principal,
[email protected]:~$ kubectl create deployment nginx-web --image=nginx deployment.apps/nginx-web created [email protected]:~$
Ejecute el siguiente comando para verificar el estado de la implementación
[email protected]:~$ kubectl get deployments.apps NAME READY UP-TO-DATE AVAILABLE AGE nginx-web 1/1 1 1 41s [email protected]:~$ kubectl get deployments.apps -o wide NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR nginx-web 1/1 1 1 56s nginx nginx app=nginx-web [email protected]:~$ [email protected]:~$ kubectl get pods NAME READY STATUS RESTARTS AGE nginx-web-7748f7f978-nk8b2 1/1 Running 0 2m50s [email protected]:~$
Como podemos ver, la implementación se ha creado correctamente con la réplica predeterminada.
Ampliemos la implementación, configure las réplicas como 4. Ejecute el siguiente comando,
[email protected]:~$ kubectl scale --replicas=4 deployment nginx-web deployment.apps/nginx-web scaled [email protected]:~$
Ahora verifique el estado de su implementación usando los siguientes comandos,
[email protected]:~$ kubectl get deployments.apps nginx-web NAME READY UP-TO-DATE AVAILABLE AGE nginx-web 4/4 4 4 13m [email protected]:~$ [email protected]:~$ kubectl describe deployments.apps nginx-web
Lo anterior confirma que la implementación basada en nginx se ha escalado con éxito.
Realicemos una prueba más, creemos un pod llamado «http-web» y expóngalo a través del servicio llamado «http-service» con el puerto 80 y NodePort como tipo.
Ejecute el siguiente comando para crear un pod,
[email protected]:~$ kubectl run http-web --image=httpd --port=80 pod/http-web created [email protected]:~$
Cree un servicio usando el comando debajo y exponga el pod creado arriba en el puerto 80,
[email protected]:~$ kubectl expose pod http-web --name=http-service --port=80 --type=NodePort service/http-service exposed [email protected]:~$ [email protected]:~$ kubectl get service http-service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE http-service NodePort 10.101.152.138 <none> 80:31098/TCP 10s [email protected]:~$
Obtenga la IP del nodo o el nombre de host en el que se implementa el módulo web http y luego acceda al servidor web a través de NodePort (31098)
[email protected]:~$ kubectl get pods http-web -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES http-web 1/1 Running 0 59m 172.16.11.196 k8s-node-0 <none> <none> [email protected]:~$ [email protected]:~$ curl http://k8s-node-0:31098 <html><body><h1>It works!</h1></body></html> [email protected]:~$
Perfecto, está funcionando bien como se esperaba. Esto concluye el artículo y confirma que hemos configurado correctamente el clúster de Kubernetes en el servidor Ubuntu 20.04 LTS.
Leer también : Cómo configurar el controlador de entrada NGINX en Kubernetes
Leer también : Cómo configurar el registro privado de Docker en Kubernetes (k8s)