Taula de continguts

Introducció al desplegament i escalat de serveis multi-node amb Kind i Podman

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.

, , , , , ,

Requisits previs

Per a dur a terme l'activitat necessitarem:

Creació i configuració del contenidor LXD

  1. 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.

  2. 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
  3. Per a treballar amb Kubernetes farem servir 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

    .

  4. 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
    /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
  5. Creem el cluster multi-node amb kind.
    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
  6. 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 <<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

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