數據卷用於實現容器持久化數據,kubernetes對於數據卷從新定義,提供了豐富強大的功能。html
kubernetes提供瞭如下類型的數據卷:
1.EmptyDir
2.HostPath
3.GCE Persistent Disk
4.Aws Elastic Block Store
5.NFS
6.iSCSI
7.Flocker
8.GlusterFS
9.RBD
10.Git Repo
11.Secret
12.Persistent Volume Claim
13.Downward APInginx
1、本地數據卷
kubernetes中有兩種類型的數據卷,它們只能做用於本地文件系統,咱們稱爲本地數據卷。
本地數據卷中的數據只會存在於一臺機器上,因此當Pod發生遷移的時候,數據便會丟失,沒法知足真正的數據持久化要求。可是本地數據卷提供了其餘用途,好比Pod中容器的文件共享,或者共享宿主機的文件系統。
1.EmptyDir
EmptyDir從名稱上的意思是空的目錄,它是在Pod建立的時候新建的一個目錄。
若是Pod配置了EmptyDir數據卷,在Pod的生命週期內都會存在,當Pod被分配到Node上的時候,會在Node上建立EmptyDir數據卷,並掛載到Pod的容器中。
只要Pod存在,EmptyDir數據卷都會存在(容器刪除不會致使EmptyDir數據卷丟失數據),可是若是Pod的生命週期終結(Pod被刪除),EmptyDir數據卷也會被刪除,而且永久丟失。
EmptyDir數據卷很是適合實現Pod中容器的文件共享。目前EmptyDir類型的volume主要做臨時空間,如web服務器寫日誌或者tmp文件須要的臨時目錄。
定義文件示例:emptydir-volume-pod.yaml:
apiVersion: v1
kind: Pod
metadata:
labels:
name: emptydir-volume
role: master
name: emptydir-volume
spec:
containers:
- name: emptydir-volume
image: registry:5000/back_demon:1.0
volumeMounts:
- name: log-storage
mountPath: /home/laizy/test/
command:
- /run.sh
volumes:
- name: log-storage
emptyDir: {}
2.HostPath
HostPath數據卷容許將容器宿主機上的文件系統掛載到Pod中。若是Pod須要使用宿主機上的某些文件,可使用HostPath數據卷。
建立一個Pod須要使用宿主機的SSL證書,能夠經過建立HostPath數據卷,而後將宿主機的/etc/ssl/certs目錄掛載到容器中。git
Pod的定義文件以下:
apiVersion:v1
kind:Pod
metadata:
name:nginx
spec:
containers:
-name:nginx
image:nginx
ports:
-containerPort:80
protocol:TCP
volumeMounts:
-name:ssl-certs
mountPath:/etc/ssl/certs
readOnly:true
volumes:
-name:ssl-certs
hostPath:
path:/etc/ssl/certs
2、網絡數據卷
網絡數據卷可以知足數據的持久化需求,Pod經過配置使用網絡數據卷,每次Pod建立的時候都會將存儲系統的遠端文件目錄掛載到容器中,數據卷中的數據將被永久保存,即便Pod被刪除的時候,只是除去掛載數據卷,數據卷中的數據仍然保存在存儲系統中,而且當新的Pod被建立的時候,還是掛載一樣的數據卷。
1.NFS
NFS(Network File System)即網絡文件系統,是FreeBSD支持的一種文件系統,它容許網絡中的計算機經過TCP/IP共享資源。在NFS的應用中,本地NFS的客戶端應用能夠透明地讀寫位於遠端NFS服務器上的文件,就像訪問本地文件同樣。
NFS數據卷的配置參賽:github
Pod的定義文件以下:
apiVersion:v1
kind:Pod
metadata:
name:nfs-web
spec:
containers:
-name:web
image:nginx
ports:
-name:web
containerPort:80
volumeMounts:
-name:nfs
mountPath:"/usr/share/nginx/html"
volumes:
-name:nfs
nfs:
server:nfs-server.default.kube.local
path:"/"web
2.RBD
Ceph是開源、分佈式的網絡存儲,同時又是文件系統。Ceph基於可靠的、可擴展的和分佈式的對象存儲,經過一個分佈式的集羣管理元數據,符合POSIX。
RBD是一個Linux塊設備驅動,提供了一個共享網絡塊設備,實現與Ceph的交互。RBD在Ceph對象存儲的集羣上進行條帶化和複製,提供可靠性、可擴展性以及對塊設備的訪問。
kubernetes中支持RBD方式,RBD數據卷配置的參數以下:數據庫
Pod的定義文件以下:
apiVersion:v1
kind:Pod
metadata:
name:rbd
spec:
containers
-image:kubernetes/pause
name:rbd-rw
volumeMounts:
-mountPath:/mnt/rbd
name:rbdpd
volumes:
-name:rbdpd
rbd:
fsType:ext4
image:foo
keyring:/etc/ceph/keyring
monitors:
-10.16.154.78:6789
-10.16.154.79:6789
-10.16.154.80:6789
pool:kube
readOnly:true
user:adminubuntu
3.iSCSI
iSCSI技術是一種由IBM公司研究開放的,是一個供硬設備使用的能夠在IP的上層運行的SCSI指令集,這種指令集合能夠實如今IP網絡上運行SCSI協議,使其可以在諸如高速千兆以太網上進行路由選擇。
iSCSI技術是一種新的存儲技術,該技術是將現有的SCSI接口與以太網技術結合,使服務器可與使用IP網絡的存儲裝置互相交換資料。
iSCSI數據卷的配置參數:後端
Pod的定義文件以下:
apiVersion:v1
kind:Pod
metadata:
name:iscsipd
spec:
containers:
-image:kubernetes/pause
name:iscsipd-ro
volumeMounts:
-mountPath:/mnt/iscsipd
name:iscsipd-ro
-image:kubernetes/pause
name:iscsipd-rw
volumeMounts:
-mountPath:/mnt/iscsipd
name:iscsipd-rw
volumes:
-iscsi:
fsType:ext4
iqn:iqn.2001-04.com.example:storage.kube.sysl.xyz
lun:0
readOnly:true
targetPortal:10.0.2.15:3260
name:iscsipd-ro
-iscsi:
fsType:ext4
iqn:iqn.2001-04.com.example:storage.kube.sysl.xyz
lun:0
readOnly:true
targetPortal:10.0.2.15:3260
name:iscsipd-rw
4.GlusterFS
GlusterFS是Scale-Out存儲解決方案Gluster的核心,它是一個開源的分佈式文件系統,具備強大的橫向擴展能力,經過擴展可以支持數PB存儲容量和處理數千客戶端。GlusterFS藉助TCP/IP或InfiniBand RDMA網絡將物理分佈的存儲資源彙集在一塊兒,使用單一全局命名空間來管理數據。GlusterFS基於可堆疊的用戶空間設計,可爲各類不一樣的數據負載提供優異的性能。
GlusterFS數據卷配置參數:api
Endpoints的定義文件以下:
apiVersion:v1
kind:Endpoints
metadata:
name:glusterfs-cluster
subsets:
-addresses:
-ip:10.240.106.152
ports:
-port:1
-addresses:
-ip:10.240.79.157
Pod的定義文件以下:
apiVersion:v1
kind:Pod
metadata:
name:glusterfs
spec:
containers:
-image:kubernetes/pause
name:glusterfs
volumeMounts:
-mountPath:/mnt/glusterfs
name:glustersfvol
volumes:
-glusterfs:
endpoints:glusterfs-cluster
path:kube_vol
readOnly:true
name:glustersfvol
5.Flocker
Flocker是一個容器數據管理工具,做爲ClusterHQ公司2014年推出的產品,Flocker主要負責Docker容器及其數據的管理。Flocker是一個數據卷管理器和多主機的Docker集羣管理工具。用戶能夠經過它來控制數據,實如今Docker中運行數據庫、隊列和鍵值存儲服務,並在應用程序中輕鬆使用這些服務。
Flocker數據卷配置參數:安全
Pod的定義文件以下:
apiVersion:v1
kind:Pod
metadata:
name:flocker-web
spec:
containers:
ports:
-name:web
containerPort:80
volumeMounts:
#name must match the volume name below
-name:www-root
mountPath:"/usr/share/nginx/html"
volumes:
-name:www-root
flocker:
datasetName:my-flocker-vol
6.AWS Elastic Block Store
AWS Elastic Block Store在AWS雲中提供用於Amazon EC2實例的持久性數據的塊級存儲卷。若是kubernetes運行在AWS之上,就能夠很是方便地使用Amazon Elastic Block Store做爲數據卷。
Amazon Elastic Block Store數據卷的配置參數:
Pod的定義文件以下:
apiVersion:v1
kind:Pod
metadata:
name:test-ebs
spec:
containers:
-image:gcr.io/google_containers/test-webserver
name:test-container
volumeMounts:
-mountPath:/test-ebs
name:test-volume
volumes:
-name:test-volume
#this AWS EBS volume must already exist.
awsElasticBlockStore:
volumeID:aws://<availability-zone>
fsType:ext4
7.GCE Persistent Disk
GCE Persistent Disk是GCE提供的持久化數據的服務,若是kubernetes運行在GCE之上,可使用GCE Persistent Disk做爲數據卷。
GCE Persistent Disk數據卷的配置:
Pod的定義文件以下:
apiVersion:v1
kind:Pod
metadata:
name:test-pd
spec:
containers:
-image:gcr.io/google_containers/test-webserver
name:test-container
volumeMounts:
-mountPath:/test-pd
name:test-volume
volumes:
-name:test-volume
#this GCE PD must already exist
gcePersistentDisk:
pdName:my-data-disk
fsType:ext4
3、Persistent Volume和Persistent Volume Claim關係
kubernetes中提供了Persistent Volume和Persistent Volume Claim機制,這是存儲消費模式。
Persistent Volume是由系統管理員配置建立的一個數據卷,它表明了某一類存儲插件實現,能夠是NFS、iSCSI等;而對於普通用戶來講,經過Persistent Volume Claim可請求並得到合適的Persistent Volume,而無須感知後端的存儲實現。
Persistent Volume和Persistent Volume Claim相互關聯,有着完整的生命週期管理。
Persistent Volume的狀態包括如下幾項:
1.Available:Persistent Volume建立成功後進入可用狀態,等待Persistent Volume Claim消費。
2.Bound:Persistent Volume被分配到Persistent Volume Claim進行綁定,Persistent Volume進入綁定狀態。
3.Released:Persistent Volume綁定的Persistent Volume Claim被刪除,Persistent Volume進入釋放狀態,等待收回處理。
4.Failed:Persistent Volume執行自動清理回收策略失敗後,Persistent Volume會進入失敗狀態。
Persistent Volume Claim的狀態包括以下幾項:
1.Pending:Persistent Volume Claim建立成功後進入等待狀態,等待綁定Persistent Volume。
2.Bound:分配Persistent Volume給Persistent Volume Claim進行綁定,Persistent Volume Claim進入綁定狀態。
4、Persistent Volume
Persistent Volume實際上就是複用了已有的數據卷實現,配置方法也是一致的,Persistent Volume目前支持如下類型:
1.GCE Persistent Disk
2.AWS Elastic Block Store
3.NFS
4.iSCSI
5.RBD
6.GlusterFS
7.HostPath(只適合測試使用)
建立Persistent Volume的時候須要指定數據卷的容量、訪問模式、回收策略。
1.容量
Persistent Volume經過設置資源容量,而後Persistent Volume Claim在請求的時候指定資源需求來進行匹配。
例如:
capacity:
storage:20Gi
2.訪問模式:
1).ReadWriteOnce:數據卷可以在一個節點上掛載爲讀寫目錄。
2).ReadOnlyMany:數據卷可以在多個節點上掛載爲只讀目錄。
3).ReadWriteMany:數據卷可以在多個節點上掛載爲讀寫目錄。
3.回收策略:
1).Retain:Persistent Volume在釋放後,須要人工進行回收操做。
2).Recycle:Persistent Volume在釋放後,kubernetes自動進行清理,清理完成後Persistent Volume則能夠再次綁定使用。
Persistent Volume的定義文件nfs-pv.yaml:
apiVersion:v1
kind:PersistentVolume
metadata:
name:nfs-pv
labels:
type:nfs
spec:
capacity:
storage:5Gi
accessModes:
-ReadWriteMany
nfs:
server:nfs-server
path:/
經過定義文件建立Persistent Volume:
$kubectl create -f nfs-pv.yaml
查看建立的Persistent Volume:
$kubectl describe persistentvolume nfs-pv
5、Persistent Volume Claim
Persistent Volume Claim指定所須要的存儲大小,而後kubernetes會選擇知足條件的Persistent Volume進行綁定。
Persistent Volume Claim的定義文件test-pvc.yaml:
apiVersion:v1
kind:PersistentVolumeClaim
metadata:
name:test-pvc
spec:
accessModes:
-ReadWriteMany
resources:
requests:
storage:3Gi
經過定義文件建立Persistent Volume Claim
$kubectl create -f my-pvc.yaml
建立成功後查詢Persistent Volume Claim:
$kubectl describe persistentvolumeclain my-pvc
最後建立Pod來使用Persistent Volume Claim,Pod的定義文件:
apiVersion:v1
kind:Pod
metadata:
name:busybox
labels:
app:busybox
spec:
containers:
-name:busybox
image:busybox
command:
-sleep
-3600
volumeMounts
-mountPath:/busybox-data
name:data
volume:
-name:data
persistentvolumeclain:
claimName:my-pvc
6、信息數據卷
kubernetes中有一些數據卷,主要用來給容器傳遞配置信息,咱們稱之爲信息數據卷。
好比Secret和Downward API都是將Pod的信息以文件形式保存,而後以數據卷方式掛載到容器中,容器經過讀取文件獲取相應的信息。
1.Secret
kubernetes提供了Secret來處理敏感數據,好比密碼、token和密鑰,相比於直接將敏感數據配置在Pod的定義或者鏡像中,Secret提供了更加安全的機制,防止數據泄漏。
Secret的建立是獨立於Pod的,以數據卷的形式掛載到Pod中,Secret的數據將以文件的形式保存,容器經過讀取文件能夠獲取須要的數據。
Secret的類型有3種:
1).Opaque:自定義數據內容,默認值。
2).kubernetes.io/service-account-token:Service Account的認證內容。
3).kubernetes.io/dockkercfg:Docker鏡像倉庫的認證內容。
例如,如今有一個應用須要獲取賬號密碼,由於是自定義數據內容,因此Secret的類型是Opaque。
Secret定義文件secret.yaml:
apiVersion:v1
kind:Secret
metadata:
name:mysecret
type:Opaque
data:
username:my-username
password:my-password
經過定義文件建立Secret:
$kubectl create -f secret.yaml
建立成功後查詢Secret:
$kubectl describe secret mysecret
而後建立Pod使用該Secret,Pod的定義文件:
apiVersion:v1
kind:Pod
metadata:
name:busybox
labels:
app:busybox
spec:
containers:
-name:busybox
image:busybox
command:
-sleep
-"3600"
volumeMounts:
-mountPath:/secret
name:secret
readOnly:true
volumes:
-name:secret
secret:
secretName:mysecret
2.Downward API
Downward API能夠經過環境變量的方式告訴容器Pod的信息。另外,也能夠經過數據卷方式傳值,Pod的信息將會以文件的形式經過數據卷掛載到容器中,在容器中能夠經過讀取文件獲取信息,目前支持:
1).Pod的名稱。
2).Pod的Namespace。
3).Pod的Label
4).Pod的Annotation
建立Pod使用Downward API數據卷,Pod的定義文件downwardapi-volume.yaml:
apiVersion:v1
kind:Pod
metadata:
name:downwardapi-volume
labels:
zone:us-est-coast
cluster:test-cluster1
rack:rack-22
annotations:
build:two
builder:john-doe
spec:
containers:
-name:client-container
image:ubuntu:14.04
command:["/bin/bash","-c","while true;do sleep 5;done"]
volumeMounts:
-name:podinfo
mountPath:/podinfo/
readOnly:false
volumes:
-name:podinfo
downwardAPI:
items:
-path:"pod_name"
fieldRef:
fieldPath:metadata.name
-path:"pod_namespace"
fieldRef:
fieldPath:metadata.namespace
-path:"pod_labels"
fieldRef:
fieldPath:metadata.labels
-path:"pod_annotations"
fieldRef:
fieldPath:metadata.annotations
3.Git Repo
kubernetes支持將Git倉庫下載到Pod中,目前是經過Git Repo數據卷實現,即當Pod配置Git Repo數據卷時,就下載配置的Git倉庫到Pod的數據卷中,而後掛載到容器中。
建立Git Repo數據卷,Pod的定義文件:apiVersion:v1kind:Podmetadata: name:busybox labels: app:busyboxspec: containers: -name:busybox image:busybox command: -sleep -"3600" volumeMounts -mountPath:/config name:busybox-config volumes: -name:busybox-config gitRepo: repository:http://github.com/wulonghui/busybox-config.git revision:master