云原生要素配置分離ConfigMap創(chuàng)建方式
云原生要素-配置分離:ConfigMap&Secret
什么是ConfigMap
ConfigMap 是一種 API 對象,用來將非機密性的數(shù)據(jù)保存到鍵值對中。
舉一個例子更直觀的看出ConfigMap是什么:比如我有一個nginx的Pod資源,那么ConfigMap就相當于nginx.conf這個配置文件。
需要注意的是:這個 Pod 和 ConfigMap 必須要在同一個 命名空間 中,不可跨命名空間。
ConfigMap供容器使用的典型用法如下:
- 生成容器內(nèi)的環(huán)境變量。
- 設置容器啟動命令的啟動參數(shù)(需設置為環(huán)境變量)。
- 以Volume的形式掛載為容器內(nèi)部的文件或目錄。
ConfigMap與Secret類似,更傾向于前者適用于明文配置,后者適用于密碼等配置。
ConfigMap的創(chuàng)建方式
configmap創(chuàng)建語法:
kubectl create configmap NAME [--from-file=[key=]source] [--from-literal=key1=value1] [--dry-run=server|client|none] [options]
基于目錄/文件方式創(chuàng)建configmap
創(chuàng)建一個用于練習的目錄及文件,其中包含兩個用于測試的文件
[root@k8s-master01 ~]# mkdir /configmap 您在 /var/spool/mail/root 中有新郵件 [root@k8s-master01 ~]# cd /configmap/ [root@k8s-master01 configmap]# mkdir conf [root@k8s-master01 configmap]# vim conf/test01.conf [root@k8s-master01 configmap]# vim conf/test02.conf 您在 /var/spool/mail/root 中有新郵件 [root@k8s-master01 configmap]# cat conf/test1.conf lives=3 name=haha [root@k8s-master01 configmap]# cat conf/test2.conf color.good=yellow user=mysql
創(chuàng)建一個cm(cm為configmap的縮寫),與創(chuàng)建其他資源類型一樣
[root@k8s-master01 configmap]# kubectl create configmap cmfile --from-file=conf/ [root@k8s-master01 configmap]# kubectl get cm NAME DATA AGE cmfile 2 13s kube-root-ca.crt 1 21d # 可以看到剛才創(chuàng)建的資源已經(jīng)成功了
我們可以查看一下生成的cm的yaml文件
[root@k8s-master01 configmap]# kubectl get cm cmfile -oyaml apiVersion: v1 data: test1.conf: | lives=3 name=haha test2.conf: | color.good=yellow user=mysql kind: ConfigMap metadata: creationTimestamp: "2022-02-23T02:50:40Z" name: cmfile namespace: default resourceVersion: "1050098" uid: 39b904c2-c1a4-442c-a6fe-6a3d89af36ac
找到data,可以看到data下內(nèi)容包含了之前測試創(chuàng)建的兩個文件及內(nèi)容
基于文件創(chuàng)建和目錄是相似的,只要加上目錄下的指定文件即可,比如:
[root@k8s-master01 configmap]# kubectl create cm cmfromfile --from-file=conf/test02.conf
有一個不常用的地方,自定義configmap中的名稱
[root@k8s-master01 configmap]# vim test03.conf [root@k8s-master01 configmap]# kubectl create cm test03 --from-file=test03-conf=test03.conf configmap/test03 created [root@k8s-master01 configmap]# kubectl get cm test03 -o yaml apiVersion: v1 data: test03-conf: | user=www passwd=123456 kind: ConfigMap metadata: creationTimestamp: "2022-02-20T10:52:11Z" name: test03 namespace: default resourceVersion: "914180" uid: 2f41ffa8-f200-48ee-8e61-729cfdf81b97
可以看到上面例子中的test03.conf已經(jīng)變成test03-conf格式了,這個了解即可。
基于env文件創(chuàng)建configmap
其實方式都一樣,不細寫了,看下創(chuàng)建方式:適用于較多的鍵值對
[root@k8s-master01 configmap]# kubectl create cm envfile --from-env-file=envfile.conf configmap/envfile created [root@k8s-master01 configmap]# kubectl get cm envfile -o yaml apiVersion: v1 data: age: "25" hehe: haha name: yy kind: ConfigMap metadata: creationTimestamp: "2022-02-23T03:02:58Z" name: envfile namespace: default resourceVersion: "1051876" uid: 27a62b22-cd46-4dbe-bf12-6b34a67befe8 # 可以看到里面的等號換成冒號
基于literal直接創(chuàng)建configmap
比如我們只需要一兩個或很少的變量,沒有寫成文件的必要的時候可以用這種方式
[root@k8s-master01 configmap]# kubectl create cm literaltest --from-literal=PORT=8080 --from-literal=PASSWORD=123456
基于yaml文件創(chuàng)建configmap
這種就不說了,這是官網(wǎng)上的一個示例,有興趣可以去看看
鏈接:https://kubernetes.io/zh/docs/concepts/configuration/configmap/
使用valueFrom定義環(huán)境變量
適合配置參數(shù)比較少的地方
我們先創(chuàng)建一個deploy資源方便測試,–dry-run的作用是只生成yaml文件而不創(chuàng)建資源
kubectl create deployment dp-cm --image=nginx --dry-run=client -o yaml > dp-cm.yaml
簡單修改一下后剩余的yaml文件
[root@k8s-master01 configmap]# cat dp-cm.yaml apiVersion: apps/v1 kind: Deployment metadata: labels: app: dp-cm name: dp-cm spec: replicas: 1 selector: matchLabels: app: dp-cm strategy: {} template: metadata: labels: app: dp-cm spec: containers: - image: nginx name: nginx
我們分別添加一個傳統(tǒng)的環(huán)境變量和使用configmap定義一個
spec: containers: - image: nginx name: nginx env: - name: TEST_ENV value: test_env - name: TEST_X valueFrom: configMapKeyRef: name: envfile key: hehe
env下第一個環(huán)境變量是我們按照傳統(tǒng)模式定義;第二個是在configmap中取值,先看一下效果
[root@k8s-master01 configmap]# kubectl create -f dp-cm.yaml deployment.apps/dp-cm created [root@k8s-master01 configmap]# kubectl exec dp-cm-f8c48c84c-zvcwt -- env PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=dp-cm-f8c48c84c-zvcwt NGINX_VERSION=1.21.6 NJS_VERSION=0.7.2 PKG_RELEASE=1~bullseye TEST_ENV=test_env TEST_X=haha
最后兩個分別是我們直接定義的變量和引用configmap中的變量如果引用多個變量只需要在后面添加定義即可
- name: TEST_X valueFrom: configMapKeyRef: name: envfile key: hehe - name: TEST_Y valueFrom: configMapKeyRef: name: envfile key: name
注意:如果引用的變量不存在會報錯,Pod創(chuàng)建不成功
使用envfrom批量生成環(huán)境變量
spec: containers: - image: nginx name: nginx envFrom: - configMapRef: name: envfile
更新一下Pod,然后看一下結果
[root@k8s-master01 configmap]# kubectl replace -f dp-cm.yaml deployment.apps/dp-cm replaced [root@k8s-master01 configmap]# kubectl exec dp-cm-8565c44587-x8k62 -- env PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=dp-cm-8565c44587-x8k62 NGINX_VERSION=1.21.6 NJS_VERSION=0.7.2 PKG_RELEASE=1~bullseye age=25 hehe=haha name=yy TEST_ENV=test_env
可以看到后面三行小寫名稱的就是我們envfile
configMap中的內(nèi)容
當一個Pod中變量有直接定義的也有從configMap定義時,我們可以加prefix
前綴進行區(qū)分:
spec: containers: - image: nginx name: nginx envFrom: - configMapRef: name: envfile prefix: fromCm_ env: - name: TEST_ENV value: test_env
以文件形式掛載ConfigMap
我們事先創(chuàng)建了一個redis-conf的cm副本,然后掛載到下面文件的Pod中
spec: containers: - image: nginx name: nginx volumeMounts: - name: redisconf mountPath: /etc/config volumes: - name: redisconf configMap: name: redis-conf
上面這部分內(nèi)容中volumes下有兩個name,第一個是需要掛載到Pod的名稱,第二個是configMap的名稱,已經(jīng)做了區(qū)分了。執(zhí)行yaml文件,進入Pod內(nèi)部查看一下掛載情況
# 創(chuàng)建Pod [root@k8s-master01 ~]# kubectl create -f dp-cm.yaml # 進入到Pod中查看掛載情況 [root@k8s-master01 ~]# kubectl exec -ti dp-cm-77b4666649-jd4sc -- bash root@dp-cm-77b4666649-jd4sc:/# cd /etc/config/ root@dp-cm-77b4666649-jd4sc:/etc/config# ls redis-conf root@dp-cm-77b4666649-jd4sc:/etc/config# cat redis-conf hehe 123123 # 可以看到我們之前創(chuàng)建的文件已經(jīng)掛載好了
在線編輯cm文件內(nèi)容,掛載到Pod中的文件也會隨著更改
[root@k8s-master01 ~]# kubectl edit cm redis-conf [root@k8s-master01 ~]# kubectl get cm redis-conf -o yaml redis-conf: | hehe 23412423412 [root@k8s-master01 ~]# kubectl exec -ti dp-cm-77b4666649-jd4sc -- bash root@dp-cm-77b4666649-jd4sc:/# cat /etc/config/redis-conf hehe 23412423412 # Pod中的文件也隨著修改了
防止覆蓋操作
比如我們有一個nginx-conf的configMap要掛載到nginx的/etc/nginx目錄下,如果直接操作的話會發(fā)生覆蓋/etc/nginx下所有內(nèi)容,導致Pod報錯。
所以需要加上subPath
來防止內(nèi)容會覆蓋,如下:
spec: containers: - image: nginx name: nginx volumeMounts: - name: nginxconf mountPath: /etc/nginx/nginx.conf subPath: nginx.conf # 這樣只會對這一個文件進行覆蓋 volumes: - name: nginxconf configMap: name: nginx-conf
自定義文件名與授權
使用item
自定義文件名:相當于做一個軟連接
volumes: - name: redisconf configMap: name: redis-conf items: - key: redis.conf path: redis2.conf
使用defaultMode
給ConfigMap中文件進行權限管理
volumes: - name: redisconf configMap: name: redis-conf items: - key: redis.conf path: redis2.conf mode: 0644 # 具體文件權限,優(yōu)先級高 defaultMode: 0666 # configMap的默認權限
熱更新操作
如果是通過yaml文件創(chuàng)建的,只需要在yaml文件中修改,然后kubectl replace
更新即可
如果是通過命令創(chuàng)建的話:
可以把cm導成yaml文件進行修改,然后更新,但是可能會出現(xiàn)錯誤,不建議。
還可以修改創(chuàng)建cm前使用的原始文件,比如nginx.conf
文件,然后利用--dry-run=client
生成一個yaml文件,然后進行更新。如下:
kubectl create cm nginx-conf --from-file=nginx.conf --dry-run=client -oyaml | kubectl replace -f -
使用限制
- 需要提前創(chuàng)建ConfigMap或者Secret
- 引用的Key必須存在
- envFrom、valueFrom無法熱更新操作
- envFrom配置環(huán)境變量,如果Key無效,會忽略無效的Key
- 資源需要在同一個命名空間
- subPath也是無法熱更新的
內(nèi)容不可變
ConfigMap或Secret中加入以下內(nèi)容,執(zhí)行后不可再修改資源
immutable: ture
以上就是配置分離:ConfigMap的詳細內(nèi)容,更多關于配置分離:ConfigMap的資料請關注腳本之家其它相關文章!
相關文章
理解k8s控制器DaemonSet創(chuàng)建及使用場景
這篇文章主要為大家介紹了k8s控制器DaemonSet創(chuàng)建及使用場景詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-09-09IoT?邊緣集群Kubernetes?Events告警通知進一步配置詳解
這篇文章主要為大家介紹了IoT?邊緣集群Kubernetes?Events告警通知進一步配置詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02tkestack/gpu-manager在k8s1.23版本之后的使用方法
這篇文章主要介紹了tkestack/gpu-manager在k8s1.23版本之后的使用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-04-04