最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Kubernetes k8s configmap 容器技術(shù)解析

 更新時(shí)間:2022年08月26日 14:57:22   作者:熄燈勿語  
這篇文章主要為大家介紹了k8s configmap 容器技術(shù)解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

1、什么是 ConfigMap?

ConfigMap 是用來存儲(chǔ)配置文件的 Kubernetes 資源對象,配置對象存儲(chǔ)在 Etcd 中,配置的形式可以是完整的配置文件、key/value 等形式。

2、ConfigMap 能帶來什么好處?

傳統(tǒng)的應(yīng)用服務(wù),每個(gè)服務(wù)都有自己的配置文件,各自配置文件存儲(chǔ)在服務(wù)所在節(jié)點(diǎn),對于單體應(yīng)用,這種存儲(chǔ)沒有任何問題,但是隨著用戶數(shù)量的激增,一個(gè)節(jié)點(diǎn)不能滿足線上用戶使用,故服務(wù)可能從一個(gè)節(jié)點(diǎn)擴(kuò)展到十個(gè)節(jié)點(diǎn),這就導(dǎo)致,如果有一個(gè)配置出現(xiàn)變更,就需要對應(yīng)修改十次配置文件。

這種人肉處理,顯然不能滿足線上部署要求,故引入了各種類似于 ZooKeeper 中間件實(shí)現(xiàn)的配置中心,但配置中心屬于 “侵入式” 設(shè)計(jì),需要修改引入第三方類庫,它要求每個(gè)業(yè)務(wù)都調(diào)用特定的配置接口,破壞了系統(tǒng)本身的完整性,而Kubernetes 利用了 Volume 功能,完整設(shè)計(jì)了一套配置中心,其核心對象就是ConfigMap,使用過程不用修改任何原有設(shè)計(jì),即可無縫對 ConfigMap;為什么呢?

如圖(1)所示,

  • ConfigMap 相當(dāng)于放入原生應(yīng)用的配置文件,可以是一個(gè)或者多個(gè);
  • 容器啟動(dòng)之后,到宿主機(jī)中拉取 ConfigMap 的內(nèi)容,生成本地文件,通過 volume 形式映射到容器內(nèi)部指定目錄上;
  • 容器中應(yīng)用程序按照原有方式讀取容器特定目錄上的配置文件。

在容器看來,配置文件就像是打包在容器內(nèi)部特定目錄,整個(gè)過程對應(yīng)用沒有任何侵入。

3、ConfigMap 三種創(chuàng)建方式

  • 指定字面量進(jìn)行創(chuàng)建,創(chuàng)建命令如下所示:
kubectl create configmap configmaptest --from-literal=foo=bar --from-literal=one=two

創(chuàng)建完成后通過如下方式查看:

[root@k8s-master k8s]# kubectl get configmap configmaptest -o yaml
apiVersion: v1
data:
  foo: bar
  one: two
kind: ConfigMap
metadata:
  creationTimestamp: "2020-04-14T13:53:42Z"
  name: configmaptest
  namespace: default
  resourceVersion: "613402"
  selfLink: /api/v1/namespaces/default/configmaps/configmaptest
  uid: 59b91eb4-7e57-11ea-83c7-509a4c36e19d
  • 指定特定文件進(jìn)行創(chuàng)建
kubectl create configmap config-files --from-file=/home/conf/db.properties

可以通過如下方式進(jìn)行查看,(內(nèi)容過長,影響閱讀,省略 ConfigMap 元信息。)

[root@k8s-master k8s]# kubectl get configmap test-config -o yaml
apiVersion: v1
data:
  db.properties: |
    driverClassName=com.mysql.jdbc.Driver
    ......
  • 指定特定文件夾進(jìn)行創(chuàng)建
kubectl create configmap config-dir --from-file=/home/conf/config-test

通過如下方式進(jìn)行查看

[root@k8s-master k8s]# kubectl get configmap config-test -o yaml
apiVersion: v1
data:
  db.properties: |
    # 數(shù)據(jù)源配置
    driverClassName=com.mysql.jdbc.Driver
   ......
  logback.xml: "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration debug=\"true\"
   ......
  svc.properties: |
    #server
    protocol=tcp
    .......
  system.properties: |
    time=100
    .......

如上描述三種基本的 ConfigMap創(chuàng)建方式,當(dāng)然也可以使用合并不同選項(xiàng)進(jìn)行創(chuàng)建配置文件,具體如下所示:

kubectl create configmap config-mix --from-file=/home/conf/biz/ --from-file=/home/conf/db.xml  --from-literal=one=two

