k8s配置中心實戰-configmap資源
目錄
-
- 0 configmap前置說明
-
-
- 0.1.1 configmap和secret
- 0.1.2 怎麼使用configmap
- 0.1.3 更新configmap配置的方法
-
-
- 1 configmap使用準備
-
-
- 1.1 清理資源
- 1.2 拆分zk叢集
- 1.3 建立dubbo-monitor資源清單
-
-
-
-
- 1.3.1 建立comfigmap清單
- 1.3.2 修改deploy清單内容
-
-
-
-
- 1.4 建立資源并檢查
-
-
-
-
- 1.4.1 應用資源配置清單
- 1.4.2 dashboard檢查建立結果
- 1.4.3 檢查dubbo-monitor頁面的注冊資訊
-
-
-
- 2 更新configmap資源
-
-
- 2.1 多配置更新法
-
-
-
-
- 2.1.1 準備新configmap
- 2.1.2 修改deploy配置
- 2.1.3 更新資源
- 2.1.4 檢查配置是否更新
-
-
-
- 3 挂載方式探讨
-
-
- 3.1 monutPath挂載的問題
- 3.2 單獨挂載檔案示範
-
-
-
-
- 3.2.1 更新配置
- 3.2.2 應用apply配置并驗證
-
-
在K8S中,有兩種方式管理資源的配置,分别是configmap和secret,他們的最大差別是:
- configmap用來管理明文配置
- secret用來管理密文配置
- 建立configmap資源
- 在deploy中定義congfigmap類型的volumes
- 在deoloy的containers中挂載此volumes
單配置更新法:
- 修改configmap資源清單并應用
- 重新開機使用該configmap資源的pod
多配置更換法:
- 準備多個configmap資源
- 修改dp中使用的configmap
- 重新apply該dp,pod會自動重新開機
使用configmap前,需要先做如下準備工作
先将前面部署的3個dubbo服務的POD個數全部調整(scale)為0個,避免在應用configmap過程中可能的報錯,也為了節省資源
直接在dashboard上操作即可,
将3個zk組成的叢集,拆分成獨立的zk單機服務,分别表示測試環境和開發環境(節約資源)
停止3個zk服務
sh /opt/zookeeper/bin/zkServer.sh stop
rm -rf /data/zookeeper/data/*
rm -rf /data/zookeeper/logs/*
注釋掉叢集配置
sed -i 's@^server@#server@g' /opt/zookeeper/conf/zoo.cfg
啟動zk單機
sh /opt/zookeeper/bin/zkServer.sh start
sh /opt/zookeeper/bin/zkServer.sh status
老規矩,資源清單在
7.200
運維機上統一操作
cd /data/k8s-yaml/dubbo-monitor
cat >cm.yaml <<'EOF'
apiVersion: v1
kind: ConfigMap
metadata:
name: dubbo-monitor-cm
namespace: infra
data:
dubbo.properties: |
dubbo.container=log4j,spring,registry,jetty
dubbo.application.name=simple-monitor
dubbo.application.owner=zqkj
dubbo.registry.address=zookeeper://zk1.zq.com:2181
dubbo.protocol.port=20880
dubbo.jetty.port=8080
dubbo.jetty.directory=/dubbo-monitor-simple/monitor
dubbo.charts.directory=/dubbo-monitor-simple/charts
dubbo.statistics.directory=/dubbo-monitor-simple/statistics
dubbo.log4j.file=/dubbo-monitor-simple/logs/dubbo-monitor.log
dubbo.log4j.level=WARN
EOF
其實就是把dubbo-monitor配置檔案中的内容用configmap文法展示出來了
當然最前面加上了相應的中繼資料資訊
如果轉換不來格式,也可以使用指令行工具直接将配置檔案轉換為configmap
kubectl create configmap <map-name> <data-source>
# <map-name> 是希望建立的ConfigMap的名稱,<data-source>是一個目錄、檔案和具體值。
案例如下:
# 1.通過單個檔案建立ConfigMap
kubectl create configmap game-config-1 --from-file=/xxx/xxx.properties
# 2.通過多個檔案建立ConfigMap
kubectl create configmap game-config-2 \
--from-file=/xxx/xxx.properties \
--from-file=/xxx/www.properties
# 3.通過在一個目錄下的多個檔案建立ConfigMap
kubectl create configmap game-config-3 --from-file=/xxx/www/
為了和原來的
dp.yaml
對比,我們建立一個
dp-cm.yaml
cat >dp-cm.yaml <<'EOF'
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: dubbo-monitor
namespace: infra
labels:
name: dubbo-monitor
spec:
replicas: 1
selector:
matchLabels:
name: dubbo-monitor
template:
metadata:
labels:
app: dubbo-monitor
name: dubbo-monitor
spec:
containers:
- name: dubbo-monitor
image: harbor.zq.com/infra/dubbo-monitor:latest
ports:
- containerPort: 8080
protocol: TCP
- containerPort: 20880
protocol: TCP
imagePullPolicy: IfNotPresent
#----------------start---------------------------
volumeMounts:
- name: configmap-volume
mountPath: /dubbo-monitor-simple/conf
volumes:
- name: configmap-volume
configMap:
name: dubbo-monitor-cm
#----------------end-----------------------------
imagePullSecrets:
- name: harbor
restartPolicy: Always
terminationGracePeriodSeconds: 30
securityContext:
runAsUser: 0
schedulerName: default-scheduler
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
revisionHistoryLimit: 7
progressDeadlineSeconds: 600
EOF
注釋中的内容就是新增在原
dp.yaml
中增加的内容,解釋如下:
- 申明一個卷,卷名為
configmap-volume
- 指定這個卷使用名為
的configMapdubbo-monitor-cm
- 在
中挂載卷,卷名與申明的卷相同containers
- 用
的方式挂載到指定目錄mountPath
kubectl apply -f http://k8s-yaml.zq.com/dubbo-monitor/cm.yaml
kubectl apply -f http://k8s-yaml.zq.com/dubbo-monitor/dp-cm.yaml
在dashboard中檢視
infra
名稱空間中的
configmap
資源
然後檢查容器中的配置
kubectl -n infra exec -it dubbo-monitor-5b7cdddbc5-xpft6 bash
# 容器内
bash-4.3# cat /dubbo-monitor-simple/conf/dubbo.properties
dubbo.container=log4j,spring,registry,jetty
dubbo.application.name=simple-monitor
dubbo.application.owner=zqkj
dubbo.registry.address=zookeeper://zk1.zq.com:2181
....
再準備一個configmap叫
cm-pro.yaml
cp cm.yaml cm-pro.yaml
# 把資源名字改成dubbo-monitor-cm-pro
sed -i 's#dubbo-monitor-cm#dubbo-monitor-cm-pro#g' cm-pro.yaml
# 把服務注冊到zk2.zq.com上
sed -i 's#zk1#zk2#g' cm-pro.yaml
sed -i 's#dubbo-monitor-cm#dubbo-monitor-cm-pro#g' dp-cm.yaml
# 應用新configmap
kubectl apply -f http://k8s-yaml.zq.com/dubbo-monitor/cm-pro.yaml
# 更新deploy
kubectl apply -f http://k8s-yaml.zq.com/dubbo-monitor/dp-cm.yaml
新的pod已經起來了
~]# kubectl -n infra get pod
NAME READY STATUS RESTARTS AGE
dubbo-monitor-c7fbf68b9-7nffj 1/1 Running 0 52s
進去看看是不是應用的新的configmap配置:
kubectl -n infra exec -it dubbo-monitor-5cb756cc6c-xtnrt bash
# 容器内
bash-4.3# cat /dubbo-monitor-simple/conf/dubbo.properties |grep zook
dubbo.registry.address=zookeeper://zk2.zq.com:2181
看下dubbo-monitor的頁面:已經是zk2了。
我們使用的是mountPath,這個是挂載整個目錄,會使容器内的被挂載目錄中原有的檔案不可見,可以看見我們。
檢視我們pod容器啟動的指令可以看見原來腳本中的指令已經無法對挂載的目錄操作了
如何單獨挂載一個配置檔案:
隻挂載單獨一個檔案而不是整個目錄,需要添加
subPath
方法
dp-cm.yaml
的配置中,将原來的volume配置做一下更改
#----------------start---------------------------
volumeMounts:
- name: configmap-volume
mountPath: /dubbo-monitor-simple/conf
volumes:
- name: configmap-volume
configMap:
name: dubbo-monitor-cm
#----------------end-----------------------------
# 調整為
#----------------start---------------------------
volumeMounts:
- name: configmap-volume
mountPath: /dubbo-monitor-simple/conf
- name: configmap-volume
mountPath: /var/dubbo.properties
subPath: dubbo.properties
volumes:
- name: configmap-volume
configMap:
name: dubbo-monitor-cm
#----------------end-----------------------------
kubectl apply -f http://k8s-yaml.zq.com/dubbo-monitor/dp-cm.yaml
kubectl -n infra exec -it dubbo-monitor-5cb756cc6c-xtnrt bash
# 容器内操作
bash-4.3# ls -l /var/
total 4
drwxr-xr-x 1 root root 29 Apr 13 2016 cache
-rw-r--r-- 1 root root 459 May 10 10:02 dubbo.properties
drwxr-xr-x 2 root root 6 Apr 1 2016 empty
.....