En aquesta activitat crearem un centre de dades de Kubernetes simulat amb tres nodes de Podman, dins d'un contenidor 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.
Per a dur a terme l'activitat necessitarem:
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.
lxc shell asix-k8s-lab passwd ubuntu exit lxc exec asix-k8s-lab login
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
.
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
mkdir cluster cd cluster cat <<EOF > 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
podman ps
Podem veure com kind ha creat un controlador i dos treballadors. Visualitzem-ho també des de kubernetes:
kubectl get nodes
Ara utilitzarem comandes de kubernetes per a desplegar un manifest d'infraestructura.
# Escrivim un manifest de desplegament configurant una rèplica de Nginx
cat <<EOF > 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
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.
Per acabar, eliminarem els nodes que hem creat a aquesta activitat:
kind delete cluster --name asix-cluster