# ubuntu 安裝 nfs server 並給 pod 使用 ## 安裝 nfs server ``` $ sudo apt install -y nfs-kernel-server $ sudo mkdir -p /data/nfs $ sudo chown -R nobody:nogroup /data/nfs $ echo "/data/nfs 10.10.7.0/24(rw,sync,no_subtree_check,no_root_squash)" | sudo tee /etc/exports $ sudo systemctl enable --now nfs-kernel-server $ sudo exportfs -arv ``` 檢查有誰掛載 nfs ``` $ sudo showmount -e ``` ## 安裝 nfs client 在 k8s 每一台節點都要 ``` $ sudo apt install -y nfs-common $ sudo systemctl enable --now rpcbind $ sudo systemctl status rpcbind ● rpcbind.service - RPC bind portmap service Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; enabled; preset: enabled) Active: active (running) since Wed 2025-06-18 14:35:14 CST; 6min ago ``` ## K8s 安裝 NFS CSI Driver 要先裝好 nfs client,driver 才能讓 k8s 使用 nfs 的功能。 ``` # 安裝 csi nfs controller $ curl -skSL https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/master/deploy/install-driver.sh | bash -s master -- ``` ## 檢視 NFS CSI driver `csi-nfs-node` ds 會接受要求然後去跟 controller 溝通來掛載檔案 ``` $ kubectl -n kube-system get pod -o wide -l app=csi-nfs-controller NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES csi-nfs-controller-6868c4bb4f-4tk62 5/5 Running 1 (46s ago) 88s 10.10.7.38 w2 <none> <none> $ kubectl -n kube-system get pod -o wide -l app=csi-nfs-node NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES csi-nfs-node-2zqzt 3/3 Running 0 99s 10.10.7.39 w3 <none> <none> csi-nfs-node-jsrxk 3/3 Running 0 99s 10.10.7.33 m1 <none> <none> csi-nfs-node-kkvvj 3/3 Running 0 99s 10.10.7.37 w1 <none> <none> csi-nfs-node-ng8q7 3/3 Running 0 99s 10.10.7.35 m2 <none> <none> csi-nfs-node-z42gw 3/3 Running 0 99s 10.10.7.36 m3 <none> <none> csi-nfs-node-zsz72 3/3 Running 0 99s 10.10.7.38 w2 <none> <none> ``` ## 建立 NFS CSI Storage Class 需要宣告 nfs server 位置 ``` $ nano csi-nfs-sc.yaml apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: nfs-csi provisioner: nfs.csi.k8s.io parameters: server: 10.10.7.30 # 只要透過這個 sc 就是使用這台 server 的 /data/nfs share: /data/nfs reclaimPolicy: Retain # 並且狀態都是保留的 volumeBindingMode: Immediate ``` ``` $ kubectl apply -f csi-nfs-sc.yaml $ kubectl get sc NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE nfs-csi nfs.csi.k8s.io Retain Immediate false 13s ``` * nfs-csi 設為 default ``` $ kubectl patch storageclass nfs-csi -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}' $ kubectl get sc NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE nfs-csi (default) nfs.csi.k8s.io Retain Immediate false 106m ``` ## 測試 pod 掛載 nfs ``` $ nano deploy.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-nfs labels: app: nginx-nfs spec: replicas: 1 selector: matchLabels: app: nginx-nfs template: metadata: labels: app: nginx-nfs spec: containers: - name: nginx image: nginx ports: - containerPort: 80 volumeMounts: - name: html-volume mountPath: /usr/share/nginx/html volumes: - name: html-volume persistentVolumeClaim: claimName: pvc-nfs-dynamic --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-nfs-dynamic spec: accessModes: - ReadWriteMany resources: requests: storage: 10Gi storageClassName: nfs-csi ``` ``` $ kubectl apply -f deploy.yaml ``` 檢視 pv,pvc ``` $ kubectl get pvc,pv NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE persistentvolumeclaim/pvc-nfs-dynamic Bound pvc-1eb96fff-227e-435e-bd86-795ca51c6c82 10Gi RWX nfs-csi <unset> 20s NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE persistentvolume/pvc-1eb96fff-227e-435e-bd86-795ca51c6c82 10Gi RWX Retain Bound default/pvc-nfs-dynamic nfs-csi <unset> 19s ``` 檢視 pod 是否成功掛載 ``` $ kubectl get po NAME READY STATUS RESTARTS AGE nginx-nfs-64597659f8-fmqvb 1/1 Running 0 50s ``` 測試寫入資料 ``` $ kubectl exec nginx-nfs-64597659f8-fmqvb -- sh -c "echo hello > /usr/share/nginx/html/index.html" ``` 回到 nfs server 可以看到有動態產生資料 ``` $ ls -l /data/nfs total 4 drwxr-xr-x 2 root root 4096 Jun 18 15:07 pvc-1eb96fff-227e-435e-bd86-795ca51c6c82 $ cat /data/nfs/pvc-1eb96fff-227e-435e-bd86-795ca51c6c82/index.html hello ``` ## 清理環境 ``` $ kubectl delete -f deploy.yaml $ kubectl delete pv pvc-1eb96fff-227e-435e-bd86-795ca51c6c82 ```
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up