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.

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):

    sudo ./setup-nfs-server.sh
  2. Obté la IP del servidor NFS i actualitza nfs-pv.yaml:

    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:

    ./deploy.sh
  4. Prova el desplegament:

    ./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
#!/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"
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
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
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
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
#!/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ó."
#!/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"
#!/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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment