在k8s中pod需要持久化數據就需要掛卷,一般會使用pvc,這樣就需要先有StorageClass,記錄一下如何創建使用NFS共享存儲的StorageClass
之前已經搭建了一個NFS共享存儲了,參考 搭建NFS共享存儲

用下面命令在k8s節點上安裝NFS組件,可以用 showmount -e 查看共享存儲,可以看到在10.110.30.216的主機上共享了/nfs-data 目錄
yum -y install nfs-utils;
systemctl enable rpcbind;
systemctl start rpcbind;
1、手動創建一個pv和pvc測試一下nfs是否可用,將下面代碼保存到文件后執行create安裝命令 kubectl create -f pv-pvc.yaml
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-test
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
nfs:
path: /nfs-data
server: 10.110.30.216
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: pvc-test
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 100Mi

創建之后查看綁定信息,可以看到已經成功綁定了,說明k8s中可以使用這個NFS,可以繼續下一步開始創建StorageClass了。
2、創建StorageClass參考github上的文檔,nfs-client是一個自動預配置程序,它使用已有的NFS服務器來支持Kubernetes卷的動態預設置,官方的方法是通過安裝一個nfs-client-provisioner,參考【nfs-client配置說明】,安裝所用的yaml文件在deploy文件夾中 https://github.com/kubernetes-incubator/external-storage/tree/master/nfs-client/deploy 但是還是需要根據自己情況對文件做一些修改,默認使用的鏡像是quay.io/external_storage/nfs-client-provisioner:latest,這個地址有可能無法訪問,如果遇到無法訪問的的情況可以試試其他的鏡像倉庫,例如去阿里雲的倉庫找找。
另外還提供了一個heml的chart包,地址 【nfs-client-provisioner的HELM包】,我這里集群已經安裝helm了,先嘗試用用這個方法。
3、修改chart包,將values.yaml中的部分參數值修改成實際值
nfs:
server: 10.110.30.216
path: /nfs-data
mountOptions:
reclaimPolicy: Retain
4、安裝
helm install --name nfs-client-provisioner nfs-client-provisioner/

可以看到StorageClass已經創建出來了,下面測試一下是否可用,安裝下面的nginx測試,注意storageClassName就是我們上面創建的StorageClass的名稱
# nginx.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: my-nginx-demo
labels:
app.kubernetes.io/name: my-nginx-demo
app.kubernetes.io/version: "1.0"
spec:
replicas: 1
serviceName: my-nginx-demo-svc
selector:
matchLabels:
app.kubernetes.io/name: my-nginx-demo
template:
metadata:
labels:
app.kubernetes.io/name: my-nginx-demo
spec:
restartPolicy: Always
containers:
- name: my-nginx-demo
image: "nginx:1.17.9"
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
protocol: TCP
livenessProbe:
httpGet:
path: /
port: http
readinessProbe:
httpGet:
path: /
port: http
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: html
volumeClaimTemplates:
- metadata:
name: html
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: nfs-client
---
apiVersion: v1
kind: Service
metadata:
name: my-nginx-demo-svc
labels:
app.kubernetes.io/name: my-nginx-demo
app.kubernetes.io/version: "1.0"
spec:
# type: ClusterIP
# type: LoadBalancer
type: NodePort
ports:
- port: 80
targetPort: http
protocol: TCP
name: http
selector:
app.kubernetes.io/name: my-nginx-demo

kubectl create -f nginx.yaml 安裝,然后查看pv、pvc以及pod可以看到都創建成功了,(pod的狀態先忽略吧,現在是因為掛載目錄為是nginx的文件目錄,應該是現在目錄為空導致啟動異常,暫時先不處理這個了),然后我們看NFS服務端的工項目錄,下面也創建了一個文件夾,對應着上面的pv

我們在nfs共享目錄的文件夾里創建個測試文件,看看容器內是否生效
vi index.html 然后輸入下面內容后保存 <html><body><h1>Test Page!</h1></body></html>

創建了文件之后,等一會pod的狀態也正常了,通過service訪問一下服務,也顯示正常了

通過上面頁面也可以看出來,pod掛的卷確實映射到了NFS服務共享出來的目錄中了
5、上面是通過helm模板的方式安裝的,如果沒有helm,可以手動執行,直接參考 https://github.com/kubernetes-incubator/external-storage/tree/master/nfs-client 頁面中的描述,按照實際情況修改 deploy 文件夾中的yaml文件,然后執行安裝就可以,修改的內容主要就是namespace
