kubernetes 存儲(chǔ)卷

在同一個(gè)Pod中的多個(gè)容器能夠共享Pod級(jí)別的存儲(chǔ)卷Volume。Volume可以被定義為各種類(lèi)型,多個(gè)容器各自進(jìn)行掛載操作,將一個(gè)volume 掛載為容器內(nèi)部需要的目錄。

kubernetes 管理的宿主機(jī)本地存儲(chǔ)類(lèi)型:

  • EmptyDir:臨時(shí)存儲(chǔ)
  • HostPath:宿主機(jī)目錄

持久化存儲(chǔ)(PV)和網(wǎng)絡(luò)共享存儲(chǔ)類(lèi)型:

  • CephFS:一種開(kāi)源共享存儲(chǔ)系統(tǒng)
  • Cinder:一種開(kāi)源共享存儲(chǔ)系統(tǒng)
  • CSI:容器存儲(chǔ)接口
  • FC(Fibre Channel):光纖存儲(chǔ)設(shè)備
  • Flocker:一種開(kāi)源共享存儲(chǔ)系統(tǒng)
  • Glusterfs:一種開(kāi)源共享存儲(chǔ)系統(tǒng)
  • iSCSI:iSCSI存儲(chǔ)設(shè)備
  • Local:本地持久化存儲(chǔ)
  • NFS:網(wǎng)絡(luò)文件系統(tǒng)
  • PersistentVolumeChaim:簡(jiǎn)稱PVC,持久化存儲(chǔ)的申請(qǐng)空間
  • Portworx Volumes:Portworx 提供的存儲(chǔ)服務(wù)
  • Quobyte Volumes:Quobyte 提供的存儲(chǔ)服務(wù)
  • RBD(Ceph Block Device):Ceph 塊存儲(chǔ)

Node 本地存儲(chǔ)卷

kubernetes 管理的 Node 本地存儲(chǔ)卷(Volume)的類(lèi)型:

  • EmptyDir:與 Pod 同生命周期的Node 臨時(shí)存儲(chǔ)
  • HostPath: Node 目錄
  • Local:基于持久卷(PV)管理的 Node 目錄

emptyDir

當(dāng) Pod 分派到某個(gè) Node 上時(shí),emptyDir 卷會(huì)被創(chuàng)建,并且在 Pod 在該節(jié)點(diǎn)上運(yùn)行期間,卷一直存在。 就像其名稱表示的那樣,卷最初是空的。 盡管 Pod 中的容器掛載 emptyDir 卷的路徑可能相同也可能不同,這些容器都可以讀寫(xiě) emptyDir 卷中相同的文件。 當(dāng) Pod 因?yàn)槟承┰虮粡墓?jié)點(diǎn)上刪除時(shí),emptyDir 卷中的數(shù)據(jù)也會(huì)被永久刪除。

下面是使用 EmptyDir 類(lèi)型的存儲(chǔ)卷的 Pod 的YAML 配置示例,該類(lèi)型的存儲(chǔ)卷的參數(shù)只有一對(duì)花括號(hào)"{}"

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

hostPath

hostPath 類(lèi)型的存儲(chǔ)卷將主機(jī)節(jié)點(diǎn)文件系統(tǒng)上的文件或目錄掛載到容器中。

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
  - image: busybox
    name: test-container
    volumeMounts:
    - mountPath: /host-data
      name: test-volume
  volumes:
  - name: test-volume
    hostPath:
      path: /data  # 宿主上目錄位置
      type: Directory # 此字段為可選, Directory 表示該目錄必須存在

HostPath 的 type 配置參數(shù):

  • 空:系統(tǒng)默認(rèn)值。為向后兼容的設(shè)置,意為系統(tǒng)在掛載 path 時(shí)不做任何校驗(yàn)
  • DirectoryOrCreate:path 指定的路徑必須是目錄,如果不存在,則系統(tǒng)將自動(dòng)創(chuàng)建該目錄,將權(quán)限設(shè)置為 0755,與kubelet具有相同的 owner 和 group
  • Directory:path 指定的目錄必須存在,否則掛載失敗
  • FileOrCreate:path 指定的路徑必須是文件,如果不存在,則系統(tǒng)將自動(dòng)創(chuàng)建該文件,將權(quán)限設(shè)置為 0644,與kubelet 具有相同的 owner 和group
  • File:path 指定的文件必須存在,否則掛載失敗
  • Socket:path 指定的 UNIX socket 必須存在,否則掛載失敗
  • CharDevice:path 指定的字符設(shè)備(character device)必須存在,否則掛載失敗
  • BlockDevice:path 指定的塊設(shè)備(block device)必須存在,否則掛載失敗

持久卷

為了能夠屏蔽底層存儲(chǔ)實(shí)現(xiàn)的細(xì)節(jié),讓用戶方便使用及管理員方便管理,Kubernetes 從1.0版本就引入了 Persistent Volume (PV) 和 Persistent Volume Claim(PVC) 兩個(gè)資源對(duì)象來(lái)實(shí)現(xiàn)存儲(chǔ)管理子系統(tǒng)。

PV 描述的,是持久化存儲(chǔ)數(shù)據(jù)卷。

PVC 則是用戶對(duì)存儲(chǔ)資源的一個(gè)申請(qǐng)。

NFS

centos 8 安裝

