Volume概述
-
Volume 是 Pod 中能夠被多個容器訪問的共享目錄
-
Kubernetes 的 Volume 定義在 Pod 上,它被一個 Pod 中的多個容器掛載到具體的文件目錄下。
-
Volume 與 Pod 的生命周期相同,但與容器的生命周期不相關, 當容器終止或重啟時, Volume 中的數據也不會丟失
-
Kubernetes 支持多種類型的 Volume
-
常用的如:EmptyDir
-
常用的如:HostPath
-
常用的如:nfs
-
EmptyDir 類型的Volume
emptyDir 是最基礎的 Volume 類型。正如其名字所示,一個 emptyDir Volume 是 Host 上的一個空目錄。
EmptyDir 類型的 volume創建於pod被調度到某個宿主機上的時候,
而同一個 pod 內的容器都能讀寫 EmptyDir 中的同一個文件。
如果 Pod 不存在了,emptyDir 也就沒有了
所以目前 EmptyDir 類型的 volume 主要用作臨時空間,
比如 Web 服務器寫日志或者 tmp 文件需要的臨時目錄
-
如下所示
通過上面的資源編排文件我們就可以很好的理解EmptyDir的Volume是怎么使用的了
首先我們觀察整個配置文件,我們定義了兩個pod和一個emptyDir的Volume數據卷軸
第一個pod通過volumeMounts掛載了一個名為shared-volumn的數據卷軸
將其掛載在/prodecer_dir目錄下
然后在其下創建hello文件,並寫入數據 "hello world"
第二個pod通過volumeMounts掛載了一個名為shared-volumn的數據卷軸
將其掛載在/consumer_dir目錄下
然后在其查看hello文件,得到"hello world"數據
兩個容器通過emptyDir類型的Volume實現數據共享
hostPath類型的Volume
HostPath 屬性的 volume 使得對應的容器能夠訪問當前宿主機上的指定目錄
一旦這個 pod 離開了這個宿主機, HostDir 中的數據雖然不會被永久刪除, 但數據也不會隨 pod 遷移到其他宿主機上
實際上增加了 Pod 與節點的耦合
應用場景:
pod內容器想與宿主機做數據同步,做目錄掛載時
需要訪問宿主機上Docker引擎內部數據結構的容器應用時
-
如下所示
我們通過pod創建了Nginx的服務
但是我們都知道Nginx做靜態資源的代理是,在不修改配置文件的情況下,所有資源文件都在html目錄下
這個時候我們通過hostPath類型的數據卷軸掛載,
就可以實現在宿主機動態變更Nginx的html目錄下的的所有靜態資源
比如我在宿主機的mydata目錄下放了一張test.jpg的圖片
此時你就可以通過該Nginx服務直接訪問該圖片
NFS類型的Volume
NFS即網絡文件系統,其允許一個系統在網絡上與它人共享目錄和文件
NFS相信大家都知道是什么玩意了,比如win10自帶功能,局域網通過NFS實現文件共享
k8s集群當中掛在nfs文件系統道理也是相通
選一台k8s集群外的同局域網的服務器 ,可相互ping通即可,下載nfs-utils
yum install nfs-utils
集群內所有的node節點全部下載:nfs-utils
yum install nfs-utils
文件系統服務器設置NFS的掛載路徑以及權限等
vim /etc/exports
/mydata *(rw,no_root_squash)
/mydata :對外開放的目錄
*:代表所有局域網機器,可設置可訪問的機器ip
rw: 可讀可寫
no_root-squash:root登陸即有用root權限
root_squash:root登陸,只能是匿名使用者,權限沒有roota高,安全一點
文件系統啟動NFS
systemctl start nfs
-
k8s集群部署應用使用nfs網絡存儲
首先我們通過文件系統服務器設置NFS的掛載路徑以及權限等
暴露了/mydata目錄,所有人允許訪問
然后我們k8s所有節點安裝了nfs服務
最后我們配置資源編排文件,使用NFS類型的數據卷進行網絡共享
資源編排文件指定了主機
資源編排文件指定共享目錄
和nginx的html目錄進行掛載,實現數據共享
這樣我們在192.168.217.150機器上的/mydata目錄下丟入圖片,nginx服務可以對外進行暴露
PV和PVC
PV的定義
PV即PersistentVolume ,是集群中由管理員配置的一段網絡存儲
PV生命周期獨立於使用PV的任何單個pod,不和pod有生命周期牽扯,獨立存活
大白話說PV就是存儲,獨立存在,和pod的生命周期無關
PVC的定義
PVC即PersistentVolumeClaim ,是由用戶進行存儲的請求
大白話說PVC就是調用PV,訪問儲存,當然這其中也有很多細節
-
我們還是首先選擇上面的NFS作為一個基礎環境
NFS服務器:192.168.217.150
共享文件夾 /mydata
坑: 注意這個分享目錄的大小寫問題,我踩了這個坑
資源定義
這里我們定義了一個PV,基於NFS
服務器IP為192.168.217.150
共享文件目錄為 /mydata
PVC :通過配置信息相同直接會綁定PV
容量信息:5G (嘗試與my-pv匹配:成功)
匹配模式:讀寫更多 (嘗試與my-pv匹配:成功)
部署PV、PVC、Deployment
-
直接部署:先部署pv,再部署pvc
-
kubectl apply -f pv.yaml
-
kubectl apply -f pvc.yaml
-
-
查看一下線相關的信息
操作NFS服務器
-
我們直接在192.168.217.150NFS服務器的 /mydata目錄下創建一個index.html
-
然后寫入 Hello PV/PVC
-
查看pod內部數據變化
-
隨便選一個pod,我們進入其內,查看掛載目錄下的文件
-
我們在pvc配置文件中掛載的目錄是:/usr/share/nginx/html
-
.