Kubernetes中的數據卷

Volume

容器中的文件在磁盤上是臨時存放的,這給容器中運行的特殊應用程序帶來一些問題。 首先,當容器崩潰時,kubelet 將重新啓動容器,容器中的文件將會丟失——因爲容器會以乾淨的狀態重建。 其次,當在一個 Pod 中同時運行多個容器時,常常需要在這些容器之間共享文件。 Kubernetes 抽象出 Volume 對象來解決這兩個問題。

Kubernetes 支持下列類型的卷:

awsElasticBlockStore、 azureDisk、 azureFile、 cephfs、 cinder、configMap、csi、downwardAPI、emptyDir、fc (fibre channel)、flexVolume、flocker、gcePersistentDisk、gitRepo (deprecated)、glusterfs、hostPath、iscsi、local、nfs、persistentVolumeClaimprojected、portworxVolume、quobyte、rbd、scaleIO、secret、storageos、vsphereVolume

1.1 emptyDir

當 Pod 指定到某個節點上時,首先創建的是一個 emptyDir 卷,並且只要 Pod 在該節點上運行,卷就一直存在。 就像它的名稱表示的那樣,卷最初是空的。 儘管 Pod 中的容器掛載 emptyDir 卷的路徑可能相同也可能不同,但是這些容器都可以讀寫 emptyDir 卷中相同的文件。 當 Pod 因爲某些原因被從節點上刪除時,emptyDir 卷中的數據也會永久刪除。

emptyDir 的一些用途:

  • 緩存空間,例如基於磁盤的歸併排序。
  • 爲耗時較長的計算任務提供檢查點,以便任務能方便地從崩潰前狀態恢復執行。
  • 在 Web 服務器容器服務數據時,保存內容管理器容器獲取的文件。
apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: k8s.gcr.io/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir: {}

1.2 configMap

configMap 資源提供了向 Pod 注入配置數據的方法。 ConfigMap 對象中存儲的數據可以被 configMap 類型的卷引用,然後被應用到 Pod 中運行的容器化應用。
當引用 configMap 對象時,你可以簡單的在 Volume 中通過它名稱來引用。 還可以自定義 ConfigMap 中特定條目所要使用的路徑。 例如,要將名爲 log-config 的 ConfigMap 掛載到名爲 configmap-pod 的 Pod 中,您可以使用下面的 YAML:

apiVersion: v1
kind: Pod
metadata:
  name: configmap-pod
spec:
  containers:
    - name: test
      image: busybox
      volumeMounts:
        - name: config-vol
          mountPath: /etc/config
  volumes:
    - name: config-vol
      configMap:
        name: log-config
        items:
          - key: log_level
            path: log_level

log-config ConfigMap 是以卷的形式掛載的, 存儲在 log_level 條目中的所有內容都被掛載到 Pod 的 “/etc/config/log_level” 路徑下。 請注意,這個路徑來源於 Volume 的 mountPath 和 log_level 鍵對應的 path。

1.3 hostPath

hostPath 卷能將主機節點文件系統上的文件或目錄掛載到您的 Pod 中。 雖然這不是大多數 Pod 需要的,但是它爲一些應用程序提供了強大的逃生艙。
例如,hostPath 的一些用法有:

  • 運行一個需要訪問 Docker 引擎內部機制的容器;請使用 hostPath 掛載 /var/lib/docker 路徑。
  • 在容器中運行 cAdvisor 時,以 hostPath 方式掛載 /sys。
  • 允許 Pod 指定給定的 hostPath 在運行 Pod 之前是否應該存在,是否應該創建以及應該以什麼方式存在。
取值 行爲
空字符串(默認)用於向後兼容,這意味着在安裝 hostPath 卷之前不會執行任何檢查。
DirectoryOrCreate 如果在給定路徑上什麼都不存在,那麼將根據需要創建空目錄,權限設置爲 0755,具有與 Kubelet 相同的組和所有權。
Directory 在給定路徑上必須存在的目錄。
FileOrCreate 如果在給定路徑上什麼都不存在,那麼將在那裏根據需要創建空文件,權限設置爲 0644,具有與 Kubelet 相同的組和所有權。
File 在給定路徑上必須存在的文件。
Socket 在給定路徑上必須存在的 UNIX 套接字。
CharDevice 在給定路徑上必須存在的字符設備。
BlockDevice 在給定路徑上必須存在的塊設備。

