本文收錄在容器技術學習系列文章總目錄html
默認狀況下容器中的磁盤文件是非持久化的,容器中的磁盤的生命週期是短暫的,這就帶來了一系列的問題:第一,當一個容器損壞以後,kubelet 會重啓這個容器,可是文件會丟失-這個容器會是一個全新的狀態;第二,當不少容器在同一Pod中運行的時候,不少時候須要數據文件的共享。Kubernete Volume解決了這個問題。node
Docker有一個Volumes的概念,雖然這個Volume有點寬鬆和管理性比較小。在Docker中,一個 Volume 是一個簡單的所在主機的一個目錄或者其它容器中的。生命週期是沒有辦法管理,直到最近纔有 local-disk-backed 磁盤。Docker如今提供了磁盤驅動,可是功能很是有限(例如Docker1.7只能掛在一個磁盤每一個容器,而且沒法傳遞參數)nginx
從另一個方面講,Kubernetes volume,擁有明確的生命週期,與所在的Pod的生命週期相同。所以,Kubernetes volume獨立與任何容器,與Pod相關,因此數據在重啓的過程當中還會保留,固然,若是這個Pod被刪除了,那麼這些數據也會被刪除。更重要的是,Kubernetes volume 支持多種類型,任何容器均可以使用多個Kubernetes volume。git
它的核心,一個 volume 就是一個目錄,可能包含一些數據,這些數據對pod中的全部容器都是可用的,這個目錄怎麼使用,什麼類型,由什麼組成都是由特殊的volume 類型決定的。github
要使用Volume,pod須要指定Volume的類型和內容(spec.volumes字段),和映射到容器的位置(spec.containers.volumeMounts字段)。vim
容器中的進程能夠當作由Docker鏡像和卷組成的文件系統視圖。Docker鏡像位於文件系統層次結構的根目錄下,任何卷都安裝在圖像中的指定路徑上。卷沒法裝入其餘卷或具備到其餘卷的硬連接。Pod中的每一個容器必須獨立指定每一個卷的安裝位置。api
$ kubectl explain pod.spec.volumes 查詢k8s支持的全部類型存儲卷
使用emptyDir,當Pod分配到Node上時,將會建立emptyDir,而且只要Node上的Pod一直運行,Volume就會一直存。當Pod(無論任何緣由)從Node上被刪除時,emptyDir也同時會刪除,存儲的數據也將永久刪除。緩存
經常使用於做爲臨時目錄、或緩存使用。bash
(1)編寫yaml文件,並建立服務器
先建立一個名爲html的存儲卷;再由2個pod都掛載此存儲卷;
pod1基於此存儲卷做爲nginx的主目錄;pod2向此存儲卷目錄寫入東西;
[root@master volumes]# vim vol-emptyDir-demo.yaml apiVersion: v1 kind: Pod metadata: name: pod-vol-demo namespace: default labels: app: myapp tier: frontend annotations: along.com/created-by: "cluster admin" spec: volumes: - name: html emptyDir: {} containers: - name: myapp image: ikubernetes/myapp:v1 imagePullPolicy: IfNotPresent ports: - name: http containerPort: 80 volumeMounts: - name: html mountPath: /usr/share/nginx/html/ - name: busybox image: busybox:latest imagePullPolicy: IfNotPresent volumeMounts: - name: html mountPath: /data/ command: - "/bin/sh" - "-c" - "while true; do echo $(date) >> /data/index.html; sleep 2; done" [root@master volumes]# kubectl apply -f vol-emptyDir-demo.yaml pod/pod-vol-demo created
(2)驗證
---pod建立成功 [root@master ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE pod-vol-demo 2/2 Running 0 13s 10.244.1.106 node1 ---訪問業務,輸出是pod2的輸入 [root@master ~]# curl 10.244.1.106 Tue Jan 29 07:19:13 UTC 2019 Tue Jan 29 07:19:15 UTC 2019 Tue Jan 29 07:19:17 UTC 2019 Tue Jan 29 07:19:19 UTC 2019 Tue Jan 29 07:19:21 UTC 2019 Tue Jan 29 07:19:23 UTC 2019 Tue Jan 29 07:19:25 UTC 2019 Tue Jan 29 07:19:27 UTC 2019 Tue Jan 29 07:19:29 UTC 2019
hostPath容許掛載Node(宿主機)上的文件系統到Pod裏面去。若是Pod須要使用Node上的文件,可使用hostPath。
值 | 行爲 |
---|---|
空 | 空字符串(默認)用於向後兼容,這意味着在安裝hostPath卷以前不會執行任何檢查。 |
DirectoryOrCreate |
若是給定路徑中不存在任何內容,則將根據須要建立一個空目錄,權限設置爲0755,與Kubelet具備相同的組和全部權。 |
Directory |
目錄必須存在於給定路徑中 |
FileOrCreate |
若是給定路徑中不存在任何內容,則會根據須要建立一個空文件,權限設置爲0644,與Kubelet具備相同的組和全部權。 |
File |
文件必須存在於給定路徑中 |
Socket |
UNIX套接字必須存在於給定路徑中 |
CharDevice |
字符設備必須存在於給定路徑中 |
BlockDevice |
塊設備必須存在於給定路徑中 |
(1)編寫yaml文件,並建立
建立存儲卷,使用DirectoryOrCreate類型,node節點不存在會自動建立
[root@master volumes]# vim vol-hostpath-demo.yaml apiVersion: v1 kind: Pod metadata: name: vol-hostpath namespace: default spec: volumes: - name: html hostPath: path: /data/pod/volume1/ type: DirectoryOrCreate containers: - name: myapp image: ikubernetes/myapp:v1 volumeMounts: - name: html mountPath: /usr/share/nginx/html/ [root@master volumes]# kubectl apply -f vol-hostpath-demo.yaml pod/vol-hostpath created
(2)查詢驗證
[root@master volumes]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE vol-hostpath 1/1 Running 0 3s 10.244.1.111 node1 ---在node1上查詢是否生產目錄 [root@node1 ~]# ll -d /data/pod/volume1/index.html -rw-r--r-- 1 root root 17 Sep 21 14:44 /data/pod/volume1/index.html
(3)驗證存儲卷功能
---在node1上生成文件 [root@node1 ~]# echo "node01.along.com" > /data/pod/volume1/index.html ---訪問pod內服務,顯示成功 [root@master volumes]# curl 10.244.1.111 node01.along.com
(4)就算pod被刪除再重建,只要node還在,存儲卷就還在
[root@master volumes]# kubectl delete -f vol-hostpath-demo.yaml pod "vol-hostpath" deleted [root@master volumes]# kubectl apply -f vol-hostpath-demo.yaml pod/vol-hostpath created [root@master volumes]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE vol-hostpath 1/1 Running 0 3s 10.244.1.112 node1 [root@master volumes]# curl 10.244.1.112 node01.along.com
NFS 是Network File System的縮寫,即網絡文件系統。Kubernetes中經過簡單地配置就能夠掛載NFS到Pod中,而NFS中的數據是能夠永久保存的,同時NFS支持同時寫操做。Pod被刪除時,Volume被卸載,內容被保留。這就意味着NFS可以容許咱們提早對數據進行處理,並且這些數據能夠在Pod之間相互傳遞。
(1)事前準備
① 修改k8s集羣服務的hosts文件,使之能解析nfs服務器
[root@master volumes]# vim /etc/hosts 192.168.130.103 master 192.168.130.104 node1 192.168.130.105 node2 192.168.130.106 nfs
② 在k8s集羣服務器,安裝nfs-utils 工具
$ yum -y install nfs-utils
(2)在106服務器上提供nfs服務
[root@nfs ~]# yum -y install nfs-utils [root@nfs ~]# mkdir /data/volumes -p [root@nfs ~]# vim /data/volumes/index.html <h1>NFS stor</h1> [root@nfs ~]# vim /etc/exports /data/volumes 192.168.130.0/24(rw,no_root_squash) [root@nfs ~]# systemctl start nfs
(1)編寫yaml文件,並建立
[root@master volumes]# vim vol-nfs-demo.yaml apiVersion: v1 kind: Pod metadata: name: vol-nfs namespace: default spec: volumes: - name: html nfs: path: /data/volumes server: nfs containers: - name: myapp image: ikubernetes/myapp:v1 volumeMounts: - name: html mountPath: /usr/share/nginx/html/ [root@master volumes]# kubectl apply -f vol-nfs-demo.yaml pod/vol-nfs created
(2)驗證,訪問服務成功
[root@master ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE vol-nfs 1/1 Running 0 9s 10.244.1.115 node1 [root@master ~]# curl 10.244.1.115 <h1>NFS stor</h1>
刪除pod,再建立,也還存在數據。
(1)介紹
gitRepo volume將git代碼下拉到指定的容器路徑中
(2)示例
apiVersion: v1 kind: Pod metadata: name: server spec: volumes: - name: git-volume gitRepo: repository: "git@github.com:alonghub/my-git-repository.git" revision: "22f1d8406d464b0c0874075539c1f2e96c253775" containers: - name: myapp image: ikubernetes/myapp:v1 imagePullPolicy: IfNotPresent ports: - name: http containerPort: 80 volumeMounts: - name: git-volume mountPath: /usr/share/nginx/html/
glusterfs,容許將Glusterfs(一個開源網絡文件系統)Volume安裝到pod中。不一樣於emptyDir,Pod被刪除時,Volume只是被卸載,內容被保留。味着glusterfs可以容許咱們提早對數據進行處理,並且這些數據能夠在Pod之間「切換」。
注意::必須先運行本身的GlusterFS安裝,而後才能使用它。
有關更多詳細信息,請參閱GlusterFS示例。
RBD容許Rados Block Device格式的磁盤掛載到Pod中,一樣的,當pod被刪除的時候,rbd也僅僅是被卸載,內容保留,rbd可以容許咱們提早對數據進行處理,並且這些數據能夠在Pod之間「切換」。
有關更多詳細信息,請參閱RBD示例。
cephfs Volume能夠將已經存在的CephFS Volume掛載到pod中,與emptyDir特色不一樣,pod被刪除的時,cephfs僅被被卸載,內容保留。cephfs可以容許咱們提早對數據進行處理,並且這些數據能夠在Pod之間「切換」。
提示:可使用本身的Ceph服務器運行導出,而後在使用cephfs。
有關更多詳細信息,請參閱CephFS示例。