網站首頁 編程語言 正文
卷(volumes):
容器中的文件存在時間是短暫的,當一個容器發生崩潰時,文件會丟失,而容器重新啟動后狀態卻是干凈的;而第二個問題時解決了一個Pod中不同容器間共享文件。
卷的類型有很多,詳細請查看官方文檔:卷
1.emptyDir
1.1.emptyDir卷特性:
當Pod被創建時,emptyDir卷也隨之創建,在Pod運行期間,此卷會一直存在。
用于Pod中不同容器間的數據共享。
當 Pod 從節點上刪除時,emptyDir 卷中的數據也會被永久刪除并不會保存。
emptyDir 卷存儲在該節點所使用的介質可以是磁盤或 SSD 或網絡存儲也可以是內存;
注意介質為內存的話會記入容器消耗。
1.2.官方示例:
配置項只有最后三行,相對比較簡單。
apiVersion: v1 kind: Pod metadata: name: test-pd spec: containers: - image: k8s.gcr.io/test-webserver name: test-container volumeMounts: - mountPath: /cache name: cache-volume volumes: - name: cache-volume emptyDir: {}
1.3.我們做一個實例:
第一步:我們創建一個準備用的deploy類型的yaml文件,上面通用部分沒貼,主要看我們要用的這部分,創建兩個nginx容器,將emptyDir的卷分別掛在兩個容器下。
apiVersion: v1 kind: Pod metadata: name: test-pd spec: containers: - image: k8s.gcr.io/test-webserver name: test-container volumeMounts: - mountPath: /cache name: cache-volume volumes: - name: cache-volume emptyDir: {}
第二步:執行yaml文件創建deploy資源
[root@k8s-master01 ~]# kubectl create -f dp-nginx.yaml deployment.apps/dp-cm created [root@k8s-master01 ~]# kubectl get deployments.apps NAME READY UP-TO-DATE AVAILABLE AGE dp-nginx 1/1 1 1 17m [root@k8s-master01 ~]# kubectl get pod NAME READY STATUS RESTARTS AGE dp-nginx-98db5f6df-6g24r 2/2 Running 0 2m40s
第三步:在nginx容器的/opt目錄下創建一個文件,然后再redis容器內成都/tmp目錄下查看,看是否共享
# 在nginx容器內創建文件 [root@k8s-master01 ~]# kubectl exec -ti dp-nginx-98db5f6df-6g24r -c nginx -- bash root@dp-nginx-98db5f6df-6g24r:/# cd /opt/ root@dp-nginx-98db5f6df-6g24r:/opt# touch haha.txt root@dp-nginx-98db5f6df-6g24r:/opt# ls haha.txt # 到redis容器查看是否文件共享 [root@k8s-master01 ~]# kubectl exec -ti dp-nginx-98db5f6df-6g24r -c redis -- ls /tmp haha.txt
第四步:沒有第四步了,從第三步可以看到在nginx容器創建的文件,是可以在redis容器內看到的,所有共享卷是成功的。
2.HostPath
2.1.HostPath卷特性:
hostPath 卷能將主機節點文件系統上的文件或目錄掛載到你的 Pod 中。
注意:官方是不推薦使用這種方式的,但是當你需要使用hostPath時,它的范圍應僅限于所需的文件或目錄,并以只讀方式掛載。
2.2.官方示例:
apiVersion: v1 kind: Pod metadata: name: test-pd spec: containers: - image: k8s.gcr.io/test-webserver name: test-container volumeMounts: - mountPath: /test-pd name: test-volume volumes: - name: test-volume hostPath: # 宿主上目錄位置 path: /data # 此字段為可選 type: Directory
hostPath類型支持的type值:
默認為空:意味著在安裝 hostPath 卷之前不會執行任何檢查。
DirectoryOrCreate:如果在給定路徑上什么都不存在,那么將根據需要創建空目錄,權限設置為 0755,具有與 kubelet 相同的組和屬主信息。
Directory:在給定路徑上必須存在的目錄。
FileOrCreate:如果在給定路徑上什么都不存在,那么將在那里根據需要創建空文件,權限設置為 0644,具有與 kubelet 相同的組和所有權。
File:在給定路徑上必須存在的文件。
Socket:在給定路徑上必須存在的 UNIX 套接字。
CharDevice:在給定路徑上必須存在的字符設備。
BlockDevice:BlockDevice
注意: FileOrCreate 模式不會負責創建文件的父目錄。 如果欲掛載的文件的父目錄不存在,Pod 啟動會失敗。
2.3.我們做一個實例:
我們的舉例是用的File類型,你也可以嘗試其他類型,配置方式都一樣
第一步:從下面這個例子中可以看到容器內的時區與我們宿主機時區是不一樣的
[root@k8s-master01 ~]# kubectl exec -ti dp-nginx-98db5f6df-6g24r -c nginx -- cat /etc/timezone Etc/UTC [root@k8s-master01 ~]# cat /etc/timezone Asia/Shanghai
第二步:修改yaml文件,然后更新deploy副本
spec: containers: - image: nginx name: nginx volumeMounts: - mountPath: /opt name: share-volume - mountPath: /etc/timezone name: timezone - image: redis name: redis volumeMounts: - mountPath: /tmp name: share-volume volumes: - name: share-volume emptyDir: {} - name: timezone hostPath: path: /etc/timezone # 宿主機路徑 type: File # 更新副本,注意大小寫,我剛才file寫的小寫報錯了 [root@k8s-master01 ~]# kubectl replace -f dp-nginx.yaml deployment.apps/dp-nginx replaced
第三步:查看容器時區,是成功的,已經修改為shanghai;可以看到掛載宿主機時區的已經修改,沒掛載的redis容器的時區還是默認
[root@k8s-master01 ~]# kubectl exec dp-nginx-7b456ccf45-8c8fn -c nginx -- cat /etc/timezone Asia/Shanghai [root@k8s-master01 ~]# kubectl exec dp-nginx-7b456ccf45-8c8fn -c redis -- cat /etc/timezone Etc/UTC
3.nfs
nfs 卷能將 NFS (網絡文件系統) 掛載到你的 Pod 中。 不像 emptyDir 那樣會在刪除 Pod 的同時也會被刪除,nfs 卷的內容在刪除 Pod 時會被保存,卷只是被卸載。
但是生產中不大建議使用。
這個實例我沒有準備,就說下怎么做吧。有興趣可以自己做一下。
第一步:準備一臺NFS服務器,創建共享目錄/data/test
第二步:將nfs的共享目錄掛載到Pod中
spec: containers: - image: nginx name: nginx volumeMounts: - mountPath: /opt name: nfs-volume volumes: - name: nfs-volume nfs: server: 192.168.10.10 # nfs服務器ip path: /data/test
第三步:創建Pod資源后在容器內部/opt下創建文件,在nfs服務器/data/test下查看是否共享,反過來測試也可以。如果資源共享說明成功。
其他類型的卷可以查看官網,下一篇寫pv與pvc!
原文鏈接:https://yyang.blog.csdn.net/article/details/123257615
相關推薦
- 2023-03-28 深入了解Android中GestureDetector的定義與使用_Android
- 2022-11-23 關于vba代碼運行時錯誤1004?應用程序定義或對象定義錯誤問題_VBA
- 2022-05-25 springboot踩坑日記Feign傳遞MultipartFile詳解
- 2022-01-18 正則——16進制顏色
- 2022-04-02 Redis快速實現分布式session的方法詳解_Redis
- 2022-10-01 Python利用Bokeh進行數據可視化的教程分享_python
- 2022-05-31 Golang庫插件注冊加載機制的問題_Golang
- 2022-08-28 虛擬機ubuntu通過fdisk命令擴充硬盤容量,分區簡單說明
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支