K8S實戰(十五)| 存儲卷概念

前言

容器中的文件在磁盤上是臨時存放,容器崩潰重啓後,容器將被以乾淨狀態重建,崩潰以前建立的文件將被清除。html

K8S 使用卷的概念來管理容器生成的需持久化的文件,卷也可用於同一個 Pod 中多個容器之間共享文件。mysql

更新歷史

Volume 的類型

emptyDir 卷

  1. 容器崩潰並不會致使 Pod 被從節點上移除,所以容器崩潰時 emptyDir 卷中的數據是安全的。
  2. 當 Pod 由於某些緣由被從節點上刪除時,emptyDir 卷中的數據也會永久刪除。

示例linux

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: nginx
    name: test-container
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir: {}

persistentVolumeClaim 卷

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

cephfs 卷

  1. cephfs 容許您將現存的 CephFS 卷掛載到 Pod 中。
  2. cephfs 卷的內容在刪除 Pod 時會被保留,卷只是被卸載掉了。
  3. 這意味着 CephFS 卷能夠被預先填充數據,而且這些數據能夠在 Pod 之間"傳遞"。
  4. CephFS 卷可同時被多個寫者掛載。

configMap 卷

  1. ConfigMap 資源提供了向 Pod 注入配置數據的方法。
  2. ConfigMap 對象中存儲的數據能夠被 configMap 類型的卷引用,而後被應用到 Pod 中運行的容器。
  3. 能夠在 volumes 字段中引用 configMap 名稱來生成一個卷。
  4. 能夠自定義 ConfigMap 中特定條目所要使用的路徑。
  5. 若是容器以 subPath 卷掛載方式使用 ConfigMap 時,將沒法接收 ConfigMap 的更新。

示例sql

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

ConfigMap 中 key log_level 中的內容將被掛載到 Pod 路徑 /etc/config/log_level 中api

路徑由 spec.containers 中參數 volumeMounts.mountpath 和 volumes 中參數 items.path 拼接而成安全

secret 卷

secret 卷用來給 Pod 傳遞敏感信息,例如密碼。服務器

能夠將 secret 存儲在 Kubernetes API 服務器上,而後以文件的形式掛在到 Pod 中,實現與 Pod 解耦。微信

secret 卷由 tmpfs(基於內存的文件系統)提供存儲,所以它們永遠不會被寫入持久化的存儲器。網絡

容器以 subPath 卷的方式掛載 Secret 時,它將沒法實時獲取 Secret 的更新。

nfs 卷

nfs 卷能將 NFS (網絡文件系統) 掛載到您的 Pod 中。

不像 emptyDir 那樣會在刪除 Pod 的同時也會被刪除,nfs 卷的內容在刪除 Pod 時會被保存,卷只是被卸載掉了。

這意味着 nfs 卷能夠被預先填充數據,而且這些數據能夠在 Pod 之間"傳遞"。

hostPath 卷

hostPath 卷能將主機節點文件系統上的文件或目錄掛載到 Pod 中。

當 Pod 漂移到其餘節點後,數據沒法複用,僅適用於開發和測試環境。

使用 subPath

引用卷的時候,默認會將卷的根目錄掛載到指定路徑中。

能夠經過 subPath 掛載卷的子目錄,而不是根目錄。

示例

apiVersion: v1
kind: Pod
metadata:
  name: my-lamp-site
spec:
    containers:
    - name: mysql
      image: mysql
      volumeMounts:
      - mountPath: /var/lib/mysql
        name: site-data
        subPath: mysql
    volumes:
    - name: site-data
      persistentVolumeClaim:
        claimName: my-lamp-site-data

將掛載 site-data 卷的子目錄 mysql 到容器目錄 /var/lib/mysql 中

資源限制

emptyDir、hostPath 卷能夠消耗的磁盤資源不受限制,就是說可能會寫滿磁盤。

結束語

卷比 Pod 中運行的任何容器的存活期都長,在容器從新啓動時數據也會獲得保留。

使用卷時, Pod 聲明中須要提供卷的類型 (.spec.volumes)和卷掛載的位置 (.spec.containers.volumeMounts)。

容器中的進程能看到由它們的 Docker 鏡像和卷組成的文件系統視圖。 

Docker 鏡像位於文件系統層次結構的根部,而且任何 Volume 都掛載在鏡像內的指定路徑上。

卷不能掛載到其餘卷,也不能與其餘卷有硬連接。

聯繫我

微信公衆號:zuolinux_com

微信掃碼關注

相關文章
相關標籤/搜索