ConfigMap对象用于为容器中的应用提供配置数据以定制程序的行为,不过敏感的配置信息,例如密钥、证书等通常由Secret对象来进行配置。他们将相应的配置信息保存于对象中,而后在pod资源上以存储卷的形式将其挂载并获取相关的配置,以实现配置与镜像文件的解耦。ConfigMap对象将配置数据以键值对的形式进行存储,这些数据可以在pod对象中使用或为系统组件提供配置,例如控制器对象等。不过,无论应用程序如何使用ConfigMap对象中的数据,用户都完全可以通过在不同的环境中创建名称相同但内存不同的ConfigMap对象,从而为不同环境中同一功能的pod资源提供不同的配置信息,实现应用于配置的灵活勾兑。

一、创建ConfigMap对象

COnfigMap既可以使用命令create创建也可以使用资源配置清单创建

$ kubectl create configmap map-name data-source
其中,map-name为configmap对象的名称,data-source为数据源,它可以通过直接值、文件或目录来获取。无论是哪一种数据源供给方式,都要转换为configmap对象的k-v数据,
其中k由用户在命令行给出或是文件数据源的文件名,它仅能由数字、字母、连接号和点号组成,而v则是直接值或文件数据源的内容

1、利用直接值创建

使用“--from-literal”选项可在命令行直接给出键值对来创建configmap对象,重复使用此选项则可以传递多个键值对。

$ kubectl create configmap test --from-literal=key-name1=value1 --from-literal=key-name2=value2

使用“get configmap”命令可用于查看创建的test对象的相关信息:

[root@master ~]# kubectl get configmap test -o yaml
apiVersion: v1
data:
key1: value1
key2: value2
kind: ConfigMap
metadata:
creationTimestamp: "2019-08-19T06:00:43Z"
name: test
namespace: default
resourceVersion: ""
selfLink: /api/v1/namespaces/default/configmaps/test
uid: ae14bc78-c246-11e9-827a-000c29b9991f

此类方式提供的数据量有限,一般是在仅通过有限的几个数据项即可为pod资源提供足够的配置信息时使用。

2、基于文件创建

为“kubectl create configmap”命令使用“--from-file”选项即可基于文件内容来创建configmap对象,可重复使用多个“--from-file”选项来传递多个文件内容:

$ kubectl create configmap test1 --from-file=./test1
$ cat ./test1
server {
listen ;
server_name wiki.test.com;
access_log /data/logs/nginx/wiki.test.access.log;
error_log /data/logs/nginx/wiki.test.error.log; location / {
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://192.168.10.54:8090;
} }

这种方式创建的configmap对象,其数据存储的键为文件路径的基名,值为文件内容:

[root@master configmap]# kubectl get configmap -o yaml
apiVersion: v1
items:
- apiVersion: v1
data:
test1: "server {\n listen 80;\n server_name wiki.test.com;\n access_log
/data/logs/nginx/wiki.test.access.log;\n error_log /data/logs/nginx/wiki.test.error.log;\n\n
\ location / {\n \tproxy_set_header Host $host:$server_port;\n
\ proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header
\ X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header
\ X-Forwarded-Proto $scheme;\n\n proxy_pass http://192.168.10.54:8090;\n
\ }\n\n }\n\n"
kind: ConfigMap
metadata:
creationTimestamp: "2019-08-19T06:10:56Z"
name: test1
namespace: default
resourceVersion: ""
selfLink: /api/v1/namespaces/default/configmaps/test1
uid: 1b6ba6b1-c248-11e9-827a-000c29b9991f
kind: List
metadata:
resourceVersion: ""
selfLink: ""

如果需要自行指定键名,则可在“--from-file”选项中直接指定自定义的键:

