資料卷與持久卷
阿新 • • 發佈:2020-12-15
一.為什麼需要儲存卷
Container中的檔案在磁碟上是臨時存放的,這給container中執行比較重要的應用程式帶來一些問題
- 當容器崩潰時檔案丟失:kubelet會重新啟動容器,但容器會以乾淨的狀態重啟
- 同一pod中執行多個容器,如何共享檔案
回顧:容器部署過程中一般需要三種資料
- 啟動時需要初始化資料:例如配置檔案
- 啟動過程中會產生臨時資料,該臨時資料需要多個容器共享
- 啟動過程中產生的持久化資料,例如mysql的資料目錄
kubernetes中的Volume提供了容器中掛載外部儲存的能力
Pod需要設定捲來源(spec.volume)和掛載點(spec.containers.volumeMounts)兩個資訊後才可以使用相應的Volume
官網文件:https://kubernetes.io/zh/docs/concepts/storage/volumes/
二.資料卷的型別
- 本地(hostPath、emptyDir)
- 網路(NFS、Ceph、 GlusterFs)
- 公有云(AWS EBS)
- k8s資源(configmap、secret)
三.emptyDir
emptyDir是一個臨時儲存卷,與pod的生命週期繫結在一起。pod刪除,卷也會被刪除
應用場景:pod容器之間資料共享
apiVersion: v1 kind: Pod metadata: name: emptydir-pod namespace: volume spec: containers:- name: write image: centos command: ["bash","-c","for i in {1..100};do echo $i >> /data/hello;sleep 1;done"] volumeMounts: - name: data mountPath: /data - name: read image: centos command: ["bash","-c","tail -f /data/hello"] volumeMounts: - name: data mountPath:/data volumes: - name: data emptyDir: {}
P
###多個pod之間資料共享
三.hostPath
hostPath卷:掛載node檔案系統(pod所在的節點)上的檔案或者目錄到pod中的容器內
應用場景:Pod中的容器需要訪問宿主機檔案
apiVersion: v1 kind: Pod metadata: name: hostpath-pod namespace: volume spec: containers: - name: hostpath-pod image: nginx volumeMounts: - mountPath: /data/ # 容器中掛載的目錄位置 name: configdir # 掛載名: 與volumes中的name欄位一致 - mountPath: /data/volume name: yamlfile volumes: - name: configdir hostPath: # 確保檔案所在目錄成功建立。 path: /root/yaml/config type: DirectoryOrCreate - name: yamlfile hostPath: path: /root/yaml/volume/hostpath-pod.yaml type: FileOrCreate
四.NFS卷
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-web namespace: volume spec: selector: matchLabels: app: nginx replicas: 3 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx volumeMounts: - name: wwwroot mountPath: /usr/share/nginx/html ports: - containerPort: 80 volumes: - name: wwwroot nfs: server: 192.168.11.130 # nfs伺服器 path: /ifs/kubernetes # nfs服務端共享出來的路徑