Kubernetes——存儲之ConfigMap

一、描述信息

ConfigMap 功能在 Kubernetes1.2 版本中引入仁热,許多應(yīng)用程序會從配置文件榜揖、命令行參數(shù)或環(huán)境變量中讀取配置信息。ConfigMap API 給我們提供了向容器中注入配置信息的機制,ConfigMap 可以被用來保存單個屬性举哟,也可以用來保存整個配置文件或者 JSON 二進制大對象

應(yīng)用場景:鏡像往往是一個應(yīng)用的基礎(chǔ)思劳,還有很多需要自定義的參數(shù)或配置,例如資源的消耗妨猩、日志的級別等等潜叛,這些配置可能會有很多,因此不能放入鏡像中册赛,Kubernetes中提供了Configmap來實現(xiàn)向容器中提供配置文件或環(huán)境變量來實現(xiàn)不同配置钠导,從而實現(xiàn)了鏡像配置與鏡像本身解耦,使容器應(yīng)用做到不依賴于環(huán)境配置森瘪。

二牡属、什么是ConfigMap

利用ConfigMap可以解耦部署與配置的關(guān)系,對于同一個應(yīng)用部署文件扼睬,可以利用valueFrom字段引用一個在測試環(huán)境和生產(chǎn)環(huán)境都有的ConfigMap(當然配置內(nèi)容不相同逮栅,只是名字相同),就可以降低環(huán)境管理和部署的復(fù)雜度窗宇。


ConfigMap有三種用法:

  • 生成為容器內(nèi)的環(huán)境變量
  • 設(shè)置容器啟動命令的參數(shù)
  • 掛載為容器內(nèi)部的文件或目錄

ConfigMap的缺點

  • ConfigMap必須在Pod之前創(chuàng)建
  • ConfigMap屬于某個NameSpace措伐,只有處于相同NameSpace的Pod才可以應(yīng)用它
  • ConfigMap中的配額管理還未實現(xiàn)
  • 如果是volume的形式掛載到容器內(nèi)部,只能掛載到某個目錄下军俊,該目錄下原有的文件會被覆蓋掉
  • 靜態(tài)Pod不能用ConfigMap

ConfigMap 的創(chuàng)建

1侥加、使用目錄創(chuàng)建

$ ls docs/user-guide/configmap/kubectl/
game.properties
ui.properties

$ cat docs/user-guide/configmap/kubectl/game.properties
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAS
secret.code.allowed=true
secret.code.lives=30

$ cat docs/user-guide/configmap/kubectl/ui.properties
color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNice

$ kubectl create configmap game-config --from-file=docs/user-guide/configmap/kubectl

game-config :configmap的名稱
--from-file:指定一個目錄,目錄下的所有內(nèi)容都會被創(chuàng)建出來粪躬。以鍵值對的形式
—from-file指定在目錄下的所有文件都會被用在 ConfigMap 里面創(chuàng)建一個鍵值對担败,鍵的名字就是文件名,值就是文件的內(nèi)容

kubectl get cm 查看configmap文件
kubectl get cm game-config -o yaml   查看詳細信息
kubectl describe cm

2镰官、使用文件創(chuàng)建
只要指定為一個文件就可以從單個文件中創(chuàng)建 ConfigMap

$ kubectl create configmap game-config-2 --from-file=docs/user-guide/configmap/kubectl/game.properties

$ kubectlget configmaps game-config-2 -o yaml

—from-file這個參數(shù)可以使用多次提前,你可以使用兩次分別指定上個實例中的那兩個配置文件,效果就跟指定整個目錄是一樣的

2泳唠、使用字面值創(chuàng)建
使用文字值創(chuàng)建狈网,利用—from-literal參數(shù)傳遞配置信息,該參數(shù)可以使用多次笨腥,格式如下

$ kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm

$ kubectlget configmaps special-config -o yaml    #查看

--from-literal=special.how=very
指定鍵名為special.how 鍵值為very

三拓哺、Pod 中使用 ConfigMap

