來賓市住房和城鄉(xiāng)建設(shè)局網(wǎng)站網(wǎng)站運(yùn)營(yíng)師
【云原生Kubernetes】05-Pod的存儲(chǔ)卷(Volume)
文章目錄
- 【云原生Kubernetes】05-Pod的存儲(chǔ)卷(Volume)
- 簡(jiǎn)介
- Volume類型解析
- emptyDir
- HostPath
- gcePersistentDisk
- NFS
- iscsi
- glusterfs
- ceph
- 其他volume
簡(jiǎn)介
- Volume 是Pod 中能夠被多個(gè)容器訪問的共享目錄。 Kubernetes 中的Volume 概念、用 途和目的與 Docke 中的 Vo lume 比較類似,但二者不能等價(jià), 首先 Kubernetes 中的Volume 被定義在 Pod上 ,被一個(gè) Pod 里的多個(gè)容器掛載到具體的文件目錄 ;其次, Kubernete 中的 Volume與 Pod 的生命周期相同,但與容器的生命周期不相關(guān), 當(dāng)容器終止或者重啟,volume 中的數(shù)據(jù)也不會(huì)丟失;最后, Kubemetes 支持多種類型的 Volume ,例如 GlusterFS Ceph 等分布式文件系.
Volume類型解析
kubernetes提供了非常豐富的Volume類型供容器使用,例如emptyDir(臨時(shí)目錄);宿主機(jī)目錄(hostpath),共享存儲(chǔ)(NFS,glusterfs等),下面將對(duì)常見的類型進(jìn)行說明:
emptyDir
emptyDir是在Pod分配到node時(shí)創(chuàng)建的,從它的名稱就可以看出,它的初始內(nèi)容為空,并且必須指定宿主機(jī)上對(duì)應(yīng)的目錄文件,因?yàn)檫@是Kubernetes自動(dòng)分配的一個(gè)目錄,當(dāng)Pod從Node上移除時(shí),emptyDir中的數(shù)據(jù)也將被永久刪除。emptyDir的一些用途如下:
臨時(shí)空間,例如用于某些應(yīng)用程序運(yùn)行時(shí)所需的臨時(shí)目錄,且無需永久保留;
長(zhǎng)時(shí)間任務(wù)執(zhí)行過程中使用的臨時(shí)目錄;
一個(gè)容器需要從另一個(gè)容器中獲取數(shù)據(jù)的目錄(多容器共享目錄)
在默認(rèn)情況下,emptyDir使用的是節(jié)點(diǎn)存儲(chǔ)介質(zhì),例如磁盤或者網(wǎng)絡(luò)存儲(chǔ),還可以使用emptyDir.medium屬性,把這個(gè)屬性設(shè)置為“Memory”,就可以使用更快的基于內(nèi)存的后端存儲(chǔ)了。需要注意的是,這種情況下的emptyDir使用的內(nèi)存會(huì)被計(jì)入容器的內(nèi)存消耗,將受到資源限制和配額的管理。
示例
- 在pod中創(chuàng)建兩個(gè)容器:tomcat和busybox,在pod級(jí)別設(shè)置名為‘a(chǎn)pp-logs’的volume,用于tomcat容器向其中寫日志文件,busybox容器從中讀取日志文件。
apiVersion: v1
kind: Pod
metadata:name: volume-podspec:containers:- name: tomcat-containerimage: tomcatports:- containerPort: 8080volumeMounts:- name: app-logsmountPath: /usr/loacl/tomcat/logs- name: busybox-containerimage: busyboxcommand: ["sh", "-c", "tail -f /logs/catalins*.log"]volumeMounts:- name: app-logsmountPath: /logsvolumes:- name: app-logsemptyDir: {}
- 查看pod的詳細(xì)信息
kubectl describe pods volume-pod
HostPath
- hostpath為在Pod上掛載宿主機(jī)的文件或目錄,通??梢杂糜谝韵聨讉€(gè)方面:
- 在容器應(yīng)用程序生成的日志文件需要永久保存時(shí),可以使用宿主機(jī)的高速文件系統(tǒng)對(duì)其存儲(chǔ);
- 需要訪問宿主機(jī)上的Docker引擎內(nèi)部數(shù)據(jù)結(jié)構(gòu)的容器應(yīng)用時(shí),可以通過定義hostPath為宿主機(jī)/var/lib/docker目錄,使容器內(nèi)部的應(yīng)用可以直接訪問docker的文件系統(tǒng)。
- 在使用這種類型的Volume時(shí),需要注意以下幾點(diǎn):
- 在不同的Node上具有相同配置的Pod,可能會(huì)因?yàn)樗拗鳈C(jī)上的 目錄和文件不同而導(dǎo)致對(duì)Volume上目錄和文件的訪問結(jié)果不一致。
- 目錄和文件路徑不同:不同節(jié)點(diǎn)上的宿主機(jī)可能具有不同的目錄和文件路徑,這意味著在不同節(jié)點(diǎn)上運(yùn)行的 Pod 訪問 HostPath 卷上的目錄和文件時(shí),可能會(huì)得到不同的結(jié)果。例如,在一個(gè)節(jié)點(diǎn)上,HostPath 卷可能映射到
/mnt/data
目錄,而在另一個(gè)節(jié)點(diǎn)上,它可能映射到/data
目錄。- 目錄和文件權(quán)限不同:不同節(jié)點(diǎn)上的宿主機(jī)可能具有不同的文件權(quán)限,這意味著在不同節(jié)點(diǎn)上運(yùn)行的 Pod 訪問 HostPath 卷上的目錄和文件時(shí)可能需要不同的權(quán)限。
- 如果使用了資源配額管理,則Kubernetes無法將hostPath在宿主 機(jī)上使用的資源納入管理。
示例
- 在pod中創(chuàng)建一個(gè)容器:tomcat,在pod級(jí)別設(shè)置名為‘a(chǎn)pp-logs1’的volume,將本地/var/log目錄掛載到pod的/data/log1下
apiVersion: v1
kind: Pod
metadata:name: volume-pod1spec:containers:- name: tomcat-container1image: tomcatports:- containerPort: 8080volumeMounts:- name: app-logs1mountPath: /data/log1volumes:- name: app-logs1hostPath:path: /var/logtype: Directory
gcePersistentDisk
gcePersistentDisk是Google Cloud Platform(GCP)提供的一種持久性磁盤存儲(chǔ)。它是一種網(wǎng)絡(luò)附加的塊存儲(chǔ)解決方案,為在Google Compute Engine上運(yùn)行的虛擬機(jī)實(shí)例提供耐用且高性能的存儲(chǔ)。
gcePersistentDisk具有多種優(yōu)點(diǎn),包括:
- 耐久性:存儲(chǔ)在gcePersistentDisk上的數(shù)據(jù)在多個(gè)物理磁盤和計(jì)算機(jī)上進(jìn)行復(fù)制,確保高耐用性和可用性。
- 性能:gcePersistentDisk提供高性能存儲(chǔ),具有實(shí)現(xiàn)高讀寫速度的能力。
- 可擴(kuò)展性:gcePersistentDisk可以輕松調(diào)整大小,以滿足不斷變化的存儲(chǔ)需求,無需停機(jī)。
- 兼容性:gcePersistentDisk可以與在Google Compute Engine上運(yùn)行的各種虛擬機(jī)實(shí)例一起使用,使其成為一種靈活的存儲(chǔ)解決方案。
使用gcePersistentDisk時(shí)有以下一些限制條件:
- Node(運(yùn)行kubelet的節(jié)點(diǎn))需要是GCE虛擬機(jī)。
- 這些虛擬機(jī)需要與PD存在于相同的GCE項(xiàng)目和Zone中。
示例
- Pod中有一個(gè)名為“my-container”的容器,它使用了一個(gè)名為“my-volume”的卷,將gcePersistentDisk掛載到了容器的“/mnt/data”目錄下。同時(shí),在Pod的“volumes”字段中定義了一個(gè)名為“my-volume”的卷,并指定了使用名為“my-disk”的gcePersistentDisk,并將文件系統(tǒng)類型設(shè)置為“ext4”
apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: my-containerimage: nginxvolumeMounts:- name: my-volumemountPath: /mnt/datavolumes:- name: my-volumegcePersistentDisk:pdName: my-diskfsType: ext4
NFS
- NFS(Network File System)是一種分布式文件系統(tǒng)協(xié)議,用于在網(wǎng)絡(luò)上共享文件和目錄。它允許多個(gè)計(jì)算機(jī)共享相同的文件系統(tǒng),從而使多個(gè)計(jì)算機(jī)可以訪問相同的文件和數(shù)據(jù)。
示例
- Pod 中有一個(gè)名為“tomcat-container3”的容器,它使用了一個(gè)名為“ nfs-volume”的卷,將 NFS 掛載到了容器的“/nfs”目錄下。同時(shí),在 Pod 的“volumes”字段中定義了一個(gè)名為“nfs-volume”的卷,并指定了使用 NFS,指定 NFS 服務(wù)器的地址為“192.168.194.134”,共享路徑為"/data"”
Kubernetes 節(jié)點(diǎn)上需要安裝nfs-util客戶端
apiVersion: v1
kind: Pod
metadata:name: nfs-podspec:containers:- name: tomcat-container3image: tomcatimagePullPolicy: IfNotPresentports:- name: tomcat-portcontainerPort: 8080volumeMounts:- name: nfs-volumemountPath: /nfsvolumes:- name: nfs-volumenfs:server: 192.168.194.134path: /data
iscsi
- iSCSI(Internet Small Computer System Interface)是一種基于TCP/IP的存儲(chǔ)協(xié)議,用于在計(jì)算機(jī)網(wǎng)絡(luò)上共享塊存儲(chǔ)設(shè)備。它允許遠(yuǎn)程計(jì)算機(jī)(即iSCSI客戶端)通過網(wǎng)絡(luò)連接訪問存儲(chǔ)設(shè)備(即iSCSI存儲(chǔ)設(shè)備),就像它們是直接連接在本地計(jì)算機(jī)上的一樣。
- 在Kubernetes中,可以將iSCSI存儲(chǔ)設(shè)備掛載到Pod中,以為Pod提供持久性的塊存儲(chǔ)。
示例
- me”的卷,將 iSCSI 存儲(chǔ)設(shè)備掛載到了容器的“/mnt/data”目錄下。同時(shí),在 Pod 的“volumes”字段中定義了一個(gè)名為“my-volume”的卷,并指定了使用 iSCSI,指定 iSCSI 目標(biāo)地址為“192.168.1.100:3260”,iSCSI 名稱為“iqn.2022-05.com.example:storage.target01”,邏輯單元號(hào)為“0”,文件系統(tǒng)類型為“ext4”,只讀模式為“false”。
需要在 Kubernetes 節(jié)點(diǎn)上安裝 iSCSI 客戶端軟件
apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: my-containerimage: nginxvolumeMounts:- name: my-volumemountPath: /mnt/datavolumes:- name: my-volumeiscsi:targetPortal: 192.168.1.100:3260iqn: iqn.2022-05.com.example:storage.target01lun: 0fsType: ext4readOnly: false
glusterfs
GlusterFS是一種開源的分布式文件系統(tǒng),用于在計(jì)算機(jī)網(wǎng)絡(luò)上共享文件和目錄。它是一種基于用戶空間的文件系統(tǒng),可以在多個(gè)服務(wù)器之間創(chuàng)建一個(gè)可擴(kuò)展的、高可用性的存儲(chǔ)池,從而提供高性能、可靠的存儲(chǔ)解決方案。
GlusterFS可以通過將多個(gè)存儲(chǔ)節(jié)點(diǎn)組合成一個(gè)存儲(chǔ)池來擴(kuò)展存儲(chǔ)容量。每個(gè)存儲(chǔ)節(jié)點(diǎn)都運(yùn)行一個(gè)GlusterFS客戶端,用于將本地存儲(chǔ)設(shè)備映射到存儲(chǔ)池中。這樣,多個(gè)存儲(chǔ)節(jié)點(diǎn)就可以共享相同的文件系統(tǒng),并提供高可用性和容錯(cuò)性。
s示例
- Pod 中有一個(gè)名為“my-container”的容器,它使用了一個(gè)名為“my-volume”的卷,將 GlusterFS 文件系統(tǒng)掛載到了容器的“/mnt/data”目錄下。同時(shí),在 Pod 的“volumes”字段中定義了一個(gè)名為“my-volume”的卷,并指定了使用 GlusterFS,指定 GlusterFS 集群的地址為“glusterfs-cluster”,共享路徑為“my-volume”,只讀模式為“false”。
apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: my-containerimage: nginxvolumeMounts:- name: my-volumemountPath: /mnt/datavolumes:- name: my-volumeglusterfs:endpoints: glusterfs-clusterpath: my-volumereadOnly: false
ceph
RBD(RADOS Block Device)是一種基于Ceph存儲(chǔ)集群的塊存儲(chǔ)協(xié)議,用于在計(jì)算機(jī)網(wǎng)絡(luò)上共享塊存儲(chǔ)設(shè)備。它允許遠(yuǎn)程計(jì)算機(jī)(即RBD客戶端)通過網(wǎng)絡(luò)連接訪問存儲(chǔ)設(shè)備(即RBD存儲(chǔ)設(shè)備),就像它們是直接連接在本地計(jì)算機(jī)上的一樣。
RBD協(xié)議的工作原理是將塊設(shè)備映射到Ceph存儲(chǔ)集群中的對(duì)象存儲(chǔ)池,從而提供分布式、高可用性、高性能的塊存儲(chǔ)服務(wù)。RBD存儲(chǔ)設(shè)備可以動(dòng)態(tài)調(diào)整大小,并且可以在多個(gè)客戶端之間共享。
示例
- Pod 中有一個(gè)名為“my-container”的容器,它使用了一個(gè)名為“my-volume”的卷,將 RBD 存儲(chǔ)設(shè)備掛載到了容器的“/mnt/data”目錄下。同時(shí),在 Pod 的“volumes”字段中定義了一個(gè)名為“my-volume”的卷,并指定了使用 RBD,指定 Ceph 存儲(chǔ)集群的監(jiān)視器地址為“192.168.1.100:6789, 192.168.1.101:6789, 192.168.1.102:6789”,對(duì)象存儲(chǔ)池為“rbd-pool”,鏡像名稱為“my-image”,用戶名為“admin”,密鑰文件為“/etc/ceph/keyring”,文件系統(tǒng)類型為“xfs”,只讀模式為“false”。
apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: my-containerimage: nginxvolumeMounts:- name: my-volumemountPath: /mnt/datavolumes:- name: my-volumerbd:monitors: [192.168.1.100:6789, 192.168.1.101:6789, 192.168.1.102:6789]pool: rbd-poolimage: my-imageuser: adminkeyring: /etc/ceph/keyringfsType: xfsreadOnly: false
其他volume
- **flocker:**使用Flocker管理存儲(chǔ)卷;
- gitRepo: 通過掛載一個(gè)空目錄,并從Git庫clone一個(gè)git repository以供Pod使用;
- **secret:**一個(gè)Secret Volume用于為Pod提供加密的信息,你可以 將定義在Kubernetes中的Secret直接掛載為文件讓Pod訪問。Secret Volume是通過TMFS(內(nèi)存文件系統(tǒng))實(shí)現(xiàn)的,這種類型的Volume總是 不會(huì)被持久化的。
在上述中掛載外部存儲(chǔ),如ceph,gluster,nfs,iscsi等,的時(shí)候雖然pod可以直接進(jìn)行掛載,但是kubernetes更加推薦我們先需要?jiǎng)?chuàng)建一個(gè) PersistentVolume,并將其綁定到 PersistentVolumeClaim 上。然后,在 Pod 中使用該 PersistentVolumeClaim 來掛載。后面我們將會(huì)單獨(dú)并且著重的介紹pv和pvc的功能和作用。
你可以 將定義在Kubernetes中的Secret直接掛載為文件讓Pod訪問。Secret Volume是通過TMFS(內(nèi)存文件系統(tǒng))實(shí)現(xiàn)的,這種類型的Volume總是 不會(huì)被持久化的。