當使用這種類型的卷時要小心,因爲:

  • 具有相同配置(例如從 podTemplate 創建)的多個 Pod 會由於節點上文件的不同而在不同節點上有不同的行爲。
  • 當 Kubernetes 按照計劃添加資源感知的調度時,這類調度機制將無法考慮由 hostPath 使用的資源。
  • 基礎主機上創建的文件或目錄只能由 root 用戶寫入。您需要在 特權容器 中以 root 身份運行進程,或者修改主機上的文件權限以便容器能夠寫入 hostPath 卷。
apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: k8s.gcr.io/test-webserver
    name: test-container
    volumeMounts:
    - name: test-volume
      mountPath: /test-pd
  volumes:
  - name: test-volume
    hostPath:
      # directory location on host
      path: /data
      # this field is optional
      type: Directory

1.4 local

local 卷指的是所掛載的某個本地存儲設備,例如磁盤、分區或者目錄。

local 卷只能用作靜態創建的持久卷。尚不支持動態配置。

相比 hostPath 卷,local 卷可以以持久和可移植的方式使用,而無需手動將 Pod 調度到節點,因爲系統通過查看 PersistentVolume 所屬節點的親和性配置,就能瞭解卷的節點約束。

1.5 persistentVolumeClaim (PVC)

persistentVolumeClaim 卷用來將持久卷(PersistentVolume)掛載到 Pod 中。 持久卷是用戶在不知道特定雲環境細節的情況下"申領"持久存儲(例如 GCE PersistentDisk 或者 iSCSI 卷)的一種方法。

1.5.1 創建 hostPath 類型的 PersistentVolume

apiVersion: v1
kind: PersistentVolume
metadata:
  name: task-pv-volume
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"

查看

[root@harbor ~]# kubectl get pv task-pv-volume 
NAME             CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
task-pv-volume   10Gi       RWO            Retain           Available           manual                  79s

1.5.2 創建 PersistentVolumeClaim

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: task-pv-claim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi

再次查看pv

[root@harbor ~]# kubectl get pv task-pv-volume
NAME             CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                   STORAGECLASS   REASON   AGE
task-pv-volume   10Gi       RWO            Retain           Bound    default/task-pv-claim   manual                  4m9s

查看pvc

[root@harbor ~]# kubectl get pvc task-pv-claim
NAME            STATUS   VOLUME           CAPACITY   ACCESS MODES   STORAGECLASS   AGE
task-pv-claim   Bound    task-pv-volume   10Gi       RWO            manual         22s

1.5.3 創建Pod使用pvc

注:Pod 的配置文件指定了 PersistentVolumeClaim,而不是指定 PersistentVolume。

apiVersion: v1
kind: Pod
metadata:
  name: task-pv-pod
spec:
  containers:
    - name: task-pv-container
      image: nginx
      ports:
        - containerPort: 80
          name: "http-server"
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: task-pv-storage
  volumes:
    - name: task-pv-storage
      persistentVolumeClaim:
        claimName: task-pv-claim

1.6 projected

projected 卷類型能將若干現有的捲來源映射到同一目錄上。

目前,可以映射的捲來源類型如下:

  • secret
  • downwardAPI
  • configMap
  • serviceAccountToken

所有的捲來源需要和 Pod 處於相同的命名空間。

apiVersion: v1
kind: Pod
metadata:
  name: test-projected-volume
spec:
  containers:
  - name: test-projected-volume
    image: busybox
    args:
    - sleep
    - "86400"
    volumeMounts:
    - name: all-in-one
      mountPath: "/projected-volume"
      readOnly: true
  volumes:
  - name: all-in-one
    projected:
      sources:
      - secret:
          name: user
      - secret:
          name: pass
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章