兩種方法輕鬆上手 ConfigMap,用作容器雲服務的配置中心

點擊上方藍色“大數據實戰演練”,選擇“設爲星標”或“置頂”

回覆“資源”領取獨家整理的學習資料!




每一個成功人士的背後,必定曾經做出過勇敢而又孤獨的決定。

放棄不難,但堅持很酷~

k8s:v1.13.5

一、背景

將 spring boot 項目部署在 k8s 上,需要打鏡像,爲了實現配置文件可配置,就需要將配置文件與鏡像解耦。

之前我們都是使用的 k8s 部署的 spring cloud configserver 組件來當作 spring boot 項目的配置中心。在項目中引入 spring-cloud-starter-config 依賴,配置上 configserver 的內部域名即可。

但有一個痛點就是:configserver 不穩定,有時候會造成其他 pod 應用重啓,所以想使用別的方案,那就是 k8s 中的 configMap 。

二、K8s ConfigMap

ConfigMap 顧名思義,是用於保存配置數據的鍵值對,可以用來保存單個屬性,也可以保存配置文件。

如下述代碼所示,metadata.name 爲 configMap 的名稱,namespace 爲作用域,需要與用到的 pod 作用域保持一致,否則 pod 會因爲找不到 configMap 起不來。

以下是一個 configMap 的內容,data 裏面有兩項,一個是 TENANTID ,一個是 application-test.yml 內容。後續會將它們配置在 deploy 裏面,讓其在 pod 運行時生效。

kind: ConfigMap
apiVersion: v1
metadata:
  name: spring-boot-demo-configmap
  namespace: public
  labels:
    app: spring-boot-demo-app
data:
  TENANTID: "0000"
  application-test.yml: |-
    spring:
      application:
        name: spring-boot-demo

說說 k8s configmap 的相關命令:

# 創建 configmap,yaml 文件內容爲標題二所示:
kubectl apply -f spring-boot-demo-configmap.yaml

#
 獲取指定作用域下的 configmap 列表
kubectl get configmaps -n public

#
 編輯 configmap
kubectl edit configmap -n public spring-boot-demo-configmap

#
 刪除 configmap
kubectl delete configmap -n public spring-boot-demo-configmap

三、將 ConfigMap 的某些數據掛載爲文件

我想讓 pod 容器中的 spring boot 項目讀取上面 configmap 中 application-test.yml 的內容,這個應該怎麼操作呢?

基於以上,將 configMap 創建好之後,我們可以選擇將 application-test.yml 的內容掛載到 pod 中,讓 spring boot 項目可讀,這樣就實現了我們的目的。

在一般情況下,使用 configmap 掛載文件時,會先覆蓋掉掛載目錄,然後再將 congfigmap 中的內容作爲文件掛載進行。如果不想對原來的文件夾下的文件造成覆蓋,只是將 configmap 中的每個 key,按照文件的方式掛載到目錄下,可以使用 mountPath + subpath 參數。

以下是 deployment 裏面的部分代碼:

spec:
  template:
    spec:
      volumes:
        - name: conf
          configMap:
            name: spring-boot-demo-configmap  # 指定要使用的configmap名稱
      containers:
        - name: spring-boot-demo-app
          volumeMounts:
            - name: conf   # 與上面的volumes.name保持一致
              mountPath: /spring-boot-demo/conf/application-test.yml
              subPath: application-test.yml
              readOnly: true

當 subPath 配合 mountPath 使用時,application-test.yml 爲文件名,即 pod 容器中只生成了 /spring-boot-demo/conf/ 目錄,目錄之下爲文件,會掛載出一個名爲 application-test.yml 的文件(subPath 篩選只掛載 application-test.yml 文件),設置 readOnly 爲 true ,表示只讀。

四、將 ConfigMap 的某些數據配置成環境變量

針對多租戶等場景,我們可能就需要用到環境變量了。那麼如何將 ConfigMap 的某些數據配置成環境變量呢?

以下是 deployment 裏面的部分代碼:

spec:
  template:
    spec:
      volumes:
        - name: conf
          configMap:
            name: spring-boot-demo-configmap  # 指定要使用的configmap名稱
      containers:
        - name: spring-boot-demo-app
          env:
              - name: TENANT   # 傳入pod中的變量名
              valueFrom:
                configMapKeyRef:
                  name: data-center-management-configmap
                  key: TENANTID  # configmap中的key

通過 valueFrom.configMapKeyRef 可以指定使用哪個 configmap 的 哪個 key 來當做環境變量傳入 pod 容器中,這樣,spring boot 項目可以直接通過 ${TENANT} 使用。

五、小結

本文介紹了兩種使用 configMap 的方法:

  • 將 configMap 作爲一種環境變量

  • 將 configMap 掛載爲文件

按照這樣總結下來,configMap 還挺好用。相對來說,k8s 的 configMap 要比 k8s 部署的 spring cloud configserver 穩定得多。configMap 可以直接將配置內容掛載成文件到你的 pod 容器中,供 spring boot 項目加載使用。

但也有不方便的地方,那就是沒有實現熱加載。即:如果修改 configMap 後,需要重啓服務纔會使新配置生效。不過在生產環境上也沒事,我們可以將服務調整爲雙副本嘛。

如果各位小夥伴們,也正在挑選容器雲服務的配置中心的話,不妨試試 k8s 的 configmap,或者有更好的方案,也可以在評論中和我們分享一下。



有什麼想法你就說

👆 👆 👆


往期推薦

(內部資料)Ambari 自定義服務第八講:添加自定義告警

天吶,你生產環境中的密碼還在裸奔嗎?

入羣指南(大數據實戰演練羣分佈情況)

如何優雅地使用 java 連接 HBase 客戶端


掃一掃,我們的故事就開始了。

如果這篇文章對你有所啓發,點贊、轉發都是一種支持!

另外公衆號改變了推送規則,大家看文章不要忘記點擊最下方的在看,點贊按鈕,這樣微信自動識別爲常看公衆號,否則很可能推送的文章可能淹沒在別的文章找不到,謝謝大家

讓我知道你在看

本文分享自微信公衆號 - 大數據實戰演練(gh_f942bfc92d26)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章