1. 程式人生 > >Kubernetes(k8s)中文文件 名詞解釋 Volumes_Kubernetes中文社群

Kubernetes(k8s)中文文件 名詞解釋 Volumes_Kubernetes中文社群

容器中的磁碟的生命週期是短暫的,這就帶來了一系列的問題,第一,當一個容器損壞之後,kubelet 會重啟這個容器,但是檔案會丟失-這個容器會是一個全新的狀態,第二,當很多容器在同一Pod中執行的時候,很多時候需要資料檔案的共享。Kubernete Volume解決了這個問題

Background背景

Docker有一個Volumes的概念,雖然這個Volume有點寬鬆和管理性比較小。在Docker中,一個 Volume 是一個簡單的所在主機的一個目錄或者其它容器中的。生命週期是沒有辦法管理,直到最近才有 local-disk-backed 磁碟。Docker現在提供了磁碟驅動,但是功能非常有限(例如Docker1.7只能掛在一個磁碟每個容器,並且無法傳遞引數)

從另外一個方面講,一個Kubernetes volume,擁有明確的生命週期,與所在的Pod的生命週期相同。因此,Kubernetes volume獨立與任何容器,與Pod相關,所以資料在重啟的過程中還會保留,當然,如果這個Pod被刪除了,那麼這些資料也會被刪除。更重要的是,Kubernetes volume 支援多種型別,任何容器都可以使用多個Kubernetes volume。

它的核心,一個 volume 就是一個目錄,可能包含一些資料,這些資料對pod中的所有容器都是可用的,這個目錄怎麼使用,什麼型別,由什麼組成都是由特殊的volume 型別決定的

想要使用一個volume,Pod必須指明Pod提供了那些磁碟,並且說明如何掛在到容器中

A process in a container sees a filesystem view composed from their Docker image and volumes. The Docker image is at the root of the filesystem hierarchy, and any volumes are mounted at the specified paths within the image. Volumes can not mount onto other volumes or have hard links to other volumes. Each container in the Pod must independently specify where to mount each volume.

(這段沒太看懂阿)

容器中的一個程序看到檔案系統由Docker映象和磁碟構成,Docker映象是檔案系統的最底層,所有的磁碟都是掛在在這個映象的特殊路徑上。磁碟不能被掛在到被的磁碟或者建立硬連結。每個Pod中的容器必須是獨立指定的取掛在這些磁碟

Types of Volumes

Kubernete 支援如下型別的volume:

emptyDir

hostPath

gcePersistentDisk

awsElasticBlockStore

nfs

iscsi

glusterfs

rbd

gitRepo

secret

persistentVolumeClaim

emptyDir

一個emptyDir 第一次建立是在一個pod被指定到具體node的時候,並且會一直存在在pod的生命週期當中,正如它的名字一樣,它初始化是一個空的目錄,pod中的容器都可以讀寫這個目錄,這個目錄可以被掛在到各個容器相同或者不相同的的路徑下。當一個pod因為任何原因被移除的時候,這些資料會被永久刪除。注意:一個容器崩潰了不會導致資料的丟失,因為容器的崩潰並不移除pod.

emptyDir 磁碟的作用:

scratch space, such as for a disk-based mergesortcw

checkpointing a long computation for recovery from crashes

holding files that a content-manager container fetches while a webserver container serves the data

  • 普通空間,基於磁碟的資料儲存
  • 作為從崩潰中恢復的備份點
  • 儲存那些那些需要長久儲存的資料,例web服務中的資料

預設的,emptyDir 磁碟會儲存在主機所使用的媒介上,可能是SSD,或者網路硬碟,這主要取決於你的環境。當然,我們也可以將emptyDir.medium的值設定為Memory來告訴Kubernetes 來掛在一個基於記憶體的目錄tmpfs,因為

tmpfs速度會比硬碟塊度了,但是,當主機重啟的時候所有的資料都會丟失

hostPath

一個hostPath型別的磁碟就是掛在了主機的一個檔案或者目錄,這個功能可能不是那麼常用,但是這個功能提供了一個很強大的突破口對於某些應用來說

例如,如下情況我們舊可能需要用到hostPath

  • 某些應用需要用到docker的內部檔案,這個時候只需要掛在本機的/var/lib/docker作為hostPath
  • 在容器中執行cAdvisor,這個時候掛在/dev/cgroups

當我們使用hostPath的時候要注意如下內容

從模版檔案中建立的pod可能會因為主機上資料夾目錄的不同而導致一些問題

Kubernetes 規劃一些資源相關的維護的時候,它舊不能根據此種類型的資源進行判斷(這句沒太看懂阿,這個應該得先要知道具體的維護型別才好….)

gcePersistentDisk

gcePersistentDisk 是指掛在一個特殊GCE 持久化磁碟 到我們的pod中,和emptyDir不同的是,emptyDir會被刪除當我們的Pod被刪除的時候,但是gcePersistentDisk不會被刪除,僅僅是解除掛在狀態而已,這就意味著PD能夠允許我們提前對資料進行處理,而且這些資料可以在Pod之間相互傳遞

