Kubernetes(k8s) EmptyDir、HostPath、ConfigMap和Secret等幾種存儲類型介紹

來源:本站原創 Kubernetes 超過316 views圍觀 0條評論

一個運行中的容器,缺省情況下,對文件系統的寫入,都是發生在其分層文件系統的可寫層的,一旦容器運行結束,所有寫入都會被丟棄。因此需要對持久化支持。

Kubernetes 中通過 Volume 的方式提供對存儲的支持。下面對一些常見的存儲概念進行一點簡要的說明。

EmptyDir

顧名思義,EmptyDir是一個空目錄,他的生命周期和所屬的 Pod 是完全一致的,可能讀者會奇怪,那還要他做什么?EmptyDir的用處是,可以在同一 Pod 內的不同容器之間共享工作過程中產生的文件。

缺省情況下,EmptyDir 是使用主機磁盤進行存儲的,也可以設置emptyDir.medium 字段的值為Memory,來提高運行速度,但是這種設置,對該卷的占用會消耗容器的內存份額。

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  – image: gcr.io/google_containers/test-webserver
    name: test-container
    volumeMounts:
    – mountPath: /cache
      name: cache-volume
  volumes:
  – name: cache-volume
    emptyDir: {}
HostPath

這種會把宿主機上的指定卷加載到容器之中,當然,如果 Pod 發生跨主機的重建,其內容就難保證了。

這種卷一般和DaemonSet搭配使用,用來操作主機文件,例如進行日志采集的 FLK 中的 FluentD 就采用這種方式,加載主機的容器日志目錄,達到收集本主機所有日志的目的。

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  – image: gcr.io/google_containers/test-webserver
    name: test-container
    volumeMounts:
    – mountPath: /test-pd
      name: test-volume
  volumes:
  – name: test-volume
    hostPath:
      # directory location on host
      path: /data
NFS/GlusterFS/CephFS/AWS/GCE 等等

作為一個容器集群,支持網絡存儲自然是重中之重了,Kubernetes 支持為數眾多的云提供商和網絡存儲方案。

各種支持的方式不盡相同,例如 GlusterFS 需要創建 Endpoint,Ceph/NFS 之流就沒這么麻煩了。

各種個性配置可移步參考文檔。

ConfigMap 和 Secret

鏡像使用的過程中,經常需要利用配置文件、啟動腳本等方式來影響容器的運行方式,如果僅有少量配置,我們可以使用環境變量的方式來進行配置。然而對于一些較為復雜的配置,例如 Apache 之類,就很難用這種方式進行控制了。另外一些敏感信息暴露在 YAML 中也是不合適的。

ConfigMap 和 Secret 除了使用文件方式進行應用之外,還有其他的應用方式;這里僅就文件方式做一點說明。

例如下面的 ConfigMap,將一個存儲在 ConfigMap 中的配置目錄加載到卷中。

apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    – name: test-container
      image: gcr.io/google_containers/busybox
      command: [ "/bin/sh", "-c", "ls /etc/config/" ]
      volumeMounts:
      – name: config-volume
        mountPath: /etc/config
  volumes:
    – name: config-volume
      configMap:
        # Provide the name of the ConfigMap containing the files you want
        # to add to the container
        name: special-config
  restartPolicy: Never
注意,這里的 ConfigMap 會映射為一個目錄,ConfigMap 的 Key 就是文件名,每個 Value 就是文件內容,比如下面命令用一個目錄創建一個 ConfigMap:

kubectl create configmap \
    game-config \
    –from-file=docs/user-guide/configmap/kubectl
創建一個 Secret:

kubectl create secret generic \
    db-user-pass –from-file=./username.txt \
    –from-file=./password.txt
使用 Volume 加載 Secret:

apiVersion: v1
kind: Pod
metadata:
  name: mypod
  namespace: myns
spec:
  containers:
    – name: mypod
      image: redis
      volumeMounts:
        – name: foo
          mountPath: /etc/foo
          readOnly: true
  volumes:
    – name: foo
      secret:
        secretName: mysecret
可以看到 Secret 和 ConfigMap 的創建和使用是很相似的。在 RBAC 中,Secret 和 ConfigMap 可以進行分別賦權,以此限定操作人員的可見、可控權限。

PV & PVC

PersistentVolume 和 PersistentVolumeClaim 提供了對存儲支持的抽象,也提供了基礎設施和應用之間的分界,管理員創建一系列的 PV 提供存儲,然后為應用提供 PVC,應用程序僅需要加載一個 PVC,就可以進行訪問。

而 1.5 之后又提供了 PV 的動態供應。可以不經 PV 步驟直接創建 PVC。

原文出處:fleeto -> http://blog.fleeto.us/content/kubernetes-zhong-de-ji-chong-cun-chu

文章出自:CCIE那點事 http://www.qdxgqk.live/ 版權所有。本站文章除注明出處外,皆為作者原創文章,可自由引用,但請注明來源。 禁止全文轉載。
本文鏈接:http://www.qdxgqk.live/?p=4118轉載請注明轉自CCIE那點事
如果喜歡:點此訂閱本站
  • 相關文章
  • 為您推薦
  • 各種觀點
?
暫時還木有人評論,坐等沙發!
發表評論

您必須 [ 登錄 ] 才能發表留言!

?
?
萌宠夺宝游戏