1、使用 ConfigMap 來替代環(huán)境變量

apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config
  namespace: default
data:
  special.how: very
  special.type: charm

#special.how: very   鍵名:鍵值
apiVersion: v1
kind: ConfigMap
metadata:
  name: env-config
  namespace: default
data:
  log_level: INFO
#將兩個ConfigMap文件注入到pod環(huán)境中
apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: hub.atguigu.com/library/myapp:v1
      command: ["/bin/sh","-c","env"]
      env:                           #第一種導入方案
        - name: SPECIAL_LEVEL_KEY
          valueFrom:
            configMapKeyRef:
              name: special-config    #從那個configMap文件導入
              key: special.how       #導入的是那個鍵的鍵名脖母,就是將special.how鍵的鍵值賦予
        - name: SPECIAL_TYPE_KEY
          valueFrom:
           configMapKeyRef:
             name: special-config
             key: special.type
           envFrom:                   #第二種導入方案
             - configMapRef: 
               name: env-config
  restartPolicy: Never

2士鸥、用 ConfigMap 設(shè)置命令行參數(shù)

apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config
  namespace: default
data:
  special.how: very
  special.type: charm
apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: hub.atguigu.com/library/myapp:v1
      command: ["/bin/sh","-c","echo $(SPECIAL_LEVEL_KEY) $(SPECIAL_TYPE_KEY)"]
      env:
        - name: SPECIAL_LEVEL_KEY
          valueFrom:
            configMapKeyRef:
              name: special-config
              key: special.how
        - name: SPECIAL_TYPE_KEY
          valueFrom:
            configMapKeyRef:
              name: special-config
              key: special.type
  restartPolicy: Never

3、通過數(shù)據(jù)卷插件使用ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config
  namespace: default
data:
  special.how: very
  special.type: charm

在數(shù)據(jù)卷里面使用這個 ConfigMap镶奉,有不同的選項础淤。最基本的就是將文件填入數(shù)據(jù)卷,在這個文件中哨苛,鍵就是文件名鸽凶,鍵值就是文件內(nèi)容

apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: hub.atguigu.com/library/myapp:v1
      command: ["/bin/sh","-c","cat /etc/config/special.how"]
      volumeMounts:                      #容器下進行volum掛載
        - name: config-volume                #掛載的名稱為config-volume,與下邊相呼應(yīng)
          mountPath: /etc/config
  volumes:
    - name: config-volume      #名稱為config-volume
      configMap:              #從configMap導入
        name: special-config     #導入的configMap名稱
  restartPolicy: Never

四建峭、ConfigMap 的熱更新

#創(chuàng)建一個configMap
apiVersion: v1
kind: ConfigMap
metadata:
  name: log-config
  namespace: default
data:
  log_level: INFO

---
#創(chuàng)建Deployment對configMap進行調(diào)用玻侥,調(diào)用的方式是以volum方式進行掛載
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: my-nginx
spec:
  replicas: 1
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
      - name: my-nginx
        image: hub.atguigu.com/library/myapp:v1
        ports:
        - containerPort: 80
        volumeMounts:
        - name: config-volume
          mountPath: /etc/config
      volumes:
      - name: config-volume
        configMap:
           name: log-config
$ kubectl exec `kubectl get pods -l run=my-nginx -o=name|cut -d "/" -f2`cat/etc/config/log_level
INFO

修改 ConfigMap

$ kubectl edit configmap log-config

修改log_level的值為DEBUG等待大概 10 秒鐘時間,再次查看環(huán)境變量的值

$ kubectl exec `kubectl get pods -l run=my-nginx -o=name|cut -d "/" -f2`cat /tmp/log_levelDEBUG

ConfigMap 更新后滾動更新 Pod
更新 ConfigMap 目前并不會觸發(fā)相關(guān) Pod 的滾動更新亿蒸,可以通過修改 pod annotations 的方式強制觸發(fā)滾動更新