$ kubectl create cm test2 --from-file=serverconfig=./test1
[root@master configmap]# kubectl get cm test2 -o yaml
apiVersion: v1
data:
serverconfig: "server {\n listen 80;\n server_name wiki.test.com;\n
\ access_log /data/logs/nginx/wiki.test.access.log;\n error_log /data/logs/nginx/wiki.test.error.log;\n\n
\ location / {\n \tproxy_set_header Host $host:$server_port;\n
\ proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header
\ X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header
\ X-Forwarded-Proto $scheme;\n\n proxy_pass http://192.168.10.54:8090;\n
\ }\n\n }\n\n"
kind: ConfigMap
metadata:
creationTimestamp: "2019-08-19T06:42:54Z"
name: test2
namespace: default
resourceVersion: ""
selfLink: /api/v1/namespaces/default/configmaps/test2
uid: 92cfc599-c24c-11e9-827a-000c29b9991f

3、基于目录创建

如果配置文件数量较多且存储于有限的目录中时,kubectl还提供了基于目录直接将多个文件分别收纳为键值数据的configmap资源创建方式。将“--from-file”选项后面所跟的路径指向一个目录路径就能将目录下的所有文件一同创建于同一configmap资源中:

$ kubectl create cm test3 --from-file=test3=./
[root@master configmap]# kubectl describe cm test3
Name:         test3
Namespace:    default
Labels:       <none>
Annotations:  <none> Data
====
test1:
----
server {
        listen 80;
        server_name wiki.test.com;
        access_log /data/logs/nginx/wiki.test.access.log;
        error_log /data/logs/nginx/wiki.test.error.log;         location / {
                   proxy_set_header        Host $host:$server_port;
                        proxy_set_header        X-Real-IP $remote_addr;
                        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                        proxy_set_header        X-Forwarded-Proto $scheme;                         proxy_pass http://192.168.10.54:8090;
                }         } test2:
----
server {
        listen 80;
        server_name apidoc.test.com;
        access_log /data/logs/nginx/apidoc.access.log;
        error_log /data/logs/nginx/apidoc.error.log;         location / {
                   proxy_set_header        Host $host:$server_port;
                        proxy_set_header        X-Real-IP $remote_addr;
                        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                        proxy_set_header        X-Forwarded-Proto $scheme;                         proxy_pass http://192.168.10.54:9013;
                }         } Events:  <none>

PS: describe命令和get -o yaml命令都可显示由文件创建而成的键及其值,不过两者使用的键和值之间的分隔符不同。

4、使用清单创建

基于配置文件创建configmap资源时,它所使用的字段包括通常的apiVersion、kind、metadata字段,以及用于存储数据的关键字段data:

[root@master configmap]# cat cm1.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: cm1
namespace: testing
data:
log_level: INFO
log_file: /var/log/test.log

如果其值来自于文件内容时,则使用配置文件创建configmap资源的便捷性还不如直接通过命令行的方式,因此,建议直接使用命令行加载文件或目录的方式进行创建。为了便于配置留存,可以在创建完成后使用get -o yaml命令获取到相关信息后再进行编辑留存。

二、向pod环境变量传递configmap对象键值数据

pod资源的环境变量值引用configmap对象的数据时,通过在env字段中为valueFrom内嵌configMapKeyRef对象即可实现:

valueFrom:
configMapKeyRef:
name:
key:
optional:

其中,字段name的值为要引用的ConfigMap对象的名称,字段key可用于指定要引用ConfigMap对象中某键的键名,而字段optional则用于为当前pod资源指明此引用是否为可选。

apiVersion: v1
kind: ConfigMap
metadata:
name: cm-test
namespace: testing
data:
httpd_port: ""
verbose_level: "-vv"
---
apiVersion: v1
kind: Pod
metadata:
name: cm-pod
namespace: testing
spec:
containers:
- name: nginx
image: nginx:1.12-alpine
env:
- name: HTTPD_PORT
valueFrom:
configMapKeyRef:
name: cm-test
key: httpd_port
- name: HTTPD_LOG_VERBOSE
valueFrom:
configMapKeyRef:
name: cm-test
key: verbose_level

pod资源还支持在容器中使用envFrom字段直接将configmap资源中的所有键值一次性地完成导入:

apiVersion: v1
kind: ConfigMap
metadata:
name: cm-test
namespace: testing
data:
httpd_port: ""
verbose_level: "-vv"
---
apiVersion: v1
kind: Pod
metadata:
name: cm-pod
namespace: testing
spec:
containers:
- name: nginx
image: nginx:1.12-alpine
envFrom:
- prefix: HTCFG_
configMapRef:
name: cm-test
optional: false

