Rems Nalivaiko [email protected]
Last active
February 28, 2025 22:26
-
-
Save srpiroliro/4d5a666cb7e6618e5ad2b968bc7d623a to your computer and use it in GitHub Desktop.
Aquesta solució mínima configura un servidor NFS i l'utilitza com a emmagatzematge persistent a Kubernetes amb pods de Nginx.
setup-nfs-server.sh- Script per configurar el servidor NFSnfs-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 NFSnginx-service.yaml- Servei per exposar Nginxdeploy.sh- Script de desplegament amb una comandatest.sh- Script per verificar la configuració
-
Configura el servidor NFS (al node de control):
sudo ./setup-nfs-server.sh
-
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 -
Desplega-ho tot amb una sola comanda:
./deploy.sh
-
Prova el desplegament:
./test.sh
- 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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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" |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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ó." |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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" |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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