1. 程式人生 > 實用技巧 >k8s 儲存卷的定義與使用

k8s 儲存卷的定義與使用

認識PV/PVC/StorageClass

**PersistentVolume(PV):**是叢集中由管理員配置的一段網路儲存。 它是叢集中的資源,就像節點是叢集資源一樣。 PV是容量外掛,如Volumes,但其生命週期獨立於使用PV的任何單個pod。 此API物件捕獲儲存實現的詳細資訊,包括NFS,iSCSI或特定於雲提供程式的儲存系統。

**PersistentVolumeClaim(PVC)**是由使用者進行儲存的請求。 它類似於pod。 Pod消耗節點資源,PVC消耗PV資源。Pod可以請求特定級別的資源(CPU和記憶體)。宣告可以請求特定的大小和訪問模式(例如,可以一次讀/寫或多次只讀)。

雖然PersistentVolumeClaims允許使用者使用抽象儲存資源,但是PersistentVolumes對於不同的問題,使用者通常需要具有不同屬性(例如效能)。群集管理員需要能夠提供各種PersistentVolumes不同的方式,而不僅僅是大小和訪問模式,而不會讓使用者瞭解這些卷的實現方式。對於這些需求,有StorageClass 資源。

StorageClass為管理員提供了一種描述他們提供的儲存的“類”的方法。 不同的類可能對映到服務質量級別,或備份策略,或者由群集管理員確定的任意策略。 Kubernetes本身對於什麼類別代表是不言而喻的。 這個概念有時在其他儲存系統中稱為“配置檔案”。

建立PV -- PV 的全稱是:PersistentVolume(持久化卷)

第一種: NFS 型別的儲存卷PV

(1)安裝NFS:

  方法1: docker run -d --name nfs --privileged -v /some/where/fileshare:/nfsshare -e SHARED_DIRECTORY=/nfsshare -p 2049:2049 itsthenetwork/nfs-server-alpine:latest (dockers環境)

   方法2:https://www.jianshu.com/p/f5d1e8594deb

(2)建立PV:

建立檔案pv_nfs.yml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 200M
  accessModes:
    - ReadWriteMany
  nfs:
    server: 172.17.97.148
    path: "/"

執行安裝:kubectl apply -f pv_nfs.yml

第二種: LOCAL型別的儲存卷PV:

  建立檔案pv_local.yml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-local
spec:
  capacity:
    storage: 10Gi
                                 
  volumeMode: Filesystem
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Delete
  storageClassName: local-storage
  local:
    path: /some/where/localpv
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - kind1-control-plane
          - kind1-worker

  執行安裝:kubectl apply -fpv_local.yml

第三種: 直接在建立pod時,使用本地儲存


PV的使用:

1. 建立PVC,建立檔案 pvc_nfs.yml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-nfs
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
     storage: 2Gi

  

部署 pvc:kubectl apply -f pvc_nfs.yml

2.使用PVC

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-pvc
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx-pvc
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
      volumes:
      - name: www
        persistentVolumeClaim:
          claimName: pvc-nfs

---

apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
  labels:
    app: nginx-svc
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: web
    nodePort:30001
  selector:
    app: nginx-pvc

  

參考資料:

https://blog.csdn.net/qq_25611295/article/details/86065053?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

https://blog.csdn.net/weixin_34391854/article/details/86085596?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param