本文已超過一年。較舊的文章可能包含過時的內容。請檢查頁面中的資訊自發布以來是否已變得不正確。
使用容器進行組態管理
編者註: 這是我們關於 Kubernetes 1.2 新功能的 深入文章系列 中的第七篇貼文
撰寫應用程式時的 良好實務 是將應用程式程式碼與組態分開。我們希望讓應用程式作者能夠在 Kubernetes 內輕鬆採用此模式。雖然 Secrets API 允許將憑證和金鑰等資訊與應用程式分開,但過去沒有任何物件用於普通的非秘密組態。在 Kubernetes 1.2 中,我們新增了一個名為 ConfigMap 的新 API 資源來處理此類型的組態資料。
ConfigMap 的基礎知識
ConfigMap API 在概念上很簡單。從資料的角度來看,ConfigMap 類型只是一組鍵值對。應用程式的組態方式不同,因此我們需要彈性地讓使用者儲存和使用組態資料。在 Pod 中使用 ConfigMap 有三種方式
- 命令列引數
- 環境變數
- 磁碟區中的檔案
這些不同的方法適用於對正在使用的資料進行不同方式的建模。為了盡可能彈性,我們讓 ConfigMap 同時保存細粒度和/或粗粒度的資料。此外,由於應用程式從環境變數和包含組態資料的檔案中讀取組態設定,因此我們建構了 ConfigMap 以支援任一種存取方法。讓我們看一下一個範例 ConfigMap,其中包含兩種組態類型
apiVersion: v1
kind: ConfigMap
metadata:
Name: example-configmap
data:
# property-like keys
game-properties-file-name: game.properties
ui-properties-file-name: ui.properties
# file-like keys
game.properties: |
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAS
secret.code.allowed=true
secret.code.lives=30
ui.properties: |
color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNice
使用過 Secrets 的使用者會發現開始使用 ConfigMap 很容易 — 它們非常相似。這些 API 的一個主要區別在於,Secret 值以位元組陣列儲存,以便支援儲存 SSH 金鑰等二進位檔。在 JSON 和 YAML 中,位元組陣列序列化為 base64 編碼的字串。這表示從序列化形式很難判斷 Secret 的內容是什麼。由於 ConfigMap 旨在僅保存組態資訊而不是二進位檔,因此值以字串形式儲存,因此在序列化形式中是可讀的。
我們希望建立 ConfigMap 像在其中儲存資料一樣靈活。為了建立 ConfigMap 物件,我們新增了一個名為 kubectl create configmap
的 kubectl 命令,它提供三種不同的方式來指定鍵值對
- 指定常值鍵和值
- 指定個別檔案
- 指定目錄以為每個檔案建立鍵
這些不同的選項可以在單一命令中混合、匹配和重複
$ kubectl create configmap my-config \
--from-literal=literal-key=literal-value \
--from-file=ui.properties \
--from=file=path/to/config/dir
使用 ConfigMap 很簡單,並且 Secrets 的使用者也會很熟悉。以下範例 Deployment 使用上述 ConfigMap 來執行虛構的遊戲伺服器
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: configmap-example-deployment
labels:
name: configmap-example-deployment
spec:
replicas: 1
selector:
matchLabels:
name: configmap-example
template:
metadata:
labels:
name: configmap-example
spec:
containers:
- name: game-container
image: imaginarygame
command: ["game-server", "--config-dir=/etc/game/cfg"]
env:
# consume the property-like keys in environment variables
- name: GAME\_PROPERTIES\_NAME
valueFrom:
configMapKeyRef:
name: example-configmap
key: game-properties-file-name
- name: UI\_PROPERTIES\_NAME
valueFrom:
configMapKeyRef:
name: example-configmap
key: ui-properties-file-name
volumeMounts:
- name: config-volume
mountPath: /etc/game
volumes:
# consume the file-like keys of the configmap via volume plugin
- name: config-volume
configMap:
name: example-configmap
items:
- key: ui.properties
path: cfg/ui.properties
- key: game.properties
path: cfg/game.properties
restartPolicy: Never
在上面的範例中,Deployment 透過兩種可用的不同機制使用 ConfigMap 的鍵。ConfigMap 的屬性式鍵用作 Deployment 範本中單一容器的環境變數,而檔案式鍵則填充磁碟區。如需更多詳細資訊,請參閱 ConfigMap 文件。
我們希望這些基本元素易於使用,並期待看到人們使用 ConfigMap 建構什麼。感謝提供有關此功能意見回饋的社群成員。還要特別感謝 Tamer Tas,他為 ConfigMap 的提案和實作做出了巨大貢獻。
如果您對 Kubernetes 和組態感興趣,您會想要參與
- 我們的組態 Slack 頻道
- 我們的 Kubernetes 組態特殊興趣小組 電子郵件列表
- 組態「特殊興趣小組」,每週三太平洋時間上午 10 點 (10h00) 在 SIG-Config hangout 會議
當然,如需有關該專案的更多資訊,請前往 www.kubernetes.io 並在 Twitter 上關注我們 @Kubernetesio。