envFrom字段值是对象列表,可用于同时从多个configmap对象导入键值数据。为了避免从多个configmap引用键值数据时产生键名冲突,可以在每个引用中将被导入的键使用prefix字段(可选)指定一个特定的前缀,如“HTCFG_”,于是,configmap对象中的httpd_port键将称为pod对象中名为HTCFG_httpd_port的变量。

三、configmap存储卷

1、挂载整个存储卷

关联为pod资源的存储卷时,configmap对象中的每个键都对应地表现为一个文件,键名转为文件名,而键值则为相应文件的内容,即便是通过直接值创建的键值数据,也一样表现为文件视图。挂载于容器上之后,由键值数据表现出的文件位于挂载点目录中,容器中的进程可直接读取这些文件的内容。配置pod资源时,基于存储卷的方式引用configmap对象时,仅需要指明存储卷名称及要引用的configmap对象名称即可:

apiVersion: v1
kind: Pod
metadata:
name: cm-vol
namespace: testing
spec:
containers:
- name: vol-nginx
image: nginx:1.12-alpine
volumeMounts:
- name: ngxconfig
mountPath: /etc/nginx/conf.d
readOnly: true
volumes:
- name: ngxconfig
configMap:
name: ngx-cm

2、挂载存储卷中的部分键值

如果在configmap中有多个键值,当前只挂载部分键值,则可:

apiVersion: v1
kind: Pod
metadata:
name: cm-vol
namespace: testing
spec:
containers:
- name: vol-nginx
image: nginx:1.12-alpine
volumeMounts:
- name: ngxconfig
mountPath: /etc/nginx/conf.d
readOnly: true
volumes:
- name: ngxconfig
configMap:
name: ngx-cm
items:
- key: test.conf
path: test2.conf
mode:
- key: test1.conf
path: test1.conf

其中,key:要引用的键名称,必选字段;path:对应的键于挂载点目录中生成的文件的相对路径,可以不同于键名称,必选字段;mode:文件的权限模型,可用范围:0-0777,默认0644

3、独立挂载存储卷中的键值

前述方式中,无论是装载所有文件还是部分文件,挂载点目录下原有的文件都会被隐藏。对于期望configmap对象提供的配置文件补充于挂载点目录下的需求来说,这种方式显然难以如愿。事实上,此种需求可以通过容器的volumeMouts字段中使用subPath字段来解决,它可以支持用户从存储卷挂载单个文件或单个目录而非整个存储卷。

apiVersion: v1
kind: Pod
metadata:
name: cm-vol
namespace: testing
spec:
containers:
- name: vol-nginx
image: nginx:1.12-alpine
volumeMounts:
- name: ngxconfig
mountPath: /etc/nginx/conf.d/test.conf
subPath: test.conf
readOnly: false
- name: ngxconfig
mountPath: /etc/nginx/test1.conf
subPath: test1.conf
volumes:
- name: ngxconfig
configMap:
name: ngx-cm

