在之前的討論中,曾經出現過volumes和volumeMounts,因為Container內的資料如果不是本來就存放在image中,那當這個Container因為各種原因被刪除,就算事後重建,也無法找回那些資料,所以我們需要為Container配置額外的空間來儲存image外的資料。
Volumes就是為了Pod配置額外的儲存空間資源,可以想像成我們為它加上外接硬碟。
它包含多種型態:
hostPath:將這個Pod所在的Node中,某個路徑映射到Pod的內部。這種方法有許多安全性的風險,最好避免使用,若是需要使用官方是建議要限定路徑或是檔案,並且設置ReadOnly。
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: registry.k8s.io/test-webserver
name: test-container
volumeMounts:
- mountPath: /cache
name: cache-volume
volumes:
- name: cache-volume
hostPath:
path: /data
type: Directory
特殊類型:像是AWS的EBS,這部分比較算是AWS的範圍。
volumes:
- name: test-volume
# 此 AWS EBS 卷必須已經存在
awsElasticBlockStore:
volumeID: "<volume id>"
fsType: ext4
emptyDir:產生一個空的Volume,只要這個Pod沒被刪除,那這個Volume的資料就會保存下來。此外,Crash不會導致這個Volume的資料遺失。
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: registry.k8s.io/test-webserver
name: test-container
volumeMounts:
- mountPath: /cache
name: cache-volume
volumes:
- name: cache-volume
emptyDir: {}
前面在討論hostPath時有提到type,當時是使用Directory。type其實還有很多種應用方式,我們來看看常用的類型~
還有其他的type,例如Socket,可以參考卷。
之前有提過ConfigMap,Volumes支援使用ConfigMap來記錄Volume的路徑,我們來看看怎麼做~
apiVersion: v1
kind: Pod
metadata:
name: configmap-pod
spec:
containers:
- name: test
image: busybox:1.28
volumeMounts:
- name: config-vol
mountPath: /etc/config
volumes:
- name: config-vol
configMap:
name: log-config
items:
- key: log_level
path: log_level
其實就是讀取ConfigMap中的某個變數,然後使用這個變數當作路徑。
Volumes還有支援很多種類型,我在這邊介紹的為Kubernetes本身比較常用的,其他類型如:AWS的EBS就比較像是AWS的領域,在CKA的考試上就較無關係。
我們今天提到了Volumes,明天會討論更為進階的PV、PVC等功能。