溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Kubernetes中,兩種常見類型的Volume深度實(shí)踐

發(fā)布時(shí)間:2020-06-07 20:45:31 來(lái)源:網(wǎng)絡(luò) 閱讀:1162 作者:耕耘實(shí)錄 欄目:云計(jì)算

一.背景

存儲(chǔ)資源在所有計(jì)算資源中扮演著十分重要的角色,大部分業(yè)務(wù)場(chǎng)景下都有可能使用到各類存儲(chǔ)資源。在Kubernetes中,系統(tǒng)通過Volume對(duì)集群中的容器動(dòng)態(tài)或靜態(tài)提供存儲(chǔ)資源。通常情況下,我們可以認(rèn)為容器或者Pod的生命周期時(shí)短暫的,當(dāng)容器被銷毀時(shí),容器內(nèi)部的數(shù)據(jù)也同時(shí)被清除。為了持久化保存容器的數(shù)據(jù),Kubernetes引入了Volume,類似于Docker的Volume(Docker also has a concept of volumes, though it is somewhat looser and less managed. In Docker, a volume is simply a directory on disk or in another Container. Lifetimes are not managed and until very recently there were only local-disk-backed volumes. Docker now provides volume drivers, but the functionality is very limited for now)。這個(gè)Volume被某個(gè)Pod掛載之后,這個(gè)Pod里面的所有容器都能使用這個(gè)Volume。Kubernetes目前支持的volume類型可以參考文末官方資料。

二.兩種Volume使用舉例

2.1 emptyDir

emptyDir: emptyDir是最基礎(chǔ)的Volume類型。每個(gè)emptyDir Volume是主機(jī)上的一個(gè)空目錄,可以被Pod中所有的容器共享。它對(duì)于容器來(lái)說(shuō)是持久的,對(duì)于Pod則不是。刪除容器并不會(huì)對(duì)它造成影響,只有刪除整個(gè)Pod時(shí),它才會(huì)被刪除,它的生命周期與所掛載的Pod一致。簡(jiǎn)而言之,emptyDir類型的Volume在Pod分配到Node上時(shí)被創(chuàng)建,Kubernetes會(huì)在Node主機(jī)上自動(dòng)分配一個(gè)目錄,因此無(wú)需指定Node主機(jī)上對(duì)應(yīng)的目錄文件。 這個(gè)目錄的初始內(nèi)容為空,當(dāng)Pod從Node上移除時(shí),emptyDir中的數(shù)據(jù)會(huì)被永久刪除。emptyDir主要用于一些無(wú)需永久保留的數(shù)據(jù),例如臨時(shí)目錄,多容器共享目錄等。我們通過實(shí)際案例來(lái)理解一下,Pod gysl的yaml如下:

apiVersion: v1
kind: Pod
metadata:
  name: gysl
spec:
  containers:
  - image: busybox
    name: gysl-01
    volumeMounts:
    - mountPath: /gysl-01
      name: gysl-volume
    args:
    - /bin/sh
    - -c
    - echo "This is a test file.">/gysl-01/test.gysl;sleep 20000

  - image: busybox
    name: gysl-02
    volumeMounts:
    - mountPath: /gysl-02
      name: gysl-volume
    args:
    - /bin/sh
    - -c
    - cat /gysl-02/test.gysl;sleep 20000

  volumes:
  - name: gysl-volume
    emptyDir: {}

創(chuàng)建Pod gysl,并查看相關(guān)信息:

[root@k8s-m k8s-volumes]# kubectl apply -f emptyDir.yaml
pod/gysl created
[root@k8s-m k8s-volumes]# kubectl get pod
NAME   READY   STATUS    RESTARTS   AGE
gysl   2/2     Running   0          10m
[root@k8s-m k8s-volumes]# kubectl logs gysl gysl-02
This is a test file.

該例中,我們創(chuàng)建了一個(gè)名為gysl的Pod,這個(gè)pod里面包含gysl-01和gysl-02兩個(gè)容器,這兩個(gè)容器同時(shí)掛載了名為gysl-volume的emptyDir,gysl-01的掛載點(diǎn)為/gysl-01,gysl-02的掛載點(diǎn)為gysl-02,容器gysl-01創(chuàng)建了一個(gè)test.gysl的文件,內(nèi)容為:“This is a test file.”在容器gysl-02中,成功顯示了gysl-01創(chuàng)建的文件的內(nèi)容。

2.2 hostPath

hostPath: hostPath的主要作用是將主機(jī)的文件或目錄掛載給Pod的容器使用,使得容器能以較為良好的性能來(lái)存儲(chǔ)數(shù)據(jù)。接下來(lái)我們以Pod gysl-hostpath為例來(lái)理解一下hostPath的相關(guān)概念,YAML文件如下:

