1. 程式人生 > >Kubernetes核心概念之Volume存儲數據卷詳解

Kubernetes核心概念之Volume存儲數據卷詳解

gin creat 自己的 當前 ges 訪問路徑 服務器 tor type

在Docker中就有數據卷的概念,當容器刪除時,數據也一起會被刪除,想要持久化使用數據,需要把主機上的目錄掛載到Docker中去,在K8S中,數據卷是通過Pod實現持久化的,如果Pod刪除,數據卷也會一起刪除,k8s的數據卷是docker數據卷的擴展,K8S適配各種存儲系統,包括本地存儲EmptyDir,HostPath,網絡存儲NFS,GlusterFS,PV/PVC等,下面就詳細介紹下K8S的存儲如何實現。

一.本地存儲

1,EmptyDir

①編輯EmptyDir配置文件

vim emptydir.yaml

apiVersion: v1
kind: Pod        #類型是Pod
metadata:
  labels:
    name: redis
    role: master        #定義為主redis
  name: redis-master
spec:
  containers:
    - name: master
      image: redis:latest
      env:        #定義環境變量
        - name: MASTER
          value: "true"
      ports:        #容器內端口
        - containerPort: 6379
      volumeMounts:        #容器內掛載點
        - mountPath: /data
          name: redis-data        #必須有名稱
  volumes:
    - name: redis-data        #跟上面的名稱對應
      emptyDir: {}        #宿主機掛載點

②創建Pod

kubectl create -f emptydir.yaml

技術分享圖片

此時Emptydir已經創建成功,在宿主機上的訪問路徑為/var/lib/kubelet/pods/<pod uid>/volumes/kubernetes.io~empty-dir/redis-data,如果在此目錄中創建刪除文件,都將對容器中的/data目錄有影響,如果刪除Pod,文件將全部刪除,即使是在宿主機上創建的文件也是如此,在宿主機上刪除容器則k8s會再自動創建一個容器,此時文件仍然存在。

2.HostDir

在宿主機上指定一個目錄,掛載到Pod的容器中,其實跟上面的寫法不盡相同,這裏只截取不同的部分,當pod刪除時,本地仍然保留文件

...
  volumes:
    - name: redis-data        #跟上面的名稱對應
      hostPath: 
        path: /data      #宿主機掛載點


二.網絡數據卷(NFS)

1.NFS

①編輯一個使用NFS的Pod的配置文件

vim nfs.yaml

apiVersion: v1
kind: Pod
metadata:
  name: nfs-web
spec:
  containers:
    - name: web
      image: nginx
      imagePullPolicy: Never        #如果已經有鏡像,就不需要再拉取鏡像
      ports:
        - name: web
          containerPort: 80
          hostPort: 80        #將容器的80端口映射到宿主機的80端口
      volumeMounts:
        - name : nfs        #指定名稱必須與下面一致
          mountPath: "/usr/share/nginx/html"        #容器內的掛載點
  volumes:
    - name: nfs            #指定名稱必須與上面一致
      nfs:            #nfs存儲
        server: 192.168.66.50        #nfs服務器ip或是域名
        path: "/test"                #nfs服務器共享的目錄

②創建Pod

kubectl create -f nfs.yaml

技術分享圖片

在節點端可以用mount命令查詢掛載情況

技術分享圖片

因為我映射的是代碼目錄,在/test目錄中創建index.html文件後,這個文件也將在容器中生效,當Pod刪除時,文件不受影響,實現了數據持久化。


三.Persistent Volume(PV)和Persistent Volume Claim(PVC)

其實這兩種數據卷也屬於網絡數據卷,單拎出來是因為我覺得這個比前面的數據卷要酷多了,有種大數據,雲平臺的意思,當用戶要使用數據存儲的時候他是否還需要知道是什麽類型的數據存儲,答案是不需要,用戶只想要安全可靠的數據存儲,而且實現起來很簡單,管理員建立一個存儲平臺,用戶按自己的需求消費就可以了,下面就來實現PV/PVC架構。

1.Persistent Volume(PV)

①編輯PV配置文件

vim persistent-volume.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
  labels:
    type: nfs        #指定類型是NFS
spec:
  capacity:            #指定訪問空間是15G
    storage: 15Gi
  accessModes:        #指定訪問模式是能在多節點上掛載,並且訪問權限是讀寫執行
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Recycle        #指定回收模式是自動回收,當空間被釋放時,K8S自動清理,然後可以繼續綁定使用
  nfs:
    server: 192.168.66.50
    path: /test

②創建PV

kubectl create -f persistent-volume.yaml

技術分享圖片

技術分享圖片 狀態已經變成可用

2.Persistent Volume Claim(PVC)

①編輯PVC配置文件

vim test-pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:        #指定請求的資源,存儲3G
    requests:
      storage: 3Gi

如果當前有兩個PV,一個10G,一個2G,請求資源為3G,那麽將直接使用10GPV

②創建PVC

kubectl create -f test-pvc.yaml

技術分享圖片

技術分享圖片

因為我之前又創建了一個3G可回收的PV,所以自動選擇這個卷了,在PVC選擇PV後,不管PV有多少空間都會直接占滿所有虛擬空間,實際使用則由Pod來完成

技術分享圖片

3.創建Pod以使用平臺空間

vim pv-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: redis111
  labels:
    app: redis111
spec:
  containers:
  - name: redis
    image: redis
    imagePullPolicy: Never
    volumeMounts:
    - mountPath: "/data"
      name: data
    ports:
    - containerPort: 6379
  volumes:
  - name: data
    persistentVolumeClaim:        #指定使用的PVC
      claimName: test-pvc           #名字一定要正確

當前Pod可用空間為3G,如果超過3G,則需要再創建存儲來滿足需求,因為是網絡數據卷,如果需要擴展空間,直接刪除Pod再建立一個即可。

Kubernetes核心概念之Volume存儲數據卷詳解