在今天的文章中我将介绍Kubernetes中的ConfigMap对象。它的主要用途什么,为什么要用ConfigMap以及在Kubernetes里通常是如何使用ConfigMap的管理应用配置的。

在学习本文的内容前需要对Kubernetespod这些概念有基本的了解。想实践练习这些内容需要在电脑上先安装kubectlminikube。所有这些准备工作都可以在写给开发工程师的Kubernetes学习笔记系列前面的文章里找到操作指南。

什么是ConfigMap

能够灵活管理应用的配置是一个系统能否长期成功运转的一个关键因素,尤其是在应用分布式微服务时更是如此。

再将应用部署到测试,开发和生产等多个环境时,由于环境不同,将配置放到应用程序的镜像里不是一个好的做法。理想情况下,你会希望将配置与应用程序镜像分开管理好匹配不同的部署环境。在Kubernetes项目里这就是ConfigMap 发挥作用的地方。

ConfigMap使您可以将应用配置从应用程序的镜像内容中分离出来。这使得你的容器化应用程序在Kubernetes里更具可移植性,而无需担心配置。用户和系统组件都可以在ConfigMap中存储配置数据。

ConfigMap与另外一种API对象Secret有点类似 (后面会写文章单独介绍),但是它提供了一种管理非敏感信息的配置的方式。

怎么创建ConfigMap

ConfigMap的创建方式非常简单,你可以使用 kubectl create configmap 命令基于 目录、文件 或者字符串字面值来创建 ConfigMap:

kubectl create configmap <map-name> <data-source>

其中,<map-name> 是要设置的ConfigMap 名称,<data-source> 是要从中提取数据的目录、 文件或者字面值。

你可以使用kubectl describe 或者 kubectl get获取已创建的ConfigMap的信息。

下面我们来演示一下这三种创建ConfigMap的方式。

通过文件目录创建ConfigMap

要从目录创建ConfigMap,必须首先创建一个目存放配置文件的目录:

$ mkdir configmap-demo

然后将示例配置文件下载到目录中

wget https://kubernetes.io/examples/configmap/game.properties -O configure-pod-container/configmap/game.properties -O configmap-demo-gamewget https://kubernetes.io/examples/configmap/ui.properties -O configure-pod-container/configmap/ui.properties  -O configmap-demo-ui

下面是这l两个配置文件的内容,如果因为网络问题下载不到这个文件的话可以自己创建一个config-demo文件把内容粘贴进去。

enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAS
secret.code.allowed=true
secret.code.lives=30-----文件分割-----color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNice

接下来使用kubectl create configmap命令执行创建:

$ kubectl create configmap demo-configmap --from-file=configmap-demo
configmap "demo-configmap" created

,使用kubectl describe可以查看demo-configmap这个ConfigMap的描述:

$ kubectl describe configmap demo-configmapName:         demo-configmap
Namespace:    default
Labels:       <none>
Annotations:  <none>Data
====
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
ui.properties:
----
color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNiceEvents:  <none>

可以看到ConfigMap会把两个文件的内容作为其数据条目。

通过文件创建ConfigMap

从文件创建ConfigMap与从目录创建非常相似。需要做的就是将文件名传递给–-from-file参数。通过这种方式创建ConfigMap时,你可以根据需要多次使用--from-file参数,将多个文件数据源添加到ConfigMap中。

kubectl create configmap configmap-demo-2 \
--from-file=configmap-demo-game \
--from-file=configmap-demo-ui

直接用字符串创建ConfigMap

通过这种方式创建ConfigMap意味着您可以直接从命令行指定配置,而无需创建任何文件或目录。比如使用命令** kubectl create ConfigMap special-config –from-literal=special.how=very –from-literal=special.type=charm**。

你可以传入多个键值对。命令行中提供的每对键值在 ConfigMap 的 data 部分中均表示为单独的条目。

kubectl get configmap special-config -o yaml

输出类似以下内容:

