DevOps
CICD
K8s
Docker
Create a Pod
called redis-storage with image: redis:alpine with a Volume
of type emptyDir that lasts for the life of the Pod. Specs on the right
這題就是前面看到過很多次的Volume
的考題啦,前幾天一直看到Volume
,但是一直沒有介紹,今天終於要來介紹了。那麼甚麼是Volume
呢?
在容器的世界中,容器是非常容易被重啟的(因為容器通常是針對特殊任務存在,執行完任務就沒有存在的價值,可以掰掰了),容器一旦被刪除,其中的data也會隨之刪除,也就是說,Container內的資料是隨著Container存在而存在的;當然也隨著Container消失而消失。槍在人在,槍亡人亡。
你可以想像成是揮發性記憶體和非揮發性記憶體,揮發性記憶體只在通電時能儲存資料,一旦斷電資料就消失,有點類似這個概念
那要如何將Container的資料保存下來,就需要透過Volume
了。
Volume
可以是一個Node
或是一個雲端儲存平台,是K8s
實現儲存資料的方式。透過將Volume
mount 到Pod
上,就可以實現儲存Pod
的資料
多個Pod
可以同時mount同一個Volume
哦
那Pod
要如何mount到Volume
呢?我們來舉個例子,下面是一個亂數產生器的Pod YAML,會將結果輸出到容器的/opt/result.out
這個檔案下,但是容器的資料會消失,所以我們要將輸出資料mount到test-volume這個Volume
上,這個Volume
的type是hostPath
,也就是掛載 /data 這個目錄。也就是說這個Pod
所在Node
的 /data 目錄就是我們的Volume
。
apiVersion: v1
kind: Pod
metadata:
name: random-number-generator
spec:
containers:
- image: alpine
name: alpine
command: ["/bin/bash", "-c"]
args: ["shuf -i 0-50 -n 1 >> /opt/result.out"]
## container中要mount到volume上的目錄
volumeMounts:
- mountPath: /opt
name: test-volume
## vloume的名稱、路徑及類別
volumes:
- name: test-volume
hostPath:
path: /data
type: Directory
上面YAML檔中有個欄位spec.volumes.type
,也就是Vloume
的類型。K8s
提供的Vloume
類型非常多,一共有以下幾種:
很多對不對? 但是筆者認為目前只要了解其中幾個就行了,其他的等需要用到再學也不遲。筆者認為必須知道的類型有:
Pod
調度某給Node
時,首先創建emptyDir Volume
,並且該Pod
在該Node
上運行時就存在。顧名思義,它最初是空的。Pod
中的容器都可以在emptyDir Volume
中讀取和寫入相同的文件,儘管該Volume
可以安裝在每個Container中的相同或不同路徑上。當Pod
從Node
中被刪除時,emptyDir
中的數據也將被刪除。emptyDir
的用途包含:
Container crash不會從
Node
上刪除Pod
,因此,在Container crash期間,emptyDir Volume
中的資料是安全的
範例YAML:
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: k8s.gcr.io/test-webserver
name: test-container
volumeMounts:
- mountPath: /cache
name: cache-volume
volumes:
- name: cache-volume
emptyDir: {}
hostPath Volume
將Node
檔案系統中的檔案或目錄mount到Pod
中。hostPath
的生命週期與 Node
相同,並不會隨著 Pod
消失而消失。hostPath
的用途包含:
Node
的檔案系統進行儲存Node
上Docker
內部資料結構的容器應用時,可以透過定義hostPath
為Node
的 /var/lib/docker 目錄,使容器可以直接存取Docker
的檔案系統範例YAML:
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: k8s.gcr.io/test-webserver
name: test-container
volumeMounts:
- mountPath: /test-pd
name: test-volume
volumes:
- name: test-volume
hostPath:
# directory location on host
path: /data
# this field is optional
type: Directory
Volume
過幾天我們之後會再詳細介紹的~那這題其實就很明瞭啦~ 步驟如下:
Pod
emptyDir
的Volume
中。$ kubectl run redis-storage --image=redis:alpine --restart=Never --dry-run=client -o yaml > q7.yaml
$ vim q7.yaml
## 改成以下
apiVersion: v1
kind: Pod
metadata:
name: redis-storage
spec:
containers:
- image: redis:alpine
name: redis-storage
volumeMounts:
- mountPath: /data/redis
name: test-volume
volumes:
- name: test-volume
emptyDir: {}
$ kubectl apply -f q7.yaml
今天介紹了K8s
中儲存資料的方式 - Volume
,其實Volume
內容非常多,我們之後還會繼續看到的。好啦,今天就到這囉~ 謝謝大家~
Volumes
[Kubernetes] Volume Overview
You can find me on