K8S configmap详解:从文件创建、从文件夹创建及以volume、env环境变量的方式在pod中使用

ConfigMap是用来存储配置文件的kubernetes资源对象,所有的配置内容都存储在etcd中。
1.创建ConfigMap

创建ConfigMap的方式有4种:

通过直接在命令行中指定configmap参数创建,即--from-literal
通过指定文件创建,即将一个配置文件创建为一个ConfigMap--from-file=<文件>
通过指定目录创建,即将一个目录下的所有配置文件创建为一个ConfigMap,--from-file=<目录>
事先写好标准的configmap的yaml文件,然后kubectl create -f 创建

1.1 通过命令行参数–from-literal创建
示例

创建命令:

kubectl create configmap test-config1 --from-literal=db.host=10.5.10.116 --from-listeral=db.port='3306'

结果如图中data内容所示:
这里写图片描述
1.2 指定文件创建
示例

配置文件app.properties的内容:
这里写图片描述
创建命令(可以有多个–from-file):

kubectl create configmap test-config2 --from-file=./app.properties

结果如图中data内容所示:
这里写图片描述

可以看到指定文件创建时configmap会创建一个key/value对,key是文件名,value是文件内容。

假如不想configmap中的key为默认的文件名,还可以在创建时指定key名字:

kubectl create configmap game-config-3 --from-file=<my-key-name>=<path-to-file>

1.3 指定目录创建
示例

configs 目录下的config-1和config-2内容如下所示:
这里写图片描述
创建命令:

kubectl create configmap test-config3 --from-file=./configs

结果如图中data内容所示:
这里写图片描述

可以看到指定目录创建时configmap内容中的各个文件会创建一个key/value对,key是文件名,value是文件内容。

那假如目录中还包含子目录呢?继续做实验:
在上一步的configs目录下创建子目录subconfigs,并在subconfigs下面创建两个配置文件,指定目录configs创建名为test-config4的configmap:

kubectl create configmap test-config4 --from-file=./configs

结果如下图所示:
这里写图片描述
结果说明指定目录时只会识别其中的文件,忽略子目录
1.4 通过事先写好configmap的标准yaml文件创建

yaml文件如图所示:
这里写图片描述
结果如图中data内容所示:
这里写图片描述
注意其中一个key的value有多行内容时的写法
2.使用ConfigMap

使用ConfigMap有三种方式:

第一种是通过环境变量的方式,直接传递给pod使用configmap中指定的key使用configmap中所有的key
第二种是通过在pod的命令行下运行的方式(启动命令中)
第三种是作为volume的方式挂载到pod内

2.1 通过环境变量使用

示例:
(1)使用valueFrom、configMapKeyRef、name、key指定要用的key:

apiVersion: v1
kind: Pod
metadata:name: dapi-test-pod
spec:containers:- name: test-containerimage: k8s.gcr.io/busyboxcommand: [ "/bin/sh", "-c", "env" ]env:- name: SPECIAL_LEVEL_KEYvalueFrom:configMapKeyRef:name: special-configkey: special.how- name: LOG_LEVELvalueFrom:configMapKeyRef:name: env-configkey: log_levelrestartPolicy: Never

(2)还可以通过envFrom、configMapRef、name使得configmap中的所有key/value对都自动变成环境变量:

apiVersion: v1
kind: Pod
metadata:name: dapi-test-pod
spec:containers:- name: test-containerimage: k8s.gcr.io/busyboxcommand: [ "/bin/sh", "-c", "env" ]envFrom:- configMapRef:name: special-configrestartPolicy: Never

2.2 在启动命令中引用

示例:
在命令行下引用时,需要先设置为环境变量,之后可以通过$(VAR_NAME)设置容器启动命令的启动参数:

apiVersion: v1
kind: Pod
metadata:name: dapi-test-pod
spec:containers:- name: test-containerimage: k8s.gcr.io/busyboxcommand: [ "/bin/sh", "-c", "echo $(SPECIAL_LEVEL_KEY) $(SPECIAL_TYPE_KEY)" ]env:- name: SPECIAL_LEVEL_KEYvalueFrom:configMapKeyRef:name: special-configkey: SPECIAL_LEVEL- name: SPECIAL_TYPE_KEYvalueFrom:configMapKeyRef:name: special-configkey: SPECIAL_TYPErestartPolicy: Never

