來賓市住房和城鄉(xiāng)建設局網站網站運營師
【云原生Kubernetes】05-Pod的存儲卷(Volume)
文章目錄
- 【云原生Kubernetes】05-Pod的存儲卷(Volume)
- 簡介
- Volume類型解析
- emptyDir
- HostPath
- gcePersistentDisk
- NFS
- iscsi
- glusterfs
- ceph
- 其他volume
簡介
- Volume 是Pod 中能夠被多個容器訪問的共享目錄。 Kubernetes 中的Volume 概念、用 途和目的與 Docke 中的 Vo lume 比較類似,但二者不能等價, 首先 Kubernetes 中的Volume 被定義在 Pod上 ,被一個 Pod 里的多個容器掛載到具體的文件目錄 ;其次, Kubernete 中的 Volume與 Pod 的生命周期相同,但與容器的生命周期不相關, 當容器終止或者重啟,volume 中的數據也不會丟失;最后, Kubemetes 支持多種類型的 Volume ,例如 GlusterFS Ceph 等分布式文件系.
Volume類型解析
kubernetes提供了非常豐富的Volume類型供容器使用,例如emptyDir(臨時目錄);宿主機目錄(hostpath),共享存儲(NFS,glusterfs等),下面將對常見的類型進行說明:
emptyDir
emptyDir是在Pod分配到node時創(chuàng)建的,從它的名稱就可以看出,它的初始內容為空,并且必須指定宿主機上對應的目錄文件,因為這是Kubernetes自動分配的一個目錄,當Pod從Node上移除時,emptyDir中的數據也將被永久刪除。emptyDir的一些用途如下:
臨時空間,例如用于某些應用程序運行時所需的臨時目錄,且無需永久保留;
長時間任務執(zhí)行過程中使用的臨時目錄;
一個容器需要從另一個容器中獲取數據的目錄(多容器共享目錄)
在默認情況下,emptyDir使用的是節(jié)點存儲介質,例如磁盤或者網絡存儲,還可以使用emptyDir.medium屬性,把這個屬性設置為“Memory”,就可以使用更快的基于內存的后端存儲了。需要注意的是,這種情況下的emptyDir使用的內存會被計入容器的內存消耗,將受到資源限制和配額的管理。
示例
- 在pod中創(chuàng)建兩個容器:tomcat和busybox,在pod級別設置名為‘app-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的詳細信息
kubectl describe pods volume-pod
HostPath
- hostpath為在Pod上掛載宿主機的文件或目錄,通??梢杂糜谝韵聨讉€方面:
- 在容器應用程序生成的日志文件需要永久保存時,可以使用宿主機的高速文件系統(tǒng)對其存儲;
- 需要訪問宿主機上的Docker引擎內部數據結構的容器應用時,可以通過定義hostPath為宿主機/var/lib/docker目錄,使容器內部的應用可以直接訪問docker的文件系統(tǒng)。
- 在使用這種類型的Volume時,需要注意以下幾點:
- 在不同的Node上具有相同配置的Pod,可能會因為宿主機上的 目錄和文件不同而導致對Volume上目錄和文件的訪問結果不一致。
- 目錄和文件路徑不同:不同節(jié)點上的宿主機可能具有不同的目錄和文件路徑,這意味著在不同節(jié)點上運行的 Pod 訪問 HostPath 卷上的目錄和文件時,可能會得到不同的結果。例如,在一個節(jié)點上,HostPath 卷可能映射到
/mnt/data
目錄,而在另一個節(jié)點上,它可能映射到/data
目錄。- 目錄和文件權限不同:不同節(jié)點上的宿主機可能具有不同的文件權限,這意味著在不同節(jié)點上運行的 Pod 訪問 HostPath 卷上的目錄和文件時可能需要不同的權限。
- 如果使用了資源配額管理,則Kubernetes無法將hostPath在宿主 機上使用的資源納入管理。
示例
- 在pod中創(chuàng)建一個容器:tomcat,在pod級別設置名為‘app-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)提供的一種持久性磁盤存儲。它是一種網絡附加的塊存儲解決方案,為在Google Compute Engine上運行的虛擬機實例提供耐用且高性能的存儲。
gcePersistentDisk具有多種優(yōu)點,包括:
- 耐久性:存儲在gcePersistentDisk上的數據在多個物理磁盤和計算機上進行復制,確保高耐用性和可用性。
- 性能:gcePersistentDisk提供高性能存儲,具有實現高讀寫速度的能力。
- 可擴展性:gcePersistentDisk可以輕松調整大小,以滿足不斷變化的存儲需求,無需停機。
- 兼容性:gcePersistentDisk可以與在Google Compute Engine上運行的各種虛擬機實例一起使用,使其成為一種靈活的存儲解決方案。
使用gcePersistentDisk時有以下一些限制條件:
- Node(運行kubelet的節(jié)點)需要是GCE虛擬機。
- 這些虛擬機需要與PD存在于相同的GCE項目和Zone中。
示例
- Pod中有一個名為“my-container”的容器,它使用了一個名為“my-volume”的卷,將gcePersistentDisk掛載到了容器的“/mnt/data”目錄下。同時,在Pod的“volumes”字段中定義了一個名為“my-volume”的卷,并指定了使用名為“my-disk”的gcePersistentDisk,并將文件系統(tǒng)類型設置為“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é)議,用于在網絡上共享文件和目錄。它允許多個計算機共享相同的文件系統(tǒng),從而使多個計算機可以訪問相同的文件和數據。
示例
- Pod 中有一個名為“tomcat-container3”的容器,它使用了一個名為“ nfs-volume”的卷,將 NFS 掛載到了容器的“/nfs”目錄下。同時,在 Pod 的“volumes”字段中定義了一個名為“nfs-volume”的卷,并指定了使用 NFS,指定 NFS 服務器的地址為“192.168.194.134”,共享路徑為"/data"”
Kubernetes 節(jié)點上需要安裝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的存儲協(xié)議,用于在計算機網絡上共享塊存儲設備。它允許遠程計算機(即iSCSI客戶端)通過網絡連接訪問存儲設備(即iSCSI存儲設備),就像它們是直接連接在本地計算機上的一樣。
- 在Kubernetes中,可以將iSCSI存儲設備掛載到Pod中,以為Pod提供持久性的塊存儲。
示例
- me”的卷,將 iSCSI 存儲設備掛載到了容器的“/mnt/data”目錄下。同時,在 Pod 的“volumes”字段中定義了一個名為“my-volume”的卷,并指定了使用 iSCSI,指定 iSCSI 目標地址為“192.168.1.100:3260”,iSCSI 名稱為“iqn.2022-05.com.example:storage.target01”,邏輯單元號為“0”,文件系統(tǒng)類型為“ext4”,只讀模式為“false”。
需要在 Kubernetes 節(jié)點上安裝 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),用于在計算機網絡上共享文件和目錄。它是一種基于用戶空間的文件系統(tǒng),可以在多個服務器之間創(chuàng)建一個可擴展的、高可用性的存儲池,從而提供高性能、可靠的存儲解決方案。
GlusterFS可以通過將多個存儲節(jié)點組合成一個存儲池來擴展存儲容量。每個存儲節(jié)點都運行一個GlusterFS客戶端,用于將本地存儲設備映射到存儲池中。這樣,多個存儲節(jié)點就可以共享相同的文件系統(tǒng),并提供高可用性和容錯性。
s示例
- Pod 中有一個名為“my-container”的容器,它使用了一個名為“my-volume”的卷,將 GlusterFS 文件系統(tǒng)掛載到了容器的“/mnt/data”目錄下。同時,在 Pod 的“volumes”字段中定義了一個名為“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存儲集群的塊存儲協(xié)議,用于在計算機網絡上共享塊存儲設備。它允許遠程計算機(即RBD客戶端)通過網絡連接訪問存儲設備(即RBD存儲設備),就像它們是直接連接在本地計算機上的一樣。
RBD協(xié)議的工作原理是將塊設備映射到Ceph存儲集群中的對象存儲池,從而提供分布式、高可用性、高性能的塊存儲服務。RBD存儲設備可以動態(tài)調整大小,并且可以在多個客戶端之間共享。
示例
- Pod 中有一個名為“my-container”的容器,它使用了一個名為“my-volume”的卷,將 RBD 存儲設備掛載到了容器的“/mnt/data”目錄下。同時,在 Pod 的“volumes”字段中定義了一個名為“my-volume”的卷,并指定了使用 RBD,指定 Ceph 存儲集群的監(jiān)視器地址為“192.168.1.100:6789, 192.168.1.101:6789, 192.168.1.102:6789”,對象存儲池為“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管理存儲卷;
- gitRepo: 通過掛載一個空目錄,并從Git庫clone一個git repository以供Pod使用;
- **secret:**一個Secret Volume用于為Pod提供加密的信息,你可以 將定義在Kubernetes中的Secret直接掛載為文件讓Pod訪問。Secret Volume是通過TMFS(內存文件系統(tǒng))實現的,這種類型的Volume總是 不會被持久化的。
在上述中掛載外部存儲,如ceph,gluster,nfs,iscsi等,的時候雖然pod可以直接進行掛載,但是kubernetes更加推薦我們先需要創(chuàng)建一個 PersistentVolume,并將其綁定到 PersistentVolumeClaim 上。然后,在 Pod 中使用該 PersistentVolumeClaim 來掛載。后面我們將會單獨并且著重的介紹pv和pvc的功能和作用。
你可以 將定義在Kubernetes中的Secret直接掛載為文件讓Pod訪問。Secret Volume是通過TMFS(內存文件系統(tǒng))實現的,這種類型的Volume總是 不會被持久化的。