====== 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