apiVersion: v1
kind: Pod
metadata:
  name: gysl-hostpath
spec:
  nodeSelector: 
    role: test
  containers:
  - image: ubuntu:18.04
    name: gysl-hostpath-container
    volumeMounts:
    - mountPath: /etc/gysl-test-01
      name: gysl-02
    - mountPath: /etc/gysl-test-02
      name: gysl-01
    - mountPath: /gysl-test-dir
      name: gysl-dir
    args:
    - /bin/bash
    - -c 
    - cat /etc/gysl-test-01 /etc/gysl-test-02;ls -l /gysl-test-dir;sleep 3600
  volumes:
  - hostPath: 
      path: /root/gysl-01
    name: gysl-01
  - hostPath:
      path: /root/gysl-02
    name: gysl-02
  - hostPath:
      path: /root/gysl-dir
    name: gysl-dir

在Node k8s-n1的/root目錄下創(chuàng)建如下文件和目錄:

[root@k8s-n1 ~]# ll
總用量 8
-rw-r--r-- 1 root root 16 11月 21 20:31 gysl-01
-rw-r--r-- 1 root root 16 11月 21 20:31 gysl-02
drwxr-xr-x 2 root root 51 11月 21 20:32 gysl-dir

兩個(gè)文件的內(nèi)容如下:

[root@k8s-n1 ~]# cat gysl-01
This is gysl-01
[root@k8s-n1 ~]# cat gysl-02
This is gysl-02

目錄gysl-dir的內(nèi)容如下:

[root@k8s-n1 ~]# ll gysl-dir/
總用量 12
-rw-r--r-- 1 root root 16 11月 21 20:32 gysl-01
-rw-r--r-- 1 root root 16 11月 21 20:32 gysl-02
-rw-r--r-- 1 root root 16 11月 21 20:32 gysl-03

給Node k8s-n1指定一個(gè)標(biāo)簽,apply 該P(yáng)od:

[root@k8s-m k8s-Volumes]# kubectl label node k8s-n1 role=test
node/k8s-n1 labeled
[root@k8s-m k8s-Volumes]# kubectl apply -f hostPath.yaml
pod/gysl-hostpath created
[root@k8s-m k8s-Volumes]# kubectl get pod -o wide
NAME            READY   STATUS    RESTARTS   AGE   IP             NODE     NOMINATED NODE
gysl-hostpath   1/1     Running   0          17s   10.244.1.177   k8s-n1   <none>
[root@k8s-m k8s-Volumes]# kubectl logs gysl-hostpath
This is gysl-02
This is gysl-01
total 12
-rw-r--r-- 1 root root 16 Nov 21 12:32 gysl-01
-rw-r--r-- 1 root root 16 Nov 21 12:32 gysl-02
-rw-r--r-- 1 root root 16 Nov 21 12:32 gysl-03

這個(gè)例子中,我把名為gysl-02的hostPath文件掛載到了容器的文件/etc/gysl-test-01上,把名為gysl-01的hostPath文件掛載到了容器的文件/etc/gysl-test-02上,把名為gysl-dir的hostPath目錄掛載到了/gysl-test-dir下。通過logs命令,我們不難發(fā)現(xiàn),目標(biāo)已經(jīng)達(dá)成。

這種掛載方式比emptyDir更為持久,除非所在Node發(fā)生故障。不過,除了掛載一些配置文件/二進(jìn)制文件之外,一般不采用該類掛載方式,因?yàn)檫@樣的掛載操作增加了Pod文件與Node主機(jī)文件的耦合,不利于統(tǒng)一管理。

三.總結(jié)

3.1 在volume的配置過程中,涉及到具體掛載路徑的需要按照一定的規(guī)則來(lái)配置。例如:文件或目錄需要寫絕對(duì)路徑。不按照規(guī)則來(lái)配置,會(huì)出現(xiàn)以下報(bào)錯(cuò):

Warning  Failed     8s (x3 over 20s)  kubelet, k8s-n1    Error: Error response from daemon: create ~/gysl: "~/gysl-dir" includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed. If you intended to pass a host directory, use absolute path

3.2 emptyDir和hostPath都是比較常見的兩種類型的volume,在使用時(shí)需要根據(jù)具體情況進(jìn)行配置。其他類型的volume可參考以上兩種類型及官方文檔進(jìn)行配置,相關(guān)官方文檔會(huì)在文末給出。

四.相關(guān)資料

5.1 Volumes基本概念

5.2 Kubernetes支持的Volume類型

5.3 文章涉及到的YAML文件

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI