Kubernetes核心概念之Volume存儲數據卷詳解
一.本地存儲
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存儲數據卷詳解