1. 程式人生 > 實用技巧 >資料卷與持久卷

資料卷與持久卷

一.為什麼需要儲存卷

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服務端共享出來的路徑