[Kubernetes / K8s] ConfigMap 用於讓不同的微服務共享配置| Configure a Pod to Use a ConfigMap
ConfigMap是K8s中配置管理抽象,用於讓不同的微服務共享配置
Q:當我們有三個服務都需要跟mysql連接所以都要配置連接的配置,
在文件中就會造成冗余與維護問題.
A: 把配置都定義在ConfigMap ,發佈時k8s會把ConfigMap注入服務中
我們不把環境配置寫在各個發布文件中
而是集中起來寫在ConfigMap.yaml內,讓K8s替我們去配置
開始動手寫第一個ConfigMap
我們這邊範例一樣使用之前的Petclient應用
可參考K8s 官方ConfigMap發布樣例寫自己的Config
apiVersion: v1
kind: ConfigMap
metadata:
name: petclinic-config #這邊的name很重要提供其他文件configMapRef的名稱
data:
SPRING_PROFILES_ACTIVE: mysql
DATASOURCE_URL: jdbc:mysql://mysql/petclinic
DATASOURCE_USERNAME: root
DATASOURCE_PASSWORD: petclinic
DATASOURCE_INIT_MODE: always
TEST_CONFIG: test_config_v1
TEST_CONFIG 是等等測試用
比較Env vs ConfigMap
這邊為之前配置在文件env跟ConfigMap比較
創建ConfigMap完成創建petclinic 服務跟 mysql服務
同時我們創建petclinic-svc.yaml 文件可以參考之前Service文章的內容
將Deployment跟 Service 合併寫在petclinic-svc.yaml ,my sql亦同 只是要注意
env 要改為 envFrom 因為我們要使用configMap
全部發布
kubectl apply -f .
查看是否啟動成功
kubectl get all
驗證是否是由ConfigMap 配置
驗證ConfigMap 我們打印出pod內的環境
kubectl exec petclinic-8647c8dc46-fxltj printenv
接著我們要做更改Config的測試
首先打
kubectl exec petclinic-8647c8dc46-fxltj printenv | grep TEST_CONFIG
查看目前TEST_CONFIG 版本
Config配置變更
我們希望配置變更後pod能直接應用變更做個實驗看看
apiVersion: v1kind: ConfigMapmetadata:name: petclinic-configdata:SPRING_PROFILES_ACTIVE: mysqlDATASOURCE_URL: jdbc:mysql://mysql/petclinicDATASOURCE_USERNAME: rootDATASOURCE_PASSWORD: petclinicDATASOURCE_INIT_MODE: alwaysTEST_CONFIG: test_config_v2 #改為v2
我們將TEST_CONFIG改為v2
接著我們apply 看看
那查查看
還是一樣是舊的Pod版本 test_config_v1
那如何讓Pod更新
方法1 -簡單粗暴 直接刪掉pod 讓 replicatset重啟pod ,Self healing更新pod
實驗刪除pod在觸發SelfHealing 生出新的pod
方法2-優雅作法 更新configMap的name ,並時要記得更新service內的參考
在ConfigMap內我們更改name為petclinic-configv2
apiVersion: v1
kind: ConfigMap
metadata:
name: petclinic-configv2
data:
SPRING_PROFILES_ACTIVE: mysql
DATASOURCE_URL: jdbc:mysql://mysql/petclinic
DATASOURCE_USERNAME: root
DATASOURCE_PASSWORD: petclinic
DATASOURCE_INIT_MODE: always
TEST_CONFIG: test_configv2 #更改為v2
同時更改service內的參考
apiVersion: apps/v1
kind: Deployment
metadata:
name: petclinic
spec:
replicas: 1
minReadySeconds: 10 #表示Port起來要等10秒 有延遲方便查看效果
selector:
matchLabels:
app: petclinic #標籤要和template label裡面一樣
template:
metadata:
labels:
app: petclinic
spec:
containers:
- name: petclinic
image: spring2go/spring-petclinic:1.0.0.RELEASE
envFrom:
- configMapRef:
name: petclinic-configv2 #更改為v2
---
apiVersion: v1
kind: Service
metadata:
name: petclinic
spec:
ports:
- name: http
port: 8080
targetPort: 8080
nodePort: 31080
selector:
app: petclinic
type: NodePort
發布文件
kubectl apply -f .
可以看到產生新的replicatset 並且觸發了Deployment的滾動發布
準備刪掉舊的pod產生新的pod
可以看到舊的 (pod:petclinic-8647c8dc46) → pod:petclinic-6b98f6986
Sum up
What’s ConfigMap?
A: 用於讓不同的微服務共享配置
How to Use?
A: apiVersion: v1 kind: ConfigMap
Why we use?
A: 解決服務間環境配置冗余與維護問題
ConfigMap 可以綁定到Pod Env 並且配置更新
● 需要重新啟動Pod 獲取新更新
● 建議更新Config name和引用
ConfigMap可以綁定在Pod 的Volumes
採用這種形式不需要重啟Pod , 就可以配置新的