apiVersion: v1
kind: ConfigMap
metadata:creationTimestamp: 2020-10-30T19:14:38Zname: special-confignamespace: defaultresourceVersion: "3"selfLink: /api/v1/namespaces/default/configmaps/special-configuid: fcddce046-d653-71eb-8f30-68f728db1988
data:special.how: veryspecial.type: charm

在Pod里使用ConfigMap

用 ConfigMap 中的数据定义容器环境变量

将上面用字符串键值对直接创建的ConfigMap 中定义的 special.how 值分配给下面YAML文件里定义的Pod的环境变量 SPECIAL_LEVEL_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:# 通过名字指定要引用的ConfigMap对象name: special-config# 指定引用ConfigMap里的那个数据条目key: special.howrestartPolicy: Never

上面在Pod的spec.env定义环境变量SPECIAL_LEVEL_KEY时通过valueFromconfigMapKeyRef键告诉Pod要从ConfigMap中引用值,具体使用哪个ConfigMap对象里的那个数据条目则是通过namekey再去进一步指定。

将 ConfigMap 挂载到数据卷

在 Pod 定义的 spec.volumes 字段下添加 ConfigMap对象的名称。这会将 ConfigMap 数据以文件的形式添加到容器定义部分 volumeMounts.mountPath 的指定的挂载目录中(在下面的例子中为 /etc/config)。在容器中即可通过目录/etc/config下的文件使用ConfigMap中定义的数据条目,比如这里定义的容器启动命令就是容器启动后使用ls查看/etc/config目录下配置文件:

// pod-configmap-volume.yaml
apiVersion: v1
kind: Pod
metadata:name: dapi-test-pod
spec:containers:- name: test-containerimage: k8s.gcr.io/busyboxcommand: [ "/bin/sh", "-c", "ls /etc/config/" ]volumeMounts:- name: config-volumemountPath: /etc/configvolumes:- name: config-volumeconfigMap:# Provide the name of the ConfigMap containing the files you want# to add to the containername: special-configrestartPolicy: Never

创建 Pod:

kubectl create -f pod-configmap-volume.yaml

Pod 运行时,命令 ls /etc/config/ 产生下面的输出:

SPECIAL_LEVEL
SPECIAL_TYPE

在Pod的YAML定义文件里,ConfigMap引用配置中 使用path 字段为特定的 ConfigMap 项目指定预期的文件名。在这里,SPECIAL_LEVEL 将挂载在 config-volume 数据卷中 /etc/config/keys 路径下。

apiVersion: v1
kind: Pod
metadata:name: dapi-test-pod
spec:containers:- name: test-containerimage: k8s.gcr.io/busyboxcommand: [ "/bin/sh","-c","cat /etc/config/keys" ]volumeMounts:- name: config-volumemountPath: /etc/configvolumes:- name: config-volumeconfigMap:name: special-configitems:- key: SPECIAL_LEVELpath: keysrestartPolicy: Never

Pod 运行时,命令 cat /etc/config/keys 产生以下输出:

very

近期文章推荐

gRPC服务注册发现及负载均衡的实现方案与源码解析

- END -

关注公众号,获取更多精选技术原创文章