$ kubectl patch deployment my-nginx --patch'{"spec": {"template": {"metadata": {"annotations":{"version/config": "20190411" }}}}}'

這個例子里我們在.spec.template.metadata.annotations中添加version/config凑兰,每次通過修改version/config來觸發(fā)滾動更新

更新 ConfigMap 后:

  • 使用該 ConfigMap 掛載的 Env 不會同步更新
  • 使用該 ConfigMap 掛載的 Volume 中的數(shù)據(jù)需要一段時間(實測大概10秒)才能同步更新

ENV 是在容器啟動的時候注入的,啟動之后 kubernetes 就不會再改變環(huán)境變量的值边锁,且同一個 namespace 中的 pod 的環(huán)境變量是不斷累加的姑食,參考 Kubernetes中的服務(wù)發(fā)現(xiàn)與docker容器間的環(huán)境變量傳遞源碼探究。為了更新容器中使用 ConfigMap 掛載的配置茅坛,可以通過滾動更新 pod 的方式來強制重新掛載 ConfigMap音半,也可以在更新了 ConfigMap 后,先將副本數(shù)設(shè)置為 0贡蓖,然后再擴容曹鸠。

Configmap的更新

$ kubectl edit configmap <map-name>

confgimap更新后,如果是以文件夾方式掛載的斥铺,會自動將掛載的Volume更新彻桃。如果是以文件形式掛載的,則不會自動更新晾蜘。
但是對多數(shù)情況的應(yīng)用來說邻眷,配置文件更新后,最簡單的辦法就是重啟Pod(殺掉再重新拉起)笙纤。如果是以文件夾形式掛載的耗溜,可以通過在容器內(nèi)重啟應(yīng)用的方式實現(xiàn)配置文件更新生效。即便是重啟容器內(nèi)的應(yīng)用省容,也要注意configmap的更新和容器內(nèi)掛載文件的更新不是同步的抖拴,可能會有延時,因此一定要確保容器內(nèi)的配置也已經(jīng)更新為最新版本后再重新加載應(yīng)用腥椒。

參考:
https://www.cnblogs.com/LiuQizhong/p/11599467.html

https://www.cnblogs.com/xiangsikai/p/11424321.html

https://www.cnblogs.com/cocowool/p/kubernetes_configmap_secret.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末阿宅,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子笼蛛,更是在濱河造成了極大的恐慌洒放,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件滨砍,死亡現(xiàn)場離奇詭異往湿,居然都是意外死亡妖异,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門领追,熙熙樓的掌柜王于貴愁眉苦臉地迎上來他膳,“玉大人,你說我怎么就攤上這事绒窑∽厮铮” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵些膨,是天一觀的道長蟀俊。 經(jīng)常有香客問我,道長订雾,這世上最難降的妖魔是什么肢预? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮洼哎,結(jié)果婚禮上误甚,老公的妹妹穿的比我還像新娘。我一直安慰自己谱净,他們只是感情好窑邦,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著壕探,像睡著了一般冈钦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上李请,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天瞧筛,我揣著相機與錄音,去河邊找鬼导盅。 笑死较幌,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的白翻。 我是一名探鬼主播乍炉,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼滤馍!你這毒婦竟也來了岛琼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤巢株,失蹤者是張志新(化名)和其女友劉穎槐瑞,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體阁苞,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡困檩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年祠挫,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片悼沿。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡茸歧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出显沈,到底是詐尸還是另有隱情,我是刑警寧澤逢唤,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布拉讯,位于F島的核電站,受9級特大地震影響鳖藕,放射性物質(zhì)發(fā)生泄漏魔慷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一著恩、第九天 我趴在偏房一處隱蔽的房頂上張望院尔。 院中可真熱鬧,春花似錦喉誊、人聲如沸邀摆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽栋盹。三九已至,卻和暖如春敷矫,著一層夾襖步出監(jiān)牢的瞬間例获,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工曹仗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留榨汤,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓怎茫,卻偏偏與公主長得像收壕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子轨蛤,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容