Kubernetes - ConfigMaps 學習紀錄

Posted by Kubeguts on 2021-05-21

ConfigMaps 介紹

ConfigMaps核心概念

提供K8S的Pods,儲存設定資訊的媒介。

有時我們不想把設定寫死在專案程式碼內部,例如排程幾秒觸發動作等等,因為若專案被包成容器映像檔案,要做修改的話會變得非常棘手

就可以用ConfigMaps將這資訊獨立出來,方便動態調整設定。

ConfigMaps幫助將設定資訊注入在Container內,這些資訊可以是:

  • JSON
  • XML
  • keys/values

ConfigMap可以透過兩種方式取得

  • Environment variables (key/value)
  • ConfigMap volume (files)

創建ConfigMaps方式

Key/Values 方式設定

1
2
3
4
5
6
7
8
9
10
11
apiVersion: v1
kind: ConfigMap # 為ConfigMaps
metadata:
name: app-settings
labels:
app: app-settings
data: # ConfigMaps所儲存的資訊, 以下為自己定義的key
enemies: aliens
lives: "3"
enemies.cheat: "true"
enemies.cheat.level: noGoodRotten

Files 方式設定

假設有個設定檔案叫做 game.config

1
2
3
4
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten

可以指定要吃設定檔的方式來創建configMaps

1
kubectl create configmap [configMap name] --from-file=[path to file]

最後會產出如下的configMaps

1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: v1
kind: ConfigMap # 為ConfigMaps
metadata:
name: app-settings
labels:
app: app-settings
data: # 會以key的方式註名是引入哪個設定檔案
game.config: |-
enemies: aliens
lives: "3"
enemies.cheat: "true"
enemies.cheat.level: noGoodRotten
要注意,給kubectl create configmap 的configmap name的格式須符合:
  1. 都是小寫
  2. 只能包含 - 與 . 特殊符號
  3. 開頭與結尾必須是小寫

不然會噴以下錯誤

1
error: failed to create configmap: ConfigMap "wrongConfig" is invalid: metadata.name: Invalid value: "wrongConfig": a lowercase RFC 1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character (e.g. 'example.com', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*')

以環境變數設定方式創建

一樣用這個設定檔案

1
kubectl create configmap [configMap name] --from-env-file=[path to file]

透過這樣的方式創建,就會產出跟直接在configMaps的data欄位定義key/value是一樣的

1
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: v1
kind: ConfigMap # 為ConfigMaps
metadata:
name: app-settings
labels:
app: app-settings
data: # ConfigMaps所儲存的資訊
enemies: aliens
lives: "3"
enemies.cheat: "true"
enemies.cheat.level: noGoodRotten
binaryData: # 也可以置入base64的內容
enemies.name: bW9uc3Rlcgo=
可以使用下列指令來取得字串的base64格式
1
ehco "要編碼的字串" | base64

以字面索引方式創建

可以索引多個設定來源

1
2
3
kubectl create configmap [configmap name] \
--from-literal=apiUrl=https://my-api \
--from-literal=otherKey=otherValue

取得ConfgiMap

取得ConfigMap和顯示資訊

1
kubectl get cm [cm name] -o yaml

在Pod中,透過configMapKeyRef指定ConfigMaps名稱,與其key值來取值

下圖為範例,右邊為Pod,透過configMapKeyRef指定app-settings這個configMaps,取得key為enemies的值為aliens,來賦予環境變數ENEMIES這個值

pic01

若是要取得整個configMaps的資訊,就直接使用configMapRef

pic02

以Volume方式取得ConfigMaps

可以將configMaps以Volumns方式存成檔案,掛載到Pod內

  • 會透過kubelet先下載到Pod所在的Node,在用Volume掛載進Pod內

下圖範例將configMaps儲存到 /etc/config目錄內,volumns名稱為app-config-vol

pic03

參考