我們在前幾天花了一些 Controller, Scheduler 的特性和設置,相信大家應該都已經理解了(吧?)
接下來就來講 K8s 儲存資料的部分吧!
像 docker 一樣,k8s中的pod都是以映像檔 image 建立的,因此他和docker的 container 有著一樣的特性:資料不會永久儲存
,若是遇到 pod 崩潰, kubectl 會自動去重啟這個 pod,但這個 pod 只會含有最初映像檔的資料,其他的資料會一去不復返。
K8s 中和 docker 有著一樣的 Volume,且k8s 中的 volume 是與 pod 綁定的,和 pod 有著一樣的生命週期,且是一樣的資源物件,當 pod 需要使用volume中存儲的資料時,使用 volumeMount
便可將volume 掛載至 pod 中,使 pod 得以使用內部的資料。
目前 K8s 支援的 Volume包含以下幾種:
有一些資源類型也會被映射為檔案或目錄:
ConfigMap
:應用設定Secret
:加密資料DownwardAPI
:Pod 或 Container 中的中繼資訊ServiceAccountToken
:Service Account的Token 資料Projected Volume
:特殊的儲存卷冊類型,用於將一個或多個上列的資源類型掛載到容器中的同一個目錄之下K8s 管理的宿主機本機存放區類型分為:
EmptyDir
:用於存放臨時存放的資料HostPath
:用於存放在宿主機目錄的資料今天先來介紹
ConfigMap
和Secret
ConfigMap 是一種用來存放非機密性設置資料的 API 物件,所有的資料會被存在 k8s 的 etcd
中,在這邊不會細講 ConfigMap 的內容,僅會講解如何設置及掛載到k8s上,對於ConfigMap內容有興趣的人可以到ConfigMaps | Kubernetes 查看
這是一個官方示例的 ConfigMap文件
apiVersion: v1
kind: ConfigMap
metadata:
name: game-demo
data:
# property-like keys; each key maps to a simple value
player_initial_lives: "3"
ui_properties_file_name: "user-interface.properties"
# file-like keys
game.properties: |
enemy.types=aliens,monsters
player.maximum-lives=5
user-interface.properties: |
color.good=purple
color.bad=yellow
allow.textmode=true
在 pod 的設定YAML中,我們可以這樣設置volumeMounts
,讓pod抓到這個ConfigMap檔,並放到 /configs
裏
apiVersion: v1
kind: Pod
metadata:
name: configmap-demo-pod
spec:
containers:
- name: demo
image: alpine
command: ["sleep", "3600"]
env:
# Define the environment variable
- name: PLAYER_INITIAL_LIVES # Notice that the case is different here
# from the key name in the ConfigMap.
valueFrom:
configMapKeyRef:
name: game-demo # The ConfigMap this value comes from.
key: player_initial_lives # The key to fetch.
- name: UI_PROPERTIES_FILE_NAME
valueFrom:
configMapKeyRef:
name: game-demo
key: ui_properties_file_name
volumeMounts:
- name: config
mountPath: "/config"
readOnly: true
volumes:
# You set volumes at the Pod level, then mount them into containers inside that Pod
- name: config
configMap:
# Provide the name of the ConfigMap you want to mount.
name: game-demo
# An array of keys from the ConfigMap to create as files
items:
- key: "game.properties"
path: "game.properties"
- key: "user-interface.properties"
path: "user-interface.properties"
待pod啟動後,便可以在/configs下看見我們設定的資訊了!
和 ConfigMap 類似
若今日有一個 Secret
已建立
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file, it will be
# reopened with the relevant failures.
#
apiVersion: v1
data:
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rm
kind: Secret
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: { ... }
creationTimestamp: 2020-01-22T18:41:56Z
name: mysecret
namespace: default
resourceVersion: "164619"
uid: cfee02d6-c137-11e5-8d73-42010af00002
type: Opaque
則將pod的YAML檔中的 volumes
部分改成這樣即可
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: redis
volumeMounts:
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: foo
secret:
secretName: mysecret
optional: false # default setting; "mysecret" must exist
一樣不著墨於Secret,有興趣的人可以看這份文件:Secrets | Kubernetes
明天講完剩下的三種儲存用的資源類型後,將進入k8s 存儲的重頭戲PV, PVC和CSI