Skip to content

Instantly share code, notes, and snippets.

@srpiroliro
Last active February 28, 2025 22:26
Show Gist options
  • Save srpiroliro/4d5a666cb7e6618e5ad2b968bc7d623a to your computer and use it in GitHub Desktop.
Save srpiroliro/4d5a666cb7e6618e5ad2b968bc7d623a to your computer and use it in GitHub Desktop.

Revisions

  1. srpiroliro revised this gist Feb 28, 2025. 2 changed files with 2 additions and 1 deletion.
    1 change: 1 addition & 0 deletions 0-AUTHOR.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1 @@
    Rems Nalivaiko <[email protected]>
    2 changes: 1 addition & 1 deletion 00-README.md
    Original file line number Diff line number Diff line change
    @@ -40,4 +40,4 @@ Aquesta solució mínima configura un servidor NFS i l'utilitza com a emmagatzem
    - Volum Persistent NFS amb `persistentVolumeReclaimPolicy: Retain` (conserva les dades fins i tot si s'eliminen els PVC)
    - Múltiples pods de Nginx poden accedir al mateix recurs compartit NFS (ReadWriteMany)
    - El PV proporciona 1Gi mentre que el PVC sol·licita 100Mi
    - Nginx serveix contingut directament des del recurs compartit NFS
    - Nginx serveix contingut directament des del recurs compartit NFS
  2. srpiroliro revised this gist Feb 28, 2025. 9 changed files with 185 additions and 0 deletions.
    File renamed without changes.
    File renamed without changes.
    File renamed without changes.
    File renamed without changes.
    26 changes: 26 additions & 0 deletions 04-nginx-deployment.yaml
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,26 @@
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: nginx-nfs
    spec:
    replicas: 2 # Creant múltiples pods per demostrar l'accés compartit
    selector:
    matchLabels:
    app: nginx-nfs
    template:
    metadata:
    labels:
    app: nginx-nfs
    spec:
    containers:
    - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80
    volumeMounts:
    - name: nfs-volume
    mountPath: /usr/share/nginx/html # Directori arrel per defecte per a Nginx
    volumes:
    - name: nfs-volume
    persistentVolumeClaim:
    claimName: nfs-pvc
    11 changes: 11 additions & 0 deletions 05-nginx-service.yaml
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,11 @@
    apiVersion: v1
    kind: Service
    metadata:
    name: nginx-nfs-service
    spec:
    selector:
    app: nginx-nfs
    ports:
    - port: 80
    targetPort: 80
    type: NodePort # Fa que el servei sigui accessible des de fora del clúster
    44 changes: 44 additions & 0 deletions 06-deploy.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,44 @@
    #!/bin/bash
    # Script de desplegament senzill per a Nginx amb NFS a Kubernetes

    echo "================================="
    echo "DESPLEGAMENT DE NGINX AMB NFS"
    echo "================================="

    # Comprovar si s'ha configurat la IP del servidor NFS
    if grep -q "SERVER_IP" nfs-pv.yaml; then
    echo "ERROR: Has d'actualitzar nfs-pv.yaml amb la IP del teu servidor NFS primer!"
    echo "Edita nfs-pv.yaml i substitueix SERVER_IP amb la IP real del teu servidor NFS."
    exit 1
    fi

    echo "1. Creant el Volum Persistent (PV)"
    kubectl apply -f nfs-pv.yaml
    echo "Esperant a que es creï el PV..."
    sleep 3

    echo "2. Creant la Reclamació de Volum Persistent (PVC)"
    kubectl apply -f nfs-pvc.yaml
    echo "Esperant a que el PVC es vinculi..."
    sleep 5

    echo "3. Comprovant l'estat del PV i PVC:"
    kubectl get pv
    kubectl get pvc

    echo "4. Creant el Desplegament de Nginx"
    kubectl apply -f nginx-deployment.yaml
    echo "Esperant a que el desplegament estigui llest..."
    sleep 10

    echo "5. Creant el Servei de Nginx"
    kubectl apply -f nginx-service.yaml
    echo "Esperant a que el servei estigui disponible..."
    sleep 5

    echo "6. Desplegament completat!"
    kubectl get pods
    kubectl get pv,pvc
    kubectl get services nginx-nfs-service

    echo "Pots executar ./test.sh per verificar la configuració."
    55 changes: 55 additions & 0 deletions 07-test.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,55 @@
    #!/bin/bash
    # Script per provar el desplegament de Nginx amb suport NFS

    echo "====================================="
    echo "COMPROVACIÓ DEL DESPLEGAMENT DE NGINX AMB NFS"
    echo "====================================="

    # Obtenir el NodePort assignat al nostre servei
    NODE_PORT=$(kubectl get service nginx-nfs-service -o jsonpath='{.spec.ports[0].nodePort}')
    NODE_IP=$(kubectl get nodes -o jsonpath='{.items[0].status.addresses[?(@.type=="InternalIP")].address}')

    echo "El servei Nginx està exposat al NodePort: $NODE_PORT"
    echo "Provant l'accés mitjançant curl..."

    # Prova amb curl
    curl http://$NODE_IP:$NODE_PORT

    echo -e "\n\nLlistant tots els pods per verificar el desplegament:"
    kubectl get pods

    echo -e "\nComprovant l'estat del PV i PVC:"
    kubectl get pv
    kubectl get pvc

    # Comprovar els punts de muntatge als pods
    echo -e "\nComprovant els punts de muntatge als pods:"
    FIRST_POD=$(kubectl get pods -l app=nginx-nfs -o jsonpath='{.items[0].metadata.name}')
    echo "Comprovant els punts de muntatge al pod $FIRST_POD:"
    kubectl exec -it $FIRST_POD -- df -h | grep nfs

    echo -e "\nComprovant el contingut de /usr/share/nginx/html al pod:"
    kubectl exec -it $FIRST_POD -- ls -la /usr/share/nginx/html

    echo -e "\nCreant un fitxer de prova per demostrar l'emmagatzematge compartit:"
    TEST_CONTENT="Contingut de prova creat el $(date)"
    kubectl exec -it $FIRST_POD -- bash -c "echo '$TEST_CONTENT' > /usr/share/nginx/html/test-file.html"

    echo -e "\nVerificant que el fitxer de prova existeix al pod:"
    kubectl exec -it $FIRST_POD -- ls -la /usr/share/nginx/html

    echo -e "\nVerificant el contingut a través de Nginx:"
    curl http://$NODE_IP:$NODE_PORT/test-file.html

    echo -e "\nComprovant el fitxer de prova al segon pod:"
    SECOND_POD=$(kubectl get pods -l app=nginx-nfs -o jsonpath='{.items[1].metadata.name}')
    echo "Contingut al segon pod $SECOND_POD:"
    kubectl exec -it $SECOND_POD -- cat /usr/share/nginx/html/test-file.html

    echo -e "\nProva completada. Per confirmar que tot funciona correctament, verifica que:"
    echo "1. Tots els pods estan en estat Running"
    echo "2. El PV mostra una capacitat d'1Gi i estat Bound"
    echo "3. El PVC mostra una capacitat de 100Mi i estat Bound"
    echo "4. El volum NFS està muntat als pods (comprova la sortida de df -h)"
    echo "5. El mateix fitxer de prova és accessible des de múltiples pods"
    echo "6. El contingut és accessible via Nginx a través del NodePort"
    49 changes: 49 additions & 0 deletions 08-advanced-test.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,49 @@
    #!/bin/bash
    # Script per provar l'accés a NFS des de múltiples pods de Nginx

    echo "====================================="
    echo "PROVA AVANÇADA DE NFS AMB MÚLTIPLES PODS"
    echo "====================================="

    # Crear un fitxer basat en una marca de temps a l'NFS compartit
    TIMESTAMP=$(date +%s)
    TEST_CONTENT="Test file created at $(date). Random ID: $TIMESTAMP"

    # Obtenir el nom del primer pod
    FIRST_POD=$(kubectl get pods -l app=nginx-nfs -o jsonpath='{.items[0].metadata.name}')

    # Crear el fitxer de prova des del primer pod
    echo "Creant un fitxer de prova únic des del pod $FIRST_POD..."
    kubectl exec -it $FIRST_POD -- bash -c "echo '$TEST_CONTENT' > /usr/share/nginx/html/test-$TIMESTAMP.html"

    # Obtenir el NodePort
    NODE_PORT=$(kubectl get service nginx-nfs-service -o jsonpath='{.spec.ports[0].nodePort}')
    NODE_IP=$(kubectl get nodes -o jsonpath='{.items[0].status.addresses[?(@.type=="InternalIP")].address}')

    # Provar l'accés des de múltiples pods escalant el desplegament
    echo "Escalant el desplegament a 4 rèpliques per provar múltiples contenidors..."
    kubectl scale deployment nginx-nfs --replicas=4
    sleep 10

    # Obtenir tots els pods
    PODS=$(kubectl get pods -l app=nginx-nfs -o jsonpath='{.items[*].metadata.name}')

    echo -e "\nVerificant que tots els pods poden veure el mateix fitxer:"
    for POD in $PODS; do
    echo -e "\nPod: $POD"
    kubectl exec -it $POD -- ls -l /usr/share/nginx/html/test-$TIMESTAMP.html
    done

    # Accedir al fitxer a través del servei diverses vegades
    echo -e "\nAccedint al fitxer a través de diferents pods mitjançant el Servei:"
    for i in {1..10}; do
    echo -e "\nPetició $i:"
    curl -s http://$NODE_IP:$NODE_PORT/test-$TIMESTAMP.html
    echo ""
    done

    echo -e "\nProva completada. Tots els contenidors Nginx mostren el mateix contingut NFS."

    # Tornar al nombre original de rèpliques (2)
    echo "Tornant al nombre original de rèpliques..."
    kubectl scale deployment nginx-nfs --replicas=2
  3. srpiroliro created this gist Feb 28, 2025.
    43 changes: 43 additions & 0 deletions README.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,43 @@
    # Emmagatzematge de Kubernetes amb NFS i Nginx

    Aquesta solució mínima configura un servidor NFS i l'utilitza com a emmagatzematge persistent a Kubernetes amb pods de Nginx.

    ## Fitxers Inclosos

    - `setup-nfs-server.sh` - Script per configurar el servidor NFS
    - `nfs-pv.yaml` - Definició del Volum Persistent (1Gi amb ReadWriteMany i política Retain)
    - `nfs-pvc.yaml` - Reclamació de Volum Persistent (100Mi)
    - `nginx-deployment.yaml` - Desplegament de Nginx que munta el volum NFS
    - `nginx-service.yaml` - Servei per exposar Nginx
    - `deploy.sh` - Script de desplegament amb una comanda
    - `test.sh` - Script per verificar la configuració

    ## Desplegament Pas a Pas

    1. **Configura el servidor NFS** (al node de control):
    ```bash
    sudo ./setup-nfs-server.sh
    ```

    2. **Obté la IP del servidor NFS i actualitza `nfs-pv.yaml`**:
    ```bash
    ip addr show
    # Edita nfs-pv.yaml i substitueix SERVER_IP amb la IP real del teu servidor NFS
    ```

    3. **Desplega-ho tot** amb una sola comanda:
    ```bash
    ./deploy.sh
    ```

    4. **Prova el desplegament**:
    ```bash
    ./test.sh
    ```

    ## Característiques Principals

    - Volum Persistent NFS amb `persistentVolumeReclaimPolicy: Retain` (conserva les dades fins i tot si s'eliminen els PVC)
    - Múltiples pods de Nginx poden accedir al mateix recurs compartit NFS (ReadWriteMany)
    - El PV proporciona 1Gi mentre que el PVC sol·licita 100Mi
    - Nginx serveix contingut directament des del recurs compartit NFS
    16 changes: 16 additions & 0 deletions nfs-pv.yaml
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,16 @@
    apiVersion: v1
    kind: PersistentVolume
    metadata:
    name: nfs-pv
    labels:
    type: nfs
    spec:
    capacity:
    storage: 1Gi
    accessModes:
    - ReadWriteMany # Múltiples nodes poden llegir/escriure simultàniament
    persistentVolumeReclaimPolicy: Retain # Conserva les dades fins i tot quan s'elimina el PVC
    storageClassName: nfs-storage
    nfs:
    server: SERVER_IP # SUBSTITUEIX AMB LA IP DEL TEU SERVIDOR NFS
    path: /nfscontrol
    14 changes: 14 additions & 0 deletions nfs-pvc.yaml
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,14 @@
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
    name: nfs-pvc
    spec:
    accessModes:
    - ReadWriteMany
    storageClassName: nfs-storage
    resources:
    requests:
    storage: 100Mi # Sol·licitud de 100Mi com s'especifica
    selector:
    matchLabels:
    type: nfs
    34 changes: 34 additions & 0 deletions setup.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,34 @@
    #!/bin/bash

    echo "Setting up NFS server..."

    apt-get update
    apt-get install -y nfs-kernel-server

    mkdir -p /nfscontrol

    chown nobody:nogroup /nfscontrol
    chmod 755 /nfscontrol

    echo "<h1>Welcome to NFS-shared Nginx content!</h1>" > /nfscontrol/index.html
    echo "<p>This content is served from an NFS share mounted in multiple Nginx pods.</p>" >> /nfscontrol/index.html
    echo "<p>Last updated: $(date)</p>" >> /nfscontrol/index.html

    chown nobody:nogroup /nfscontrol/index.html
    chmod 644 /nfscontrol/index.html

    cat > /etc/exports << EOF
    /nfscontrol *(rw,sync,no_subtree_check,no_root_squash,insecure)
    EOF

    exportfs -ra

    systemctl restart nfs-kernel-server
    systemctl enable nfs-kernel-server

    echo "NFS Server setup completed. Directory /nfscontrol is now exported."
    echo "Your NFS server IP addresses:"

    ip addr show | grep "inet " | grep -v "127.0.0.1"

    echo "Use the appropriate IP address in your nfs-pv.yaml file"