背景
應(yīng)用打包為容器鏡像后旷坦,可以通過環(huán)境變量或者外掛文件的方式在創(chuàng)建容器時進(jìn)行配置注入,但在大規(guī)模容器集群的環(huán)境中佑稠,對多個容器進(jìn)行不同的配置將變得非常復(fù)雜秒梅。k8s從1.2版本開始提供了一種統(tǒng)一的應(yīng)用配置管理方案--ConfigMap
簡介
ConfigMap是一種API對象,用來將非機密性的數(shù)據(jù)保存到鍵值對中舌胶。ConfigMap將環(huán)境配置信息和容器鏡像解耦捆蜀,便于應(yīng)用配置的修改。
ConfigMap供容器使用的典型用法如下:
- 生成容器內(nèi)的環(huán)境變量
- 設(shè)置容器啟動命令的啟動參數(shù)(需設(shè)置為環(huán)境變量)
- 以Volume的形式掛載為容器內(nèi)部的文件或目錄
注:
ConfigMap 并不提供保密或者加密功能幔嫂。 如果想存儲的數(shù)據(jù)是機密的辆它,應(yīng)使用Secret,或者使用其他第三方工具來保證你的數(shù)據(jù)的私密性履恩,而不是用 ConfigMap
創(chuàng)建ConfigMap資源對象
- 例子test-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: game-demo
data:
# 類屬性鍵锰茉;每一個鍵都映射到一個簡單的值
player_initial_lives: "3"
ui_properties_file_name: "user-interface.properties"
# 類文件鍵
game.properties: |
enemy.types=aliens,monsters
player.maximum-lives=5
user-interface.properties: |
color.good=purple
color.bad=yellow
allow.textmode=true
- 創(chuàng)建
kubectl apply -f test-configmap.yaml
在pod中使用ConfigMap
- Pod示例configmap-demo-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: configmap-demo-pod
spec:
containers:
- name: demo
image: alpine
command: ["sleep", "3600"]
env:
# 定義環(huán)境變量
- name: PLAYER_INITIAL_LIVES # 請注意這里和 ConfigMap 中的鍵名是不一樣的
valueFrom:
configMapKeyRef:
name: game-demo # 這個值來自 ConfigMap
key: player_initial_lives # 需要取值的鍵
- name: UI_PROPERTIES_FILE_NAME
valueFrom:
configMapKeyRef:
name: game-demo
key: ui_properties_file_name
volumeMounts:
- name: config
mountPath: "/config"
readOnly: true
volumes:
# 你可以在 Pod 級別設(shè)置卷,然后將其掛載到 Pod 內(nèi)的容器中
- name: config
configMap:
# 提供你想要掛載的 ConfigMap 的名字
name: game-demo
# 來自 ConfigMap 的一組鍵切心,將被創(chuàng)建為文件
items:
- key: "game.properties"
path: "game.properties"
- key: "user-interface.properties"
path: "user-interface.properties"
- 創(chuàng)建
kubectl apply -f configmap-demo-pod.yaml
- 查看詳情
kubectl describe pod configmap-demo-pod
- 查看環(huán)境變量
kubectl exec -it configmap-demo-pod -- /bin/sh
ConfigMap的限制條件
- ConfigMap必須在Pod之前創(chuàng)建飒筑,Pod才能引用它
- 如果Pod使用envFrom基于ConfigMap定義環(huán)境變量片吊,則無效的環(huán)境變量名稱(例如名稱以數(shù)字開頭)將被忽略,并在事件中被記錄為InvalidVariableNames
- ConfigMap受命名空間限制协屡,只有處于相同命名空間的Pod才可以引用它
- ConfigMap無法用于靜態(tài)Pod