應用場景
pod 中的容器的數據隨着pod 的重啟,刪除就會消失,有的應用場景需要持久化數據,這時就需要卷掛載。
Tips:
volumes 是 pod 的一個組成部分, 因此像容器一樣在 pod 的規范中就定義了。 它們不是獨立的 Kubernetes 資源對象, 也不能單獨創建或刪除。 pod 中的所有容器都可以使用卷, 但必須先將它掛載在每個需要訪問它的容器中。 在每個容器中, 都可以在其文件系統的任意位置掛載卷。
常見的類型
empty 配置
emptyDir類型的Volume在Pod分配到Node上時被創建,Kubernetes會在Node上自動分配一個目錄,因此無需指定宿主機Node上對應的目錄文件。 這個目錄的初始內容為空,當Pod從Node上移除時,emptyDir中的數據會被永久刪除。emptyDir Volume主要用於某些應用程序無需永久保存的臨時目錄,多個容器的共享目錄等。
在Pod中的定義
apiVersion: vl kind: Pod metadata: name: fortune spec: containers: - image: luksa/fortune #第一個容器名為 html-asdf name: html-asdf volumeMounts: - name: html #容器掛載的本地卷為 html mountPath: /var/htdocs #掛載到容器的此目錄 - image: nginx:alpine name: web-server #第二個容器稱為 web-server volumeMounts : - name: html #容器掛載的本地卷為 html mountPath: /usr/share/nginx/html #設為只讀 readOnly: true ports: - containerPort: 80 protocol: TCP volumes - name: html #命名為html emptyDir: {} #卷的類型為emptyDir
volumes: - name: html emptyDir medium: Memory
使用 Git 倉庫作為存儲卷
Notice:
apiVersion: vl kind: Pod metadata: name: gitrepo-vol-pod spec: containers: - image: nginx:alpine name: web-server volumeMounts : - name : html mountPath: /usr/share/nginx/html readOnly: true ports: - containerPort: 80 protocol: TCP volumes: - name: html #容器掛載的本地卷為 html gitRepo: repository: https://github.com/kzf/asdf-website-example.git revision: master directory: .
Tips:
為了實現pod gitrepo 目錄與git 倉庫實時同步可以通過 sidecar 容器
hostPath卷
應用場景
使用持久化存儲
使用雲廠商的存儲
apiVersion: vl kind: Pod metadata: name: mongodb spec: volumes: - name: mongodb-data awsElasticBlockStore: volumeid: my-volume fsType: ext4 containers: ...
使用NFS卷
volumes: - name: vol-name nfs: server: 1.2.3.4 path: /somewhere/path
使用其他存儲技術
從底層存儲技術解耦pod(持久卷和持久卷聲明)
創建持久卷
持久卷不屬於任何命名空間, 它跟節點一樣是集群層面的資源。
apiVersion: vl kind: PersistentVolume metadata: name: fortune spec: capacity: storage: lGi accessModes: - ReadWriteOnce #可以被單個客戶端掛載為讀寫模 - ReadOnlyMany #式或者被多個客戶端掛載為只讀(這里指的是持久卷聲明) persistentVolumeReclaimPolicy: Retain #當聲明被釋放后,PersistentVolume 將會被保留(不清理和刪除) gcePersistentDisk: #PersistentVolume指定支持之前創建的GCE持久磁盤 pdName: asdf fsType: ext4
查看
$ kubectl get pv
NAME CAPACITY RECLAIMPOLICY ACCESSMODES STATUS
mongodb-pv lGi Retain RWO,ROX Available
通過創建持久卷聲明來獲取持久卷
持久卷聲明是屬於命名空間的資源對象,持久卷聲明只能被同一命名空間內的 pod 創建使用
apiVersion: vl kind: PersistentVolumeClaim metadata: name: fortune-pvc spec: resources: requests: storage: lGi #申請1G 的存儲空間 accessModes: - ReadWriteOnce #可以被單個客戶端掛載為讀寫模 storageClassName: "" #將空字符串指定為存儲類名可確保PVC 綁定到預先配置的 PV,而不是動態配置新的PV。關於動態配置pv 下文有介紹。
當創建好聲明, kubernetes 就會找到適當的持久卷並將其綁定到聲明 ,持久卷的容量必須足夠大以滿足聲明的需求,並且卷模式必須包含聲明中指定的訪問模式 。在該示例中,聲明請求 1GiB 的存儲空間和 ReadWriteOnce 訪問模式,之前創建的持久卷符合剛剛聲明中 的這兩個條件,所以它被綁定到對應的聲明中。
列舉持久卷聲明
$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESSMODES AGE
mongodb-pvc Bound mongodb-pv lGi RWO,ROX 3s
RWO ReadWriteOnce -- 僅允許單個節點掛載讀寫。 ROM ReadOnlyMany -- 僅允許多個節點掛載只讀。 RWX ReadWriteMany -- 允許多個節點掛載讀寫這個卷。
pod 中使用持久卷聲明
apiVersion: vl kind: Pod metadata: name: mongodb spec: containers: - image: mongo name: mongodb volumeMounts: - name : mogodb-data mountPath: /data/db ports: - containerPort: 27017 protocol: TCP volumes: - name: mongodb-data persistentVolumeClaim: claimName: mongodb-pvc
針對持久卷的回收有兩種方式:自動回收,手動回收。
持久卷的動態卷配置
StorageClass 資源定義
apiVersion: vl kind: StorageClass metadata: name: fast provisioner: kubernetes.io/gce-pd #用於配置持久卷的插件 parameters: type:pd-ssd #傳遞給parameters的參數 zone:europe-westl-b
創建一個請求特定存儲類的 PVC 定義
vi storageclass.yaml apiVersion: vl kind: PersistentVolumeClaim metadata: name: mongodb-pvc spec: storageClassName:fast #該pvc請求自定義存儲類 resources: requests storage: lGi #申請1G 的存儲空間 accessModes: - ReadWriteOnce #可以被單個客戶端掛載為讀寫模 隨后查看會發現自動生成了一個持久卷 $ kubectl get pv NAME CAPACITY ACCESSMODES RECLAIMPOLICY STATUS STORAGECLASS pvc-le6bc048 lGi RWO Delete Bound fast 可以看到動態配置的持久卷其容量和訪問模式是在PVC中所要求的 。它的回收策略是 Delete,這意味着當PVC被刪除時,持久卷也將被刪除。 除了 PV置備程序還提供了真實的存儲空間,fast StorageClass 被配置為使用 kubernetes.io/gce-pd 從而提供了GCE 持久磁盤。 可以使用以下命令查看磁盤 $ gcloud compute disks list NAME ZONE SIZE_GB TYPE STATUS kekub-dy-pvc-le6bc04 europe-westl-d 1 pd-standard READY 如上所示例 盤的名稱表明它是動態配置的, 同時 類型顯示為一個 SSD,正如在前面創建的存儲類中所指定的那樣。
注意 如果在 PVC 中引用一個不存在的存儲類, PV 的配直將失敗(在 PVC 上使用 kubectl describe 時,將會看到 ProvisioningFailed 事件)
了解存儲類的使用
$ kubectl get sc NAME TYPE fast kubernetes.io/gce-pd standard (default) kubernetes.io/gce-pd
Notice:
1、如果持久卷 明沒有明確指出要使用哪個存儲類, 默認存儲類會用於動態提供持久卷的內容。
2、如果尚未將 storageClassName 屬性設置為空字符串, 則盡管已存在適當的預配置持久卷,但動態卷置備程序仍將配置新的持久卷。
動態持久卷的配置圖

