📂 容器的文件僅暫存在磁碟,與容器共進退,kubelet重啟容器時,總會是全新狀態 (把先前的事忘光);而且容器之間的資料共享也不好處理,此時,數據卷 (Volume)出現了,專門解決持久性及集中儲存的問題
Volume設計可以給pod內的所有容器存取,並且能同時使用多種類型的volume,如可以使用臨時性卷 (Ephemeral volume)類型,資料將隨著pod的生命週期生滅,或是使用持久性卷 (persistent volume)類型,則資料能持久保存,但不管是哪一種volume,即使容器重啟,資料都還是會被留存下來,Volume的寫法如下示:
apiVersion: v1
kind: Pod
metadata:
name: random-number-generator
spec:
containers:
- image: alpine
name: alpine
command: ["/bin/sh","-c"]
args: ["shuf -i 0-100 -n 1 >> /opt/number.out;"]
# volume要從容器的此位置接資料
volumeMounts:
- mountPath: /var/www/html
# 取用的volume
name: data-volume
# 進一步指定子路徑
subPath: html
# 使用的volume
volumes:
- name: data-volume
hostPath:
path: /data
type: Directory
volume的種類(列舉部分)
emptyDir.medium
: 指定儲存的位置,像是磁碟或SSD,設定為Memory時,則會錨定在tmpfs (RAM-backed filesystem),速度優先emptyDir.sizeLimit
: 使用預設medium時設定限制用量# 取自官網文件
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及其類型設定
volumes:
- name: cache-volume
emptyDir:
sizeLimit: 500Mi
# 取自官網文件
apiVersion: v1
kind: Pod
metadata:
name: hostpath-example-linux
spec:
os: { name: linux }
nodeSelector:
kubernetes.io/os: linux
containers:
- name: example-container
image: registry.k8s.io/test-webserver
# 錨定於容器當中的路徑
volumeMounts:
- mountPath: /foo
name: example-volume
# 設定容器不可做write (非讓volume本身只能讀)
readOnly: true
# volumes及其類型設定
volumes:
- name: example-volume
hostPath:
path: /data/foo
type: Directory
# 取自官網文件
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: registry.k8s.io/test-webserver
name: test-container
volumeMounts:
- mountPath: /my-nfs-data
name: test-volume
volumes:
- name: test-volume
nfs:
server: my-nfs-server.example.com
path: /my-nfs-volume
readOnly: true
多層結構及寫入時複製機制 layered architecture && copy on write
從image(1.)建立成container(+2.),若要修改image層的內容 (例如source code)時,Docker會在容器層建立副本,達成編輯功能,這些data非持久化保存,跟著容器的生命週期離去
Read Only
基底的映像檔層 (image layer)為共用不可變Read Write
容器層 (container layer)為可讀寫持久化儲存的錨定,於本機做Volume為例
/var/lib/docker
docker volume create <名稱data-volume>
或直接在目錄下建立/var/lib/docker/volumes/<名稱data-volume>
docker run -v data_volume:/var/lib/mysql mysql
docker run --mount type-bind, source=/data/mysql,target=/var/lib/mysql mysql --volume-driver rexray/ebs
docker run -v /data/mysql:/var/lib/mysql mysql