看到這么多,你可能會(huì)想到,--from-file最后一級(jí)如果是文件夾會(huì)怎樣呢?如你所想,文件夾其實(shí)不會(huì)被包含,只會(huì)查找最后一級(jí)目錄下的文件。

4、ConfigMap 作為環(huán)境變量三種使用方式

單個(gè)引用

1、首先創(chuàng)建 ConfigMap

kubectl create configmap configmaptest --from-literal=code=25 --from-literal=foo=bar --from-literal=one=two

2、Deployment yaml中引用 ConfigMap 設(shè)置環(huán)境變量,如圖(2)所示

3、通過如下方式進(jìn)行查看,環(huán)境變量是否生效,可以發(fā)現(xiàn),容器環(huán)境中已經(jīng)存在引用ConfigMap中的環(huán)境變量

[root@k8s-master k8s]# kubectl exec nginx-7c958f6448-z5q56 -it /bin/bash
[root@nginx-7c958f6448-z5q56 /]# env|grep CODE
CODE-TIME=25

多個(gè)引用

1、一次性傳遞所有ConfigMap條目作為環(huán)境變量,如圖(3)所示

可以通過如下方式進(jìn)行查看環(huán)境變量是否生效,如下所示每個(gè)環(huán)境變量都按照預(yù)設(shè),添加了配置的前綴,有人可能要說,我的配置文件中原來是什么配置現(xiàn)在還保留什么配置,不需要添加預(yù)設(shè)前綴,那么請查看如圖(4)通過把前綴設(shè)置為空串,即可保持原有配置方式。

[root@k8s-master k8s]# kubectl exec nginx-84ccdff98d-vgzcw -it /bin/bash
[root@nginx-84ccdff98d-vgzcw /]# env|grep CODE
CODE_foo=bar
CODE_code=25
CODE_one=two

args 方式傳遞環(huán)境變量

容器啟動(dòng)時(shí),傳遞該變量到服務(wù),運(yùn)行 shell 腳本,可能會(huì)用到,具體設(shè)置方式如圖(5)所示:

以上解釋了通過在 yaml 設(shè)置 env 引用 ConfigMap 中配置作為環(huán)境變量的使用,在使用過程中,我參考了 《Kubernetes In Action》這本書,發(fā)現(xiàn)此書中有一段是這樣描述的,如圖(6)所示:

其大概意思是,配置鍵中不能包含破折號(hào),如果包含則不能設(shè)置到環(huán)境變量中,此書這部分是基于 Kubernetes 1.6 進(jìn)行編撰,而我使用的是 kubernetes 1.14,不清楚是不是因?yàn)?Kubernetes 已經(jīng)改進(jìn)的原因,還是其他原因,我有兩點(diǎn)不解的地方。

破折號(hào)(——)大多都是指特別長的符號(hào),在編碼過程中很少有人使用這個(gè),即使使用了,Kubernetes 根本無法保存成功。

又何談環(huán)境變量一說呢?會(huì)提示如圖(7),圖(8)所示錯(cuò)誤:

如果破折號(hào)換成英文半角字符 - 中劃線呢?如圖(9)所示,是可以保存成功的。當(dāng)然也可以用于環(huán)境變量中。

當(dāng)然通過如上方式設(shè)置完成之后,就可以直接在容器內(nèi)部使用環(huán)境變量讀取已經(jīng)設(shè)置的配置,但是使用環(huán)境變量的方式有一個(gè)致命的缺點(diǎn)是,當(dāng)外部 ConfigMap 更新配置完成之后,容器內(nèi)部環(huán)境變量并不會(huì)隨之改變,這是因?yàn)?ENV 是容器啟動(dòng)時(shí)候注入的,啟動(dòng)之后 Kubernetes 就不會(huì)改變 ENV 的值,即配置不能同步更新,只能通過重啟容器方式,配置才能生效。

5、掛載 volume

這種方式則是通過 volume 形式映射到容器內(nèi)部指定目錄上,容器內(nèi)部進(jìn)程直接讀取該目錄下特定文件,這種方式是我們常用的一種方式,具體使用時(shí)如下所示:

   ......
        - containerPort: 80
        volumeMounts:
          - mountPath: /usr/local/nginx/conf/vhost/
            name: http
          - mountPath: /usr/local/nginx/html/foo
            subPath: foo
            name: nginx-html
      volumes:
      - name: http
        configMap:
          name: nginx-conf
      - name: nginx-html
        configMap:
          name: configmaptest
          items: 
          - key: foo
            path: foo
   ......

