[Kubernetes / K8s] ConfigMap 用於讓不同的微服務共享配置| Configure a Pod to Use a ConfigMap

KouWei.Lee
k8s筆記
Published in
8 min readFeb 19, 2021

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

總文件 petclinic-svc.yaml,mysql-svc.yaml,petclinic-config.yaml

全部發布

kubectl apply -f .

查看是否啟動成功

kubectl get all

驗證是否是由ConfigMap 配置

驗證ConfigMap 我們打印出pod內的環境

kubectl exec petclinic-8647c8dc46-fxltj printenv
可以看到如同ConfigMap內的參數

接著我們要做更改Config的測試

首先打

kubectl exec petclinic-8647c8dc46-fxltj printenv | grep TEST_CONFIG

查看目前TEST_CONFIG 版本

可以看到目前是test_config_v1

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 看看

可以看到configmap已經configured

那查查看

還是一樣是舊的Pod版本 test_config_v1

那如何讓Pod更新

方法1 -簡單粗暴 直接刪掉pod 讓 replicatset重啟pod ,Self healing更新pod

先取得所有的pod

實驗刪除pod在觸發SelfHealing 生出新的pod

刪除
可以看到新的pod-petclinic-8647c8dc46-dstrs 版本已更新成v2

方法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 , 就可以配置新的

--

--