k8s創建使用nfs的StorageClass


在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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM