K8s的存儲卷使用總結

K8s的存儲卷:
  它有四種存儲卷:
  1. emptyDir: 空目錄,這種存儲卷會隨着Pod的刪除而被清空,它通常做爲緩存目錄使用,或臨時目錄,
   當作緩存目錄時,一般會將一塊內存空間映射到該目錄上,讓Pod作爲緩存目錄使用。
  2. hostPath


SAN(存儲區域網絡): iSCSI,FB
NAS(網絡附加存儲): nfs,cifs
分佈式存儲: Glusterfs, ceph(rbd), cephfs
雲存儲: EBS(彈性塊存儲),Azure Diskhtml

#emptyDir存儲卷的示例:
vim  pod-volume.yaml
apiVersion:v1
kind: Pod
metadata:
 name: pod-demo
 namespace: default
 labels:
     app: myapp
     tier: frontend
 annotations:
     magedu.com/created-by: 「cluster admin」
spec:
  containers:
  -  name: httpd
     image: busybox:latest
     imagePullPolicy: IfNotPresent   #設定鏡像策略爲即使本地沒有鏡像也不去下載.
     command: ["/bin/httpd","-f","-h", " /data/web/html"]
     ports:
     - name: http
       containerPort: 80
     volumeMounts:          #存儲卷可被一個Pod中的多個容器掛載.誰須要就定義掛載便可.
     - name: html
       mountPath: /data/web/html/
  - name: busybox
    image: busybox: latest
    imagePullPolicy: IfNotPresent
    volumeMounts:
    -  name: html
       mountPath: /data/
    command:
    - 「/bin/sh」
    - 「-c」
    - "while true; do echo $(date) >> /data/index.html; sleep 2; done」
volumes:
-  name: html
   emptyDir: {}

  #開始建立Pod
  kubectl apply -f pod-volume.yaml
  kubectl get pods
  kubectl exec -it pod-demo -c busybox -- /bin/sh    #聯入pod-demo這個Pod中叫busybox的容器中.

#注意:
 當一個Pod中有多個容器時,當Pod啓動出現錯誤,可經過
  kubectl describe pods pod-demo      #查看其中每一個容器的Status,來確認每一個容器的運行狀態。node

 

gitRepo類型的存儲卷:
 gitRepo:這種類型的存儲卷是在容器啓動時,將遠程git倉庫中的數據(如: 網站代碼)給克隆一份到本地,而後啓動容器使用該克隆的數據來提供服務,這份克隆的數據在容器運行過程當中不會將更新的數據同步到git倉庫中,同時git倉庫中的更新也不會同步到該容器中,若要實現當git倉庫發生改變時,能同步到容器的存儲卷中,還要藉助於輔助容器,每隔一段時間就去克隆一份git倉庫中的數據, 當本地數據改變時,再同步到git倉庫中。

hostPath類型的存儲卷:
 它有一下幾種類型:
  1. DirectoryOrCreate: 它能夠是宿主機上的一個已存在的目錄,也可不存在,若不存在則自動建立.
  2. Directory: 它必須是宿主機上一個已經存在的目錄。
  3. FileOrCreate: 它能夠是宿主機上的一個文件,若此文件不存在則建立一個空文件來掛載。
  4. File:宿主機上的一個已經存在的文件,若不存在則報錯。
  5. Socket:宿主機上一個已經存在的Unix Socket文件.
  6. CharDevice: 宿主機上一個已存在的字符類型的設備文件.
  7. BlockDevice: 宿主機上一個已存在的塊類型的設備文件。nginx

#建立一個hostPath類型的存儲卷示例:
vim  pod-hostpath-vol.yaml
apiVersion: v1
kind: Pod
metadata:
   name: pod-hostpath-vol
   namespace: default
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    volumeMounts:
      - name: html
        mountPath: /usr/share/nginx/html/
    volumes:
    - name: html
      hostPath:
          #這是定義宿主機上那個目錄做爲容器myapp的存儲卷的.
        path: /data/pod/volume1         
        type: DirectoryOrCreate

  建立Pod前的準備:
  1. 由於不肯定Pod會被調度到那個節點上,所以再兩個節點上都建立/data/pod/volume1
      並再該目錄中都建立一個網頁文件,並有意讓兩個節點上的目錄中的網頁文件內容不一樣
      以便查看效果。git

建立Pod
  kubectl apply -f pod-hostpath-vol.yaml
  kubectl get pods -o wide
  curl   http://Pod_IP

  #刪除看它若調度到第二個節點上,繼續訪問Pod_IP,會發現依然可訪問.
  #但這僅實現了節點級別數據持久,若節點掛了,數據依然不保!
  kubectl delete -f pod-hostpath-vol.yaml 
      web

NFS類型的網絡共享存儲卷:
  1. 配置前的準備工做
  node10:
    在集羣外的一臺主機上啓動NFS服務,讓它來提供網絡共享存儲.
    yum install -y nfs nfs-utils
    vim /etc/exports
     /data/volumes 192.168.111.0/24(rw,no_root_squash) 

    mkdir -pv /data/volumes
    systemctl start nfs

  2. 在集羣內運行Pod的兩個宿主機上測試掛載nfs共享,若能掛載,則Pod必定是能使用NFS共享存儲的。
    yum install -y nfs-utils
    mount -t nfs node10:/data/volumes /mnt    #若能成功掛載,就能夠卸載了.數據庫

3. 建立NFS 共享存儲卷的配置清單:
vim  pod-nfs-vol.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-nfs-vol
  namespace: default
spec:
  containers:
  - name: myapp
      image: ikubernetes/myapp:v1
      volumeMounts:
    -  name: html
       mountPath: /usr/share/nginx/html/
 volumes:
 -  name: html
    nfs:
     path: /data/volumes
     server: node10.test.com    #先測試直接讓Pod掛載NFS共享

 #應用上面的清單文件,建立Pod來測試vim

   kubectl apply -f pod-nfs-vol.yaml
   kubectl get pods

 node10: #在NFS共享目錄中建立index.html
  echo 「<h1> NFS share stroage server </h1>」 >> /data/volumes/index.html

回到pod所在節點:
  curl   http://Pod_IP    #能夠看到正常返回NFS Share ....的信息.後端

 

PVC 使用示例:
  PV的訪問模型:
   accessModes:
   ReadWriteOnce【簡寫:RWO】: 單路讀寫,即僅能有一個節點掛載讀寫
   ReadOnlyMany【ROX】: 多路只讀
     ReadWriteMany【RWX】:多路讀寫

1. 準備後端存儲環境:
 node10:
  mkdir /data/volumes/{v1,v2,v3,v4,v5}

  vim /etc/exports
    /data/volumes/v1         192.168.111.0/24(rw,no_root_squash)
    /data/volumes/v2    192.168.111.0/24(rw,no_root_squash)
    /data/volumes/v3    192.168.111.0/24(rw,no_root_squash)

  exportfs   -arv
  showmount   -eapi

2.  將這幾個共享存儲卷在K8s上定義爲PV
vim  pv-demo.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv01   #PV是集羣級別的資源,所以它不能定義在名稱空間中,它能夠被任何名稱空間使用.
                 名稱空間也不能嵌套,由於它也是集羣級別的資源.
  labels:
       name: pv01
       rate: high    #添加一個速度標籤,用於標明其存儲效率更高,以便後期標籤選擇器選擇.
spec:
  nfs:
    path: /data/volumes/v1
    server: node10.test.com
  #對於訪問模型,可定義爲底層共享存儲的子集,但不能是超集
  #即: NFS支持RWO,ROX,RWX,但我建立PV時,可只提供其中一個或多個.
  accessModes: ["ReadWriteMany", 「ReadWriteOnce」]
 capacity:
      #對於存儲能力,它的單位有:T,P,G,M,K或 Ti,Pi,Gi,Mi,Ki 區別:加i的是以1024爲換算單位的。
      storage: 2Gi 
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv02     
  labels:
   name: pv02
   rate: high       
spec:
 nfs:
    path: /data/volumes/v2
    server: node10.test.com
 accessModes: ["ReadWriteMany","ReadOnlyMany"]
 capacity:
    storage: 5Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv03    
  labels:
    name: pv03
    rate: high       
spec:
 nfs:
   path: /data/volumes/v3
   server: node10.test.com
 accessModes: ["ReadWriteMany","ReadOnlyMany"]
 capacity:
    storage: 10Gi

  建立PV
  kubectl apply -f pv-demo.yaml
  kubectl get pv
   RECLAIM POLICY:回收策略
    Retain: 保留,即若Pod綁定了一個PVC,PVC綁定了一個PV,後來Pod刪除了,那麼PV中的數據要怎麼處理?
        Retain是默認回收策略,即這些數據保留着,以便Pod再次建立時還能使用。
    Released: 這種回收策略是, 不保留數據, 即Pod刪除,則PV自動回收,清空裏面的數據,並容許其餘Pod綁定使用.
    Delete: 刪除,即PVC和PV解除綁定後,PV自動刪除.數據也就被清空了。緩存

建立PVC:
vim   pod-pvc-vol.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
     name: mypvc
     namespace: default
spec:
   #它必須是PV的子集,即PV必須能符合它的要求.
   accessModes: ["ReadWriteMany"]
   resources:
      requests:
        storage: 6Gi
---
apiVersion: v1
kind: Pod
metadata:
   name: pod-vol-pvc
   namespace: default
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    volumeMounts:
     - name: html
       mountPath: /usr/share/nginx/html/
    volumes:
    -  name: html
       persistentVolumeClaim:
         claimName: mypvc
# kubectl  apply  -f  pod-pvc-vol.yaml
    #驗證:
    # kubectl get pv
        NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM           STORAGECLASS   REASON   AGE
        pv01   1Gi        RWO,RWX        Retain           Available                                           7m3s
        pv02   2Gi        ROX,RWX        Retain           Available                                           7m3s
        pv03   5Gi        ROX,RWX        Retain           Available                                           6m3s
        pv04   10Gi       ROX,RWX        Retain           Bound       default/mypvc                           6m3s
        pv05   20Gi       ROX,RWX        Retain           Available                                           6m3s
        
# kubectl describe pod pod-vol-pvc 
        Name:         pod-vol-pvc
        Namespace:    default
        .....
            Mounts:
              /var/lib/nginx/html from html (rw)
              /var/run/secrets/kubernetes.io/serviceaccount from default-token-6xlcj (ro)
        .......
        Volumes:
          html:
            Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
            ClaimName:  mypvc
            ReadOnly:   false

# kubectl get pvc
        NAME    STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
        mypvc   Bound    pv04     10Gi       ROX,RWX                       100s

# kubectl describe pvc mypvc
        Name:          mypvc
        Namespace:     default
        StorageClass:  
        Status:        Bound
        Volume:        pv04
        .......
        Capacity:      10Gi
        Access Modes:  ROX,RWX
        VolumeMode:    Filesystem
        Events:        <none>
        Mounted By:    pod-vol-pvc  #這裏可查看此PVC當前掛載到那個容器裏了,本例中是掛載到 pod-vol-pvc這個容器中了。

注意:
 PVC 它是K8s中的標準資源,它存儲在API Server的etcd(集羣狀態存儲)存儲數據庫中,即使Pod由於故障被刪除了,依然不影響PVC的存在,下次Pod啓動後,依然可使用PVC.
相關文章
相關標籤/搜索