volumeMounts 是容器內(nèi)部指定掛載目錄,volumes 是引用目錄,即宿主機(jī)設(shè)置 ConfigMap 文件地址。

  • 可以直接掛載一個(gè)目錄到容器內(nèi)部,當(dāng)宿主機(jī)通過如下方式修改 configmap 那么容器內(nèi)部配置將隨之改變,一次性修改所有文件。但是使用這種方式有一個(gè)問題需要注意,如果掛載到容器內(nèi)部的文件夾下存在其它文件,這種掛載方式將直接覆蓋原有文件夾下的文件。
[root@k8s-master ~]# kubectl edit configmap configmaptest
  • 如果有特定需求,需要掛載某個(gè)特定文件,而不允許覆蓋原有文件,可以掛載到指定文件,通過 subPath 配合指定文件。但是單個(gè)文件掛載這種方式不能實(shí)現(xiàn)熱更新,即宿主機(jī) ConfigMap 文件發(fā)生變化,容器內(nèi)部不會(huì)自動(dòng)重載。
  • 至于 items 使用就比較簡單了,如果一個(gè) ConfigMap 中包含多個(gè)配置文件,但是只想暴露出來其中一部分,那么可以通過 items 方式進(jìn)行指定。當(dāng)然你也可以對文件設(shè)置讀寫權(quán)限。

6、Secret 使用

Secret 使用類似于 ConfigMap,支持兩種形式的使用:

  • 將 Secret 作為環(huán)境變量暴露給容器進(jìn)程使用。
  • 將 Secret 通過volume 數(shù)據(jù)卷提供給容器進(jìn)程使用。

看到這里你可能要說了,什么都一樣,為啥還要 Secret,一個(gè) ConfigMap 解決問題不就完事了,其實(shí)不然,Secret 顧名思義,是用于存儲(chǔ)加密數(shù)據(jù)的,老版本 Kubernetes 只支持 base64 加密,學(xué)過計(jì)算機(jī)的都知道 base64 那就不是什么加密,只是對字符串進(jìn)行了 encode 編碼,通過 decode 直接可以解出明文。

但后來新版本的 Kubernetes 已經(jīng)實(shí)現(xiàn)了真正意義上的加解密,所以 Secret 存在是有一定意義的,使用方式跟 ConfigMap 類似,但是命令確不一樣。

1、創(chuàng)建 Secret 輸入如下:

kubectl create secret generic nginx-ssl --from-file=ca.key --from-file=ca.cert

2、查看 Secret 輸入如下所示:

[root@k8s-master ~]# kubectl get secret
NAME                  TYPE                                  DATA   AGE
default-token-7h5z9   kubernetes.io/service-account-token   3      6d13h
nginx-ssl         Opaque                                2      21h
[root@k8s-master ~]# kubectl get secret nginx-ssl -o yaml
apiVersion: v1
data:
  ca.crt: QmFnIEF0dHJpYnV0ZXMKICAgIGZy.......................
  ca.key: QmFnIEF0dHJpYnV0ZXMKICAgIGZy......................
kind: Secret
.....................

3、Pod 引用方式:

.....................
- containerPort: 80
        volumeMounts:
          - mountPath: /home/nginx/nginx/conf/cert/
            name: nginx-ssl
      volumes:
      - name: nginx-ssl
        secret:
          secretName: nginx-ssl
.....................

7、應(yīng)用程序怎么做到不重啟情況下讀取最新配置

上面已經(jīng)提及使用環(huán)境變量和單文件掛載形式,無法實(shí)現(xiàn)熱更新,但是通過 數(shù)據(jù)卷形式可以實(shí)現(xiàn)宿主機(jī)和 Pod 內(nèi)部讀取配置的實(shí)時(shí)更新,但是有一點(diǎn)需要注意的是 ConfigMap 更新,數(shù)據(jù)卷也更新了,如果你的應(yīng)用進(jìn)程不進(jìn)行配置重載,即實(shí)時(shí)讀取配置數(shù)據(jù),同樣還是使用的老配置。

這個(gè)問題可以通過把 Pod 的副本數(shù)減少到 0 進(jìn)行重建 Pod 解決。這種方式雖然能夠解決服務(wù)重新加載問題,但是也會(huì)帶來問題。

因?yàn)榭赡軙?huì)導(dǎo)致同一套服務(wù),配置不一致的問題,因此,如果業(yè)務(wù)對實(shí)時(shí)性要求高,建議改成服務(wù)實(shí)時(shí)加載配置。總結(jié)一下,Kubernetes 只是把配置實(shí)時(shí)同步到數(shù)據(jù)卷配置文件中,至于加載時(shí)機(jī),還要看自己的應(yīng)用程序。