$ yum install nfs-utls -y
$ cat /etc/exports # 配置 exports
/data/nfs/192.168.0.0/24(rw,sync,no_subtree_check,no_root_squash)
$ systemctl start nfs-server

PV、PVC

定義一個(gè)NFS 類(lèi)型的PV,如下:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  storageClassName: manual
  nfs:
    path: /
    server: 172.17.0.2

定義聲明一個(gè)1GIB 大小的PVC,如下:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs
spec:
  resources:
    requests:
      storage: 1Gi
  storageClassName: manual
  accessModes:
    - ReadWriteMany

用戶創(chuàng)建的 PVC 必須和符合條件的 PV進(jìn)行綁定,檢查條件包括兩部分:

  • PV 和 PVC 的 spec 字段,比如 PV 的存儲(chǔ)(storage)大小,必須滿足 PVC 的要求。
  • PV 和 PVC 的 storageClassName 字段必須一致。

PVC 和 PV 綁定之后,Pod 就可以使用這個(gè) PVC了,YAML 如下:

apiVersion: v1
kind: Pod
metadata:
  name: web
  labels:
    role: web-frontend
spec:
  containers:
    - name: web
      image: nginx
      resources:
        limits:
          memory: "128Mi"
          cpu: "500m"
      ports:
        - containerPort: 80
      volumeMounts:
        - name: nfs
          mountPath: "/usr/share/nginx/html"
  volumes:
    - name: nfs
      persistentVolumeClaim:
        claimName: nfs

pod 在volumes 字段聲明使用 PVC 名字,等 Pod 創(chuàng)建之后,kubelet 就會(huì)把 PVC 所對(duì)應(yīng)的 PV 的 Volume,掛載到 Pod 容器的目錄上。

StorageClass

PV 的創(chuàng)建,是由運(yùn)維人員完成的。在大規(guī)模的生產(chǎn)環(huán)境里,這是一個(gè)非常麻煩的工作。

這是因?yàn)椋粋€(gè)大規(guī)則的 Kubernetes 集群里很可能有成千上萬(wàn)個(gè) PVC,這就意味著運(yùn)維人員必須事先創(chuàng)建出成千上萬(wàn)個(gè)PV。更麻煩的是,隨著新的 PVC 不斷被提交,運(yùn)維人員不得不繼續(xù)添加新的、能滿足條件的PV,否則新的 Pod 就會(huì)因?yàn)?PVC 綁定不到 PV而失敗。在實(shí)際操作中,這幾乎沒(méi)辦法靠人工做到。

所以,Kubernetes 為我們提供了一套可以自動(dòng)創(chuàng)建 PV 的機(jī)制,即 Dynamic Provisioning。

相比之下,前面人工管理的 PV 的方式就叫做 Staic Provisioning。

Dynamic Provisioning 機(jī)制工作的核心,在于一個(gè)名叫 StorageClass 的 API 對(duì)象。

StorageClass 對(duì)象會(huì)定義兩部分內(nèi)容:

  • PV的屬性,比如,存儲(chǔ)類(lèi)型、Volume 的大小等。
  • 創(chuàng)建 PV 需要用到的存儲(chǔ)插件。比如,Ceph 等

有了這兩個(gè)信息后,Kubernetes 就能夠根據(jù)用戶提交的 PVC,找到一個(gè)對(duì)應(yīng)的 StorageClass 了。然后,Kubernetes 就會(huì)調(diào)用 StorageClass 聲明的存儲(chǔ)插件,創(chuàng)建出需要的 PV。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: block-service
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-ssd

provisioner:描述存儲(chǔ)資源的提供者,用于提供具體的 PV 資源。provisioner的值為:kubernetes.io/gce-pd,表示Kubernetes 內(nèi)置的 GCE PD 存儲(chǔ)插件的名字。

parameters 字段就是 PV 的參數(shù)。type=pd-ssd,指的是這個(gè) PV 的類(lèi)型是SSD 格式的 GCE 遠(yuǎn)程磁盤(pán)。

目前 StorageClass 資源對(duì)象支持設(shè)置的存儲(chǔ)參數(shù)最多為 512 個(gè),全部 key 和 value 所占的空間不能超過(guò) 256KB。

如果你使用部署在本地的 Kubernetes 集群以及 Rook 存儲(chǔ)服務(wù)的話,YAML 如下:

apiVersion: ceph.rook.io/v1
kind: Pool
metadata:
  name: replicapool
  namespace: rook-ceph
spec:
  replicated:
    size: 3
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: block-service
provisioner: ceph.rook.io/block
parameters:
  pool: replicapool
  clusterNamespace: rook-ceph

創(chuàng)建 StorageClass

$ kubectl apply -f sv.yaml

PVC 指定使用 StorageClass 名字即可,YAML 如下:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc
spec:
  resources:
    requests:
      storage: 1Gi
  storageClassName: block-service
  accessModes:
    - ReadWriteOnce

有了 Dynamic Provisioning 機(jī)制,運(yùn)維人員只需要在 Kubernetes 集群里創(chuàng)建出數(shù)量有限的 StorageClass 對(duì)象就可以了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,797評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,179評(píng)論 3 414
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 175,628評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 62,642評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,444評(píng)論 6 405
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 54,948評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,040評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,185評(píng)論 0 287
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,717評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,602評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,794評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,045評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,418評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,671評(píng)論 1 281
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,414評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,750評(píng)論 2 370

推薦閱讀更多精彩內(nèi)容