k8s初級實戰01--資料卷
- 1 基礎概念
- 2 常見用法
- 2.1 pod 直接挂載
- 2.1.1 pod 直接挂載emptyDir
- 2.1.2 pod 直接挂載hostPath
- 2.1.3 pod 直接挂載nfs
- 2.1.4 通過 medium: Memory 挂載shm
- 2.2 pod+pv+pvc挂載
- 2.2.1 localPath
- 2.2.2 nfs
- 3 注意事項
- 4 說明
1 基礎概念
Container 中的檔案在磁盤上是臨時存放的,這給 Container 中運作的較重要的應用程式帶來一些問題。問題一:當容器崩潰時檔案丢失,kubelet 會重新啟動容器, 但容器會以幹淨的狀态重新開機。 問題二:會在同一 Pod 中運作多個容器并共享檔案時出現。 Kubernetes 卷(Volume) 這一抽象概念能夠解決這兩個問題。
卷的核心是包含一些資料的一個目錄,Pod 中的容器可以通路該目錄。
使用卷時, 在 .spec.volumes 字段中設定為 Pod 提供的卷,并在 .spec.containers[*].volumeMounts 字段中聲明卷在容器中的挂載位置。
資料卷的常見概念包括PV、PVC、StorageClass:
持久卷(Persistent Volume,PV)是叢集中的一塊存儲,可以由管理者事先供應,或者使用存儲類(Storage Class)來動态供應。PV 屬于叢集資源,不屬于某個命名空間。
持久卷申領(PersistentVolumeClaim,PVC)表達的是使用者對存儲的請求。概念上與 Pod 類似。 Pod 會耗用節點資源,而 PVC 申領會耗用 PV 資源。PVC 可以請求特定大小和通路模式(ReadWriteOnce、ReadOnlyMany 或 ReadWriteMany )。
存儲類(StorageClass)為管理者提供了描述存儲 “類” 的方法。 不同的類型可能會映射到不同的服務品質等級或備份政策,或是由叢集管理者制定的任意政策。
k8s 中支援很多類型卷,具體如下:
名稱 | 功能說明 |
awsElasticBlockStore | |
azureDisk | |
azureFile | |
cephfs | |
cinder | |
configMap | |
downwardAPI | |
emptyDir | 在pod中建立空檔案夾 |
fc (光纖通道) | |
flocker (已棄用) | |
gcePersistentDisk | |
gitRepo (已棄用) | |
glusterfs | |
hostPath | 挂載主控端器目錄 |
iscsi | |
local | 代表的是某個被挂載的本地儲存設備,例如磁盤、分區或者目錄 |
nfs | 挂載nfs目錄 |
persistentVolumeClaim | |
portworxVolume | |
projected | |
quobyte | |
rbd | |
scaleIO (已棄用) | |
secret | |
storageOS | |
vsphereVolume |
2 常見用法
2.1 pod 直接挂載
2.1.1 pod 直接挂載emptyDir
emptyDir 多用于在同一個pod内的不同容器之間共享資料,它僅僅在pod建立的時候被建立,随着pod的删除而消失(資料也會被永久删除);以下為emptyDir的使用案例:
vim pod-busybox-emptydir.yaml
apiVersion: v1
kind: Pod
metadata:
name: busybox-emptydir
spec:
containers:
- image: busybox:1.32
name: busybox-nfs
resources: {}
command:
- sh
- -c
- 'sleep 6000'
volumeMounts:
- name: vol-empty
mountPath: /data-empty
readOnly: false
volumes:
- name: vol-empty
emptyDir: {}
測試效果:
2.1.2 pod 直接挂載hostPath
hostPath 卷能将主機節點檔案系統上的檔案或目錄挂載到你的 Pod 中。 雖然這不是大多數 Pod 需要的,但是它為一些應用程式提供了強大的逃生艙;以下為 hostPath 的使用案例:
vim pod-busybox-localpath.yaml
apiVersion: v1
kind: Pod
metadata:
name: busybox-local
spec:
containers:
- image: busybox:1.32
name: busybox-nfs
resources: {}
command: [sh,-c,'sleep 6000']
volumeMounts:
- name: data-local
mountPath: /data-local
volumes:
- name: data-local
hostPath:
path: /disk0
type:
測試效果:
2.1.3 pod 直接挂載nfs
nfs 卷能将 NFS (網絡檔案系統) 挂載到你的 Pod ,不像 emptyDir 那樣會在删除 Pod 的同時也會被删除,nfs 卷的内容在删除 Pod 時會被儲存,卷隻是被解除安裝。 這意味着 nfs 卷可以被預先填充資料,并且這些資料可以在 Pod 之間共享;以下為nfs 的使用案例:
此需要預先建立nfs,具體建立方式可以參考筆者博文: shell程式設計筆記2–nfs挂載
vim pod-busybox-nfs.yaml
apiVersion: v1
kind: Pod
metadata:
name: busybox-nfs
spec:
containers:
- image: busybox:1.32
name: busybox-nfs
resources: {}
command: [sh,-c,'sleep 6000']
volumeMounts:
- name: data-nfs
mountPath: /data-nfs
volumes:
- name: data-nfs
nfs:
readOnly: false
server: 10.120.75.102
path:
測試效果:
2.1.4 通過 medium: Memory 挂載shm
預設情況下,pod 中容器shm為64m,但是實際有些業務需要更大量的shm,是以可以通過emptyDir 的 medium: Memory 來挂載主控端的shm,進而提高容器的shm大小。
vim pod_shm.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-shm
spec:
containers:
- image: busybox:1.32
name: busybox
command:
- /bin/sh
- '-c'
- 'sleep 3600'
volumeMounts:
- mountPath: /dev/shm
name: v-dev-shm
resources:
requests:
cpu: '100m'
memory: '10Mi'
volumes:
- name: v-dev-shm
emptyDir:
medium:
測試效果:
2.2 pod+pv+pvc挂載
2.2.1 localPath
vim pv-mysql-local.yaml
apiVersion: v1
kind: PersistentVolume #資源類型
metadata:
name: mysql-local-pv
spec:
capacity:
storage: 20Gi
accessModes:
- ReadWriteMany #通路模式,多個用戶端讀寫
persistentVolumeReclaimPolicy: Recycle #回收政策-可以回收
hostPath:
path: /disk0/mysql01
vim pvc-mysql-local.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-local-pvc
namespace: default
spec:
accessModes: ["ReadWriteMany"]
resources:
requests:
storage: 5Gi
vim pod-mysql-localpath.yaml
apiVersion: v1
kind: Pod
metadata:
name: mysql-local
spec:
containers:
- image: busybox:1.32
name: busybox-nfs
resources: {}
command: [sh,-c,'sleep 10000']
volumeMounts:
- name: data-local
mountPath: /data-local
volumes:
- name: data-local
persistentVolumeClaim:
claimName: mysql-local-pvc
2.2.2 nfs
vim pv-mysql-nfs.yaml
apiVersion: v1
kind: PersistentVolume #資源類型
metadata:
name: mysql-nfs-pv
spec:
capacity:
storage: 20Gi
accessModes:
- ReadWriteMany #通路模式,多個用戶端讀寫
persistentVolumeReclaimPolicy: Recycle #回收政策-可以回收
nfs:
path: "/mnt/mysql01"
server: 10.120.75.102 #k8s-nfs matser
readOnly: false #隻讀
vim pvc-mysql-nfs.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: mysql-nfs-pvc
namespace: default
spec:
accessModes: ["ReadWriteMany"]
resources:
requests:
storage: 5Gi
vim pod-mysql-nfs.yaml
apiVersion: v1
kind: Pod
metadata:
name: mysql-nfs
spec:
containers:
- image: busybox:1.32
name: busybox-nfs
resources: {}
command: [sh,-c,'sleep 10000']
volumeMounts:
- name: data-nfs
mountPath: /data-nfs
volumes:
- name: data-nfs
persistentVolumeClaim:
claimName: mysql-nfs-pvc
3 注意事項
- 使用emptyDir 挂載shm的時候,盡量不要設定limitSize,否則當使用達到上限後會導緻pod被驅逐。