舉個(gè)例子,nginx 配置存儲(chǔ)在 Kubernetes ConfigMap 里面,公鑰信息存儲(chǔ)在 Secret 中,nginx 充當(dāng)服務(wù)里面的反向代理,因?yàn)槎丝谫Y源規(guī)劃問題,需要修改 nginx 配置文件中端口,修改完成后,Pod 中的數(shù)據(jù)卷配置信息發(fā)生變化,但 nginx 并不會(huì)重載已經(jīng)修改的配置信息。

通過如下命令行修改,修改完成后,發(fā)現(xiàn) Pod 中 nginx 配置生效。

kubectl exec nginx -c nginx -- /usr/local/nginx/sbin/nginx -s reload

總結(jié)

ConfigMap 本身是一個(gè)很接地氣的設(shè)計(jì),它借助于 volume ,原有服務(wù)不用修改任何代碼,即可無縫對接。如果你已經(jīng)使用了其它分布式配置管理服務(wù),如:DisConf,Apollo等,你也可以保持原有方式,繼續(xù)使用。

以上就是Kubernetes k8s configmap 容器技術(shù)解析的詳細(xì)內(nèi)容,更多關(guān)于k8s configmap 容器技術(shù)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • k8s series初級(jí)calico使用介紹

    k8s series初級(jí)calico使用介紹

    這篇文章主要為大家介紹了k8s series初級(jí)calico使用介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • K8S?prometheus?operator監(jiān)控工作原理介紹

    K8S?prometheus?operator監(jiān)控工作原理介紹

    這篇文章主要為大家介紹了K8S?prometheus?operator監(jiān)控工作原理介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • Kubernetes訪問控制之鑒權(quán)方法詳解

    Kubernetes訪問控制之鑒權(quán)方法詳解

    這篇文章主要為大家介紹了Kubernetes訪問控制之鑒權(quán)方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • 教你在k8s上部署HADOOP-3.2.2(HDFS)的方法

    教你在k8s上部署HADOOP-3.2.2(HDFS)的方法

    這篇文章主要介紹了k8s-部署HADOOP-3.2.2(HDFS)的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • K8S部署lnmp項(xiàng)目全過程

    K8S部署lnmp項(xiàng)目全過程

    這篇文章主要介紹了K8S部署lnmp項(xiàng)目全過程,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • kubernetes k8s 存儲(chǔ)動(dòng)態(tài)掛載配置詳解

    kubernetes k8s 存儲(chǔ)動(dòng)態(tài)掛載配置詳解

    這篇文章主要為大家介紹了kubernetes k8s 存儲(chǔ)動(dòng)態(tài)掛載配置詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • 從小飯館客流量變大論云原生負(fù)載均衡

    從小飯館客流量變大論云原生負(fù)載均衡

    這篇文章主要為大家介紹了從小飯館客流量變大來討論云原生負(fù)載均衡,為大家做出更生動(dòng)易懂的云原生解釋說明有需要的朋友可以借鑒參考下
    2022-03-03
  • kubenetes集群版本升級(jí)方式

    kubenetes集群版本升級(jí)方式

    本文詳細(xì)介紹了使用kubeadm和二進(jìn)制方式搭建及升級(jí)Kubernetes集群的方法,介紹了版本控制、升級(jí)步驟、備份ETCD數(shù)據(jù)、升級(jí)各節(jié)點(diǎn)組件等關(guān)鍵操作,并提供了操作示例和注意事項(xiàng),幫助理解和實(shí)施Kubernetes集群的搭建和升級(jí)過程
    2024-09-09
  • 普通人如何在區(qū)塊鏈行業(yè)賺錢

    普通人如何在區(qū)塊鏈行業(yè)賺錢

    區(qū)塊鏈?zhǔn)且豁?xiàng)新技術(shù)。之所以快速吸引人們的關(guān)注,是因?yàn)楸忍貛旁?017年的暴漲,迅速吸引了大眾的視線。而比特幣的底層技術(shù),主要是區(qū)塊鏈技術(shù)
    2018-03-03
  • 某集團(tuán)任意文件下載到虛擬主機(jī)getshell的方法

    某集團(tuán)任意文件下載到虛擬主機(jī)getshell的方法

    這篇文章主要介紹了某集團(tuán)任意文件下載到虛擬主機(jī)getshell的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-01-01

最新評論

桐庐县| 页游| 松江区| 广州市| 寿宁县| 章丘市| 新余市| 张家口市| 高平市| 那坡县| 黄梅县| 聂拉木县| 图片| 久治县| 灌南县| 汝南县| 铁岭县| 洞口县| 饶平县| 全南县| 江西省| 光泽县| 嘉禾县| 安康市| 改则县| 通榆县| 大邑县| 齐河县| 河津市| 河南省| 余庆县| 铜川市| 奉新县| 佛坪县| 左云县| 磐石市| 阿图什市| 连城县| 来安县| 临夏市| 临颍县|