ConfigMap用管理对象的方式管理配置相关推荐

  1. 13、用 k8s 管理机密信息Secret、查看 Secret、volume 方式使用 Secret、环境变量方式使用 Secret、用 ConfigMap 管理配置

    用 k8s 管理机密信息Secret 应用启动过程中可能需要一些敏感信息,比如访问数据库的用户名密码或者秘钥.将这些信息直接保存在容器镜像中显然不妥,Kubernetes 提供的解决方案是 Secre ...

  2. 管理表空间和数据文件——使用OMF方式管理表空间

    当使用omf方式管理表空间,需要配置初始化参数db_create_dest.当建立omf表空间会自动建立数据文件,当删除omf表空间时会自动删除omf文件.当使用omf方式管理数据文件时,如果不指定数 ...

  3. MongoDB Wiredtiger存储引擎实现原理——Copy on write的方式管理修改操作,Btree cache...

    转自:http://www.mongoing.com/archives/2540 传统数据库引擎的数据组织方式,一般存储引擎都是采用 btree 或者 lsm tree 来实现索引,但是索引的最小单位 ...

  4. SpringBoot面向切面编程-用AOP方式管理日志

    面向切面编程 认识AOP AOP(Aspect Oriented Program,面向切面编程)把业务功能分为核心.非核心两部分. 核心业务功能 非核心业务功能 用户登录,增加数据,删除数据 性能统计 ...

  5. 关于SpringAOP的XML方式的配置

    AOP(XML)[理解][应用][重点] 1.AOP基础实例 A.导入jar包 核心包(4个)         日志(2个)             AOP(4个) Spring进行AOP开发(1个) ...

  6. SSM整合之XML方式,与配置事务,拦截器,异常处理,PageHelper分页插件整合

    SSM整合之XML方式 将主流的三大框架整合一起使用 spring:将需要的bean交给IOC管理 SpringMVC:解决表现层 MyBatis:解决持久层 创建maven项目(配置文件与代码中注释 ...

  7. spring,mybatis事务管理配置与@Transactional注解使用[转]

    spring,mybatis事务管理配置与@Transactional注解使用[转] spring,mybatis事务管理配置与@Transactional注解使用 概述 事务管理对于企业应用来说是至 ...

  8. 《Puppet实战手册》——1.4 利用Git管理配置清单

    本节书摘来自异步社区<Puppet实战手册>一书中的第1章,第1.4节,作者:[英]John Arundel著,更多章节内容可以访问云栖社区"异步社区"公众号查看 1. ...

  9. H3C交换机配置远程管理配置

    H3C交换机配置远程管理配置 一.WEB方式 『WEB方式远程管理交换机配置流程』 首先必备条件要保证PC可以与SwitchB通信,比如PC可以ping通SwitchB. 如果想通过WEB方式管理交换 ...

最新文章

  1. mysql proxy性能差_两种MySQL-Proxy架构的测试对比记录
  2. python开源代码-这7个开源的Python库,让你轻松代码分析
  3. Leetcode周赛5193. 删除字符使字符串变好
  4. memcached(九)--LRU
  5. Swoole之I/O操作
  6. 【转】Windows Server2008 R2下安装Oracle 10g
  7. Node Version Manager--NodeJS的多版本管理工具--轻松实现多个版本的NodeJS的管理开发
  8. java基础—Objcet中的equals方法重写
  9. Apache Dubbo集群容错
  10. 斯皮尔曼相关系数计算的python代码
  11. 51单片机模块化编程
  12. php实现把二叉树打印成多行(谋而后动,写好算法思路,不然浪费超多时间而且还是错误代码,而且精力消耗会导致代码正确率下降以及低级错误)...
  13. 2017美国数学建模ICM D题 优化机场安全的乘客吞吐量检查点(Optimizing the Passenger Throughput at an Airport Security Checkpo)
  14. 轻松恢复U盘隐藏文件
  15. 两张人脸图像比对ocr技术
  16. httpwebrequest下载文件失败的解决方案
  17. 产品经理分析问题的方法论——黄金圈法则
  18. 使用Qt Quick创建你的塞班手机程序(一)
  19. Redis实战之查询缓存
  20. 简单移动平均线(Simple Moving Average,SMA) 定义及使用

热门文章

  1. 微信小程序黑客马拉松即将开始,来做最酷的 Mini Program Creators! 1
  2. 教你 Shiro + SpringBoot 整合 JWT
  3. PowerShell 扩展工具第四波!
  4. python-object-twoxml-html_1
  5. [转] React风格的企业前端技术
  6. ros中move_group的参数动态设置
  7. eNSP模拟器RIP2动态路由,DHCP服务,ACL流控,组合使用的拓扑网络
  8. The Distribution File System
  9. osip2 代码分析
  10. WCF学习之旅—WCF概述(四)