重要的是:我們需要先通過GCE api 或者圖形操作介面 建立一個PD,這是你使用它的前提

gcePersistentDisk有一些限制:

節點必須使用的GCE VMs

PD必須和節點,專案在統一個區域

一個PD的特點是可以以只讀的方式掛在到多個地方,這舊意味著我們可以先收集一些資料,然後共享給任意多個pod使用,不幸的,PD同時只能被一個pod以讀寫的方式掛在。

在ReplicationController管理的pod上使用pd會失敗,除非是以只讀方式,或者數量是1或者0(因為讀寫同時只能是1)

如何建立一個pd

gcloud compute disks create size=500GB zone=us-central1-a my-data-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

awsElasticBlockStore

一個awsElasticBlockStore是一個掛在aws EBS 磁碟到我們的pod中,和emptyDir不同的是,emptyDir會被刪除當我們的Pod被刪除的時候,但是awsElasticBlockStore不會被刪除,僅僅是解除掛在狀態而已,這就意味著EBS能夠允許我們提前對資料進行處理,而且這些資料可以在Pod之間相互傳遞.

注意,我們首先要使用aws api或者圖形操作介面建立EBS 在我們使用之前

awsElasticBlockStore 有如下幾個限制:

  • 節點必須執行在aws的虛擬機器上
  • 節點和卷宗必須在同一個區域
  • EBS只支援但個EC2的例項進行掛載

建立一個EBS

aws ec2 create-volume availability-zone eu-west-1a size 10 volume-type gp2

注意,確保區域的正確性

具體例子

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:///

fsType: ext4

nfs

nfs使的我們可以掛在已經存在的共享到的我們的Pod中,和emptyDir不同的是,emptyDir會被刪除當我們的Pod被刪除的時候,但是nfs不會被刪除,僅僅是解除掛在狀態而已,這就意味著NFS能夠允許我們提前對資料進行處理,而且這些資料可以在Pod之間相互傳遞.並且,nfs可以同時被多個pod掛在並進行讀寫

注意:必須先報紙NFS伺服器正常執行在我們進行掛在nfs的時候

具體例子可以檢視http://kubernetes.io/v1.0/examples/nfs/

具體的我們可以看到,掛在點volumeMount 叫做nfs 被掛在到了容器(pod名稱叫做web)/var/www/html 目錄下,磁碟的型別叫做nfs,nfs伺服器的名稱叫做 nfs-server.default.kube.local,它共享了它的/目錄,在這個例子中,目錄使可寫入的

iscsi

iscsi允許將現有的iscsi磁碟掛載到我們的pod中,和emptyDir不同的是,emptyDir會被刪除當我們的Pod被刪除的時候,但是iscsi不會被刪除,僅僅是解除掛在狀態而已,這就意味著iscsi能夠允許我們提前對資料進行處理,而且這些資料可以在Pod之間相互傳遞

注意,我們需要先有自己的iscsi服務才可以進行後續的操作

iscsi的一個特點是它可以同時被多個pod以只讀的形式掛載,這就意味著我們可以提前將資料準備好,然後掛在到任意多個pod中,但是iscsi只允許一次只有一個以讀寫的掛在方式掛載。

glusterfs

glusterfs 允許 Glusterfs格式的開源磁碟掛載到我們的pod中,同樣的,當pod被刪除的時候,glusterfs也僅僅是被解除掛載,就意味著glusterfs能夠允許我們提前對資料進行處理,而且這些資料可以在Pod之間相互傳遞

注意:我們需要Glusterfs先存在之後再進行後續操作

rbd

rbd允許Rados Block Device格式的磁碟掛載到我們的Pod中,同樣的,當pod被刪除的時候,rbd也僅僅是被解除掛載,就意味著rbd能夠允許我們提前對資料進行處理,而且這些資料可以在Pod之間相互傳遞

注意:我們需要rbd先存在之後再進行後續操作

gitRepo

gitRepo是一個磁碟外掛的例子,它掛載了一個空的目錄,並且將git上的內容clone到目錄裡供pod使用,在將來,gitRepo會被轉移到更加解偶的模型中,而不是現在以kubernete api擴充套件年的形式

Secrets

一個Secrets磁碟是儲存敏感資訊的磁碟,例如密碼之類。我們可以將secrets儲存到api中,使用的時候以檔案的形式掛載到pod中,而不用連線api,Secrets是通過tmpfs來支撐的,所有secrets永遠不會儲存到不穩定的地方。

注意:使用之前先建立

persistentVolumeClaim

persistentVolumeClaim用來掛載持久化磁碟的。它是一種宣告持久化並且不需要知道具體是怎麼實現的的一種方式

Resources

emptyDir的儲存介質是由 /var/lib/kubelet的承載介質決定的,現在沒有限制說emptyDir或者hostPath的限制大小為多少,容器只見也沒有任何隔離。在將來,我們希望能夠emptyDir,volumes取申請固定大小的磁碟和相應型別的儲存介質。

更多討論:QQ交流群  513817976  入群暗號: kubernetes.org.cn

更多參考:http://kubernetes.io/docs/user-guide/volumes/

K8S中文社群微信公眾號