2.3 作为volume挂载使用

(1)把1.4中test-config4所有key/value挂载进来:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:name: nginx-configmap
spec:replicas: 1template:metadata:labels:app: nginx-configmapspec:containers:- name: nginx-configmapimage: nginxports:- containerPort: 80volumeMounts:     - name: config-volume4mountPath: /tmp/config4volumes:- name: config-volume4configMap:name: test-config4

进入容器中/tmp/config4查看:
这里写图片描述
可以看到,在config4文件夹下以每一个key为文件名value为值创建了多个文件。

(2)假如不想以key名作为配置文件名可以引入items 字段,在其中逐个指定要用相对路径path替换的key:

 volumes:- name: config-volume4configMap:name: test-config4items:- key: my.cnfpath: mysql-key- key: cache_hostpath: cache-host

进入容器中看:
这里写图片描述

备注:

删除configmap后原pod不受影响;然后再删除pod后,重启的pod的events会报找不到cofigmap的volume;
pod起来后再通过kubectl edit configmap …修改configmap,过一会pod内部的配置也会刷新。
在容器内部修改挂进去的配置文件后,过一会内容会再次被刷新为原始configmap内容

(3)还可以为以configmap挂载进的volume添加subPath字段:

    volumeMounts:- name: config-volume5mountPath: /tmp/mysubPath: my.cnf- name: config-volume5mountPath: /tmp/hostsubPath: cache_host- name: config-volume5mountPath: /tmp/portsubPath: cache_port- name: config-volume5mountPath: /tmp/prefixsubPath: cache_prefixvolumes:- name: config-volume5configMap:name: test-config4

进入容器中看:
这里写图片描述
注意在容器中的形式与(2)中的不同,(2)中是个链接,链到…data/。
备注:

删除configmap后原pod不受影响;然后再删除pod后,重启的pod的events会报找不到cofigmap的volume。
pod起来后再通过kubectl edit configmap …修改configmap,pod内部的配置也会自动刷新。
在容器内部修改挂进去的配置文件后,内容可以持久保存,除非杀掉再重启pod才会刷回原始configmap的内容。
subPath必须要与configmap中的key同名。
mountPath如/tmp/prefix:
<1>当/tmp/prefix不存在时(备注:此时/tmp/prefix和/tmp/prefix/无异),会自动创建prefix文件并把value写进去;
<2>当/tmp/prefix存在且是个文件时,里面内容会被configmap覆盖;
<3>当/tmp/prefix存在且是文件夹时,无论写/tmp/prefix还是/tmp/prefix/都会报错。

3.configmap的热更新研究

更新 ConfigMap 后:

使用该 ConfigMap 挂载的 Env 不会同步更新
使用该 ConfigMap 挂载的 Volume 中的数据需要一段时间(实测大概10秒)才能同步更新

ENV 是在容器启动的时候注入的,启动之后 kubernetes 就不会再改变环境变量的值,且同一个 namespace 中的 pod 的环境变量是不断累加的,参考 Kubernetes中的服务发现与docker容器间的环境变量传递源码探究。为了更新容器中使用 ConfigMap 挂载的配置,可以通过滚动更新 pod 的方式来强制重新挂载 ConfigMap,也可以在更新了 ConfigMap 后,先将副本数设置为 0,然后再扩容。
参考

1.https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/
2.https://www.cnblogs.com/breezey/p/6582082.html
3.https://kubernetes.io/docs/concepts/storage/volumes/
4.https://www.kubernetes.org.cn/3138.html
5.https://blog.csdn.net/liukuan73/article/details/79492374

