====== Introducció al desplegament i escalat de serveis multi-node amb Kind i Podman ====== En aquesta activitat crearem un centre de dades de [[https://kubernetes.io/|Kubernetes]] simulat amb tres nodes de [[https://podman.io/|Podman]], dins d'un contenidor [[https://canonical.com/lxd|LXD]]. Hi desplegarem un servei web, i l'escalarem dinàmicament per a que sigui capaç de suportar una càrrega de tràfic web simulada. {{tag> #FpInfor #Asix #AsixMp08 #Ciber #Ceti #CiberMp03 #CetiMp03 }} ====== Requisits previs ====== Per a dur a terme l'activitat necessitarem: * Tenir una instal·lació de l'eina [[https://canonical.com/lxd|LXD]] a la nostra màquina. * Un compte a [[https://www.docker.com/|Docker]]. ====== Creació i configuració del contenidor LXD ====== - Crearem i executarem el contenidor. Farem servir una imatge Ubuntu 24.04. lxc launch ubuntu:24.04 asix-k8s-lab -c security.nesting=true -c security.privileged=true Els //flags// **security-nesting** i **security-privileged** permeten al contenidor LXD crear contenidors en niu. - Configurem l'usuari per defecte **ubuntu**, afegint-li una contrasenya. A continuació, iniciem sessió amb aquest usuari. lxc shell asix-k8s-lab passwd ubuntu exit lxc exec asix-k8s-lab login - Per a treballar amb Kubernetes farem servir [[https://kind.sigs.k8s.io/|Kind]]. Actualitzem el sistema i hi instal·lem **podman**, **kubectl** i **kind**. sudo apt update && sudo apt upgrade -y sudo apt install podman -y sudo curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl sudo curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.32.0/kind-linux-amd64 sudo chmod +x ./kind sudo mv ./kind /usr/local/bin/kind . - Iniciem sessió a **docker.io** a **podman**. exit lxc config set asix-k8s-lab raw.lxc "lxc.apparmor.profile = unconfined" lxc restart asix-k8s-lab lxc exec asix-k8s-lab login sudo nano /etc/containers/registries.conf # Registres que Podman farà servir quan s'aportin noms curts com "nginx" unqualified-search-registries = ["docker.io"] # Comportament amb noms amb ambigüitat. short-name-mode = "permissive" podman login docker.io - Creem el //cluster// multi-node amb **kind**. mkdir cluster cd cluster cat < kind-config.yaml kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: - role: control-plane - role: worker - role: worker EOF sudo mkdir -p /dev/mapper export KIND_EXPERIMENTAL_PROVIDER=podman kind create cluster --config kind-config.yaml --name asix-cluster - Verifiquem que el cluster ha estat creat correctament i el visualitzem a podman. podman ps Podem veure com **kind** ha creat un controlador i dos treballadors. Visualitzem-ho també des de **kubernetes**: kubectl get nodes ====== Desplegament d'un servei web al nostre cluster ====== Ara utilitzarem comandes de **kubernetes** per a desplegar un manifest d'infraestructura. # Escrivim un manifest de desplegament configurant una rèplica de Nginx cat < nginx-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: asix-web-server spec: replicas: 1 selector: matchLabels: app: web template: metadata: labels: app: web spec: containers: - name: nginx image: docker.io/library/nginx:latest ports: - containerPort: 80 EOF # Li diem al cluster que implementi el fitxer d'arquitectura kubectl apply -f nginx-deployment.yaml Fixeu-vos en que hem utilitzat una imatge de **docker.io** de Nginx per a fer el nostre desplegament. Aquesta és la gran avantatge d'utilitzar contenidors. Comprovem que la comanda ha funcionat: kubectl get pods -o wide ====== Escalem el nostre servei web ====== Imaginem, per exemple, que el servidor web experimenta una quantitat de tràfic enorme perquè s'hi ha publicat una pàgina nova extremadament popular. Un sol //pod// no dona a l'abast. Enlloc d'haver d'iniciar una màquina virtual sencera o una màquina física, i desplegar còpies del web per a alleugerir el tràfic, podem escalar la infraestructura de contenidors instantàniament. Executem: kubectl scale deployment asix-web-server --replicas=5 kubectl get pods -o wide Com podeu veure, hem escalat el sistema a un total de cinc instàncies del servei web de forma **instantània**, aconseguint d'aquesta manera alleugerir la càrrega entre els cinc serveis. Fixeu-vos en la columna NODE: **kubernetes** automàticament equilibra la càrrega dels cinc //pods// entre els treballadors per a optimitzar el rendiment del sistema i assegurar alta disponibilitat. Si un node s'apaga o perd la connexió, el cluster transferirà la càrrega als treballadors que segueixin en línia. ====== Eliminació dels nodes ====== Per acabar, eliminarem els nodes que hem creat a aquesta activitat: kind delete cluster --name asix-cluster