🎭 有關程式的配置參數,可以透過環境變數傳入,和邏輯相關的程式分離,提高管理的彈性及安全性,K8s的物件亦可設置環境變數,但是當多個檔案需管理時就會不好處理,為了方便管理,設計了統一管理參數的物件,將有關環境的參數從container image或是定義檔中提取出來,供其他物件使用,資料為 key/value形式,讓程式更具有可攜性,分有管理一般的參數物件ConfigMap
及機密性的參數物件Secret
,步驟為建立參數物件,再來將這些參數注入到物件
從environment欄位檢視環境變數
這些參數物件沒有spec欄位,內容為
data
或stringData
欄位
基本參數物件,其配置欄位有data(UTF-8字串)或binaryData(base64編碼字串),兩者的key不可重複,只能包含英文字母及標點符號-
、_
、.
# 取自官網文件
apiVersion: v1
kind: ConfigMap
metadata:
name: game-demo
data:
# 屬性類型的key: 單一key/value 對
player_initial_lives: "3"
ui_properties_file_name: "user-interface.properties"
# 檔案類型的keys
game.properties: |
enemy.types=aliens,monsters
player.maximum-lives=5
user-interface.properties: |
color.good=purple
color.bad=yellow
allow.textmode=true
ConfigMap操作指令
# 查詢configmaps
kubectl get configmaps
kubectl get cm
kubectl describe configmaps <名稱>
# 建立configmap
kubectl create configmap <config-name> --from-literal=<key>=<value>
kubectl create configmap <config-name> --from-file=<path-to-file 如: app_config.properties>
kubectl create -f <檔案名稱>
apiVersion:
kind: Pod
metadata:
name: myapp-pod
spec:
priorityClassName: high-priority
containers:
- name: nginx-container
image: nginx
# 1. 各別指定環境變數
env:
- name: APP_COLOR
# 1-1. 直接寫入
value: pink
# 1-2. 從configMap提取
valueFrom:
configMapKeyRef:
name: app-config
key: APP_COLOR
# 2. 環境變數來自這整個configMap (List)
envFrom:
- configMapRef:
name: app-config
# 3. 放到volume (之後會說到, 儲存區)
volumeMounts:
- name: app-config-volume
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: app-config-volume
configMap:
name: app-config
和ConfigMap
用途相同,差別在於Secret
屬機密性(credential, sensitive)參數,像是密碼、token或key,需注意Secrets僅有編碼,並且預設存在etcd是未經加密,有權限的人都可以取得或修改secret,另外若有權限建立pod, deployment,都可以存取secret,可以進一步設定存取身分、啟用API data加密或考慮使用外部Secrect管理
Secret的類型 (列舉部份)
若要自定義類型,要在type欄位填上非空字串,空字串亦視為opaque
Built-in Type | Usage | 說明 |
---|---|---|
Opaque (不透明的) | 使用者定義的任意資料 | 下指令時,類型名稱為generic |
kubernetes.io/service-account-token | ServiceAccount token | 舊機制,新版建議(1.22+)使用短時效的TokenRequest |
kubernetes.io/basic-auth | 基礎驗證的credentials | data必須包含2個key: username及password(base64編碼),或是改用stringData欄位原文寫入,這些資料可以用Opaque建立,不過定義此類型更有語意並且包含基礎需求限制 |
kubernetes.io/ssh-auth | SSH驗證的credentials | data(或stringData)必須包含key: ssh-privatekey,也是可用Opaque建立 |
kubernetes.io/tls | 給TLS client or server的資料 | certificate和相關的key,data(或stringData)必須包含tls.key和tls.crt |
echo -n <字串內容> | base64
echo -n <字串內容> | base64 -decode 或 -d
.
,一般匯出ls -l
時隱藏,需使用ls -la
才看的到apiVersion: v1
kind: Secret
metadata:
name: app-secret
type: generic # 預設
data:
.secret-file: dmFsdWUtMg0KDQo=
DB_Host: c3FsMDE=
DB_User: cm9vdA==
DB_Password: Z29vZGdvb2RkZXI=
# 查詢secret
kubectl get secrets
kubectl describe secrets
# 輸出才可看到完整的secrect
kubectl get secrets <secrect_name> -o yaml
# 建立secret, 明文輸入即可, 會自動轉換編碼
kubectl create secret generic db-secret --from-literal=<key1>=<value1> --from-literal=<key2>=<value2> --from-literal=DB_Password=<key3>=<value3>
kubectl create -f <檔案名稱>
apiVersion:
kind: Pod
metadata:
name: myapp-pod
spec:
priorityClassName: high-priority
containers:
- name: nginx-container
image: nginx
# 1. 從secret提取
env:
- name: DB_Host
valueFrom:
secretKeyRef:
name: app-secret
key: DB_Host
# 2. 環境變數來自這整個secret (List)
envFrom:
- secretRef:
name: app-secret
# 3. 放到volumn (之後會說到, 儲存區)
volumeMounts:
- name: app-secret-volume
mountPath: "/etc/foo"
volumes:
- name: app-secret-volume
secret:
secretName: app-secret # 每個屬性在container各建立一個檔案
optional: true # 預設為必須取到secret,若取不到將導致pod無法啟動
不同查詢secret指令的顯示內容