k8sConfigMap资源的更多相关文章

  1. k8s-configmap

    一.目的 把应用的代码和配置分开,通过配置configmap管理pod,一种统一的集群配置管理方案.ConfigMap API资源提供了将配置数据注入容器的方式,同时保持容器是不知道Kubernete ...

  2. Fis3的前端工程化之路[三大特性篇之资源定位]

    Fis3版本:v3.4.22 Fis3的三大特性 资源定位:获取任何开发中所使用资源的线上路径 内容嵌入:把一个文件的内容(文本)或者base64编码(图片)嵌入到另一个文件中 依赖声明:在一个文本文 ...

  3. 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

    上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...

  4. ABP文档 - 嵌入的资源文件

    文档目录 本节内容: 简介 创建嵌入的文件 暴露嵌入的文件 使用嵌入的文件 简介 一个web应用里,客户端包含javascript,css,xml等文件,这此文件被添加到一个web项目后,发布成独立的 ...

  5. 【资源】.Net 入门@提高 - 逆天的高薪之路!

     入门看视频,提高看书籍,飘升做项目.老练研开源,高手读外文,大牛讲低调~    官方学习计划 http://www.cnblogs.com/dunitian/p/5667901.html ----- ...

  6. 【翻译】Awesome R资源大全中文版来了,全球最火的R工具包一网打尽,超过300+工具,还在等什么?

    0.前言 虽然很早就知道R被微软收购,也很早知道R在统计分析处理方面很强大,开始一直没有行动过...直到 直到12月初在微软技术大会,看到我软的工程师演示R的使用,我就震惊了,然后最近在网上到处了解和 ...

  7. Xamarin+Prism开发详解二:Xaml文件如何简单绑定Resources资源文件内容

    我们知道在UWP里面有Resources文件xxx.resx,在Android里面有String.Xml文件等.那跨平台如何统一这些类别不一的资源文件以及Xaml设计文件如何绑定这些资源?应用支持多国 ...

  8. 一个表缺失索引发的CPU资源瓶颈案例

    背景 近几日,公司的应用团队反应业务系统突然变慢了,之前是一直比较正常.后与业务部门沟通了解详情,得知最近生意比较好,同时也在做大的促销活动,使得业务数据处理的量出现较大的增长,最终系统在处理时出现瓶 ...

  9. 【NLP】Python NLTK获取文本语料和词汇资源

    Python NLTK 获取文本语料和词汇资源 作者:白宁超 2016年11月7日13:15:24 摘要:NLTK是由宾夕法尼亚大学计算机和信息科学使用python语言实现的一种自然语言工具包,其收集 ...

随机推荐

  1. Tensorflow 保存和载入训练过程

    本节涉及点: 保存训练过程 载入保存的训练过程并继续训练 通过命令行参数控制是否强制重新开始训练 训练过程中的手动保存 保存训练过程前,程序征得同意 一.保存训练过程 以下方代码为例: import ...

  2. 【Python开发】urllib2.urlopen超时问题

    原帖地址:http://hi.baidu.com/yss1983/item/933fbe45a09c43e01381da06 问题描述:     没有设置timeout参数,结果在网络环境不好的情况下 ...

  3. 关于js查找和筛选和循环的几种方式

    find(); find() 方法返回通过测试(函数内判断)的数组的第一个元素的值. find() 方法为数组中的每个元素都调用一次函数执行: 当数组中的元素在测试条件时返回 true 时, find ...

  4. 模仿Spy++抓某窗口消息

    核心函数 SetWindowsHookExA API文档:https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-s ...

  5. xshell设置

    登录脚本: #定义rz,sz自动下载路径 #保持窗口活动状态, 空闲时每120秒发送一个回车

  6. [转帖]深入浅出全面解析RDMA

    深入浅出全面解析RDMA 置顶 2018年06月04日 11:36:54 MasterT-J 阅读数 17193更多 所属专栏: RDMA   RDMA(RemoteDirect Memory Acc ...

  7. JDK 监控和故障处理工具总结 (转)

    出处:  JDK 监控和故障处理工具总结 JDK 监控和故障处理工具总结 JDK 命令行工具 jps:查看所有 Java 进程 jstat: 监视虚拟机各种运行状态信息 jinfo: 实时地查看和调整 ...

  8. js判断设备,跳转app应用、android市场或者AppStore

    js移动设备判断方法大全 <!DOCTYPE html> <html> <head> <meta charset="UTF-8" > ...

  9. 数据结构(三) 树和二叉树,以及Huffman树

    三.树和二叉树 1.树 2.二叉树 3.遍历二叉树和线索二叉树 4.赫夫曼树及应用 树和二叉树 树状结构是一种常用的非线性结构,元素之间有分支和层次关系,除了树根元素无前驱外,其它元素都有唯一前驱. ...

  10. win10操作系统的安装

    电脑被重装操作系统了,一切从头开始啦!!! 不过倒是学习了,给大家分享一些学习经验~ 1:制作启动盘 制作启动盘的首先要准备一个空的U盘,为什么说空的呢,因为制作的时候会格式化U盘,只能存个操作系统, ...