K8S configmap详解:从文件创建、从文件夹创建及以volume、env环境变量的方式在pod中使用相关推荐

  1. 详解C盘Windows文件夹里重要文件的作用

    详解C盘Windows文件夹里重要文件的作用 在整个Windows操作系统中,最重要的莫过于"Windows"文件夹,对电脑进行任何操作几乎都有关.了解这里对于掌握整个系统的运作有 ...

  2. linux怎么授权目录,详解Linux如何将一个文件夹的所有内容授权给某一个用户?...

    详解Linux如何将一个文件夹的所有内容授权给某一个用户? 发布时间:2020-09-14 15:23:51 来源:脚本之家 阅读:138 作者:冰阔落 栏目:服务器 [问题分析] 我们可以使用cho ...

  3. win7系统ftp无法访问服务器,技术员详解电脑打开FTp文件夹出错提示windows无法访问的教程?...

    技术员详解电脑打开FTp文件夹出错提示windows无法访问的教程? ? 近来有网友反映在电脑中打开FTp文件夹时出错,提示windows无法访问此文件夹.对于上述的FTp文件夹打开错误的问题,咱们应 ...

  4. 详解C盘Windows文件夹

    详解C盘Windows文件夹里重要文件的作用 在整个Windows操作系统中,最重要的莫过于"Windows"文件夹,对电脑进行任何操作几乎都有关.了解这里对于掌握整个系统的运作有 ...

  5. Maba连接、创建文件夹、配置jdk、hadoop环境变量

    Vm虚拟机--虚拟的模拟电脑 Centos--电脑要安装的操作系统(linux系统) Moba--windows软件,windows和linux传输文件要用moba软件. Jdk--linux下面的j ...

  6. 详解C盘Windows文件夹里重要文件作用

        在整个Windows操作系统中,最重要的莫过于"Windows"文件夹,对电脑进行任何操作几乎都有关.了解这里对于掌握整个系统的运作有很大的作用,如果有兴趣不妨往下看看. ...

  7. Kubernetes(k8s)ConfigMap详解及应用

    文章目录 一.ConfigMap概述 二.ConfigMap创建 1)通过命令行创建configmap(key-value键值对) 2)通过文件创建configmap 3)通过文件夹创建configm ...

  8. 详解C#使用FileSystemWatcher文件监控对象的感受

    ** 详解C#使用FileSystemWatcher文件监控对象的感受 ** 本文和大家一起来学习分享一下C#使用FileSystemWatcher文件监控对象,希望对你有帮助. 最近在项目中有这么个 ...

  9. Android中measure过程、WRAP_CONTENT详解以及xml布局文件解析流程浅析(下)

       本文原创, 转载请注明出处:http://blog.csdn.net/qinjuning 上篇文章<<Android中measure过程.WRAP_CONTENT详解以及xml布局文 ...

最新文章

  1. 以下哪一个不属于python语言的特点-以下不属于python语言特点的是( )_学小易找答案...
  2. 汇编语言 ADC指令和SBB指令
  3. Angular 依赖注入 useClass 的实例创建位置
  4. Elasticsearch学习笔记-04.3批处理
  5. 如何修改动态库符号表
  6. 【报告分享】巨量算数:疫情期间汽车专题研究洞察.pdf(附下载链接)
  7. Flash ActionScript 2.0基础教程
  8. activemq spring监听不了
  9. Linux下读写UART串口的代码
  10. python爬虫100例教程 python爬虫实例100例子
  11. POJO、PO、DTO、DAO、BO、VO需要搞清楚的概念 1
  12. 1055 集体照 (25 分)
  13. oracle18c安装教程6,Oracle 18c rpm 安装及解析安装过程
  14. python编程技术解决英语单词测试(包括添加英文单词、查询英文单词和查询英文单词)以及绘制雷达图功能
  15. java意图_任务型对话(一)—— NLU/SLU(意图识别和槽值填充)
  16. 进销存管理系统大全【70个进销存系统】
  17. 贪婪洞窟2 素材解密
  18. LeetCode-179
  19. 基于HDP使用Flume实时采集MySQL中数据传到Kafka
  20. 【Excel】数据透视表—数据透视表布局(显示)

热门文章

  1. python3 copy_python3 深浅copy对比详解
  2. 英语语法---分词短语详解
  3. PyQt5 笔记2 -- Qt Designer使用
  4. python3的3D开发-基于blender(2)
  5. erlang精要(16)-匿名函数之sigmoid函数实现
  6. AI理论知识整理(7)-单高斯模型
  7. 【Python】机器学习矩阵运算必学库Numpy首秀!
  8. 【职场】如何才能成功的创业,创业成功的本质是什么
  9. 【论文解读】DCN-M:Google提出改进版DCN,用于大规模排序系统的特征交叉学习(附代码)...
  10. 网易云信携手SNH48 GROUP,打造在线追星新体验