理解ConfigMap

什么是ConfigMap

首先来弄明白为什么需要ConfigMap。对于应用开发来讲,特别是后端开发。我们需要连接数据库,mysql,redis..。这些连接,我们在测试环境,生成环境用的是多套。这就意味着,我们的代码中有一些配置需要经常改动。所以ConfigMap就是解决这些问题的。

ConfigMap是一种API对象,用来将非机密性的数据保存到键值对中。使用时,Pods可以将其用作环境变量、命令行参数或者存储卷中的配置文件。

ConfigMap将环境配置信息和容器镜像解耦,便于应用配置的修改。

不过需要注意的是ConfigMap本身不提供加密功能。如果要存储的数据是机密的,使用Secret,或者使用其他第三方工具来保证你的数据的私密性,而不是用ConfigMap

ConfigMap在设计上不是用来保存大量数据的。在ConfigMap中保存的数据不可超过1 MiB。如果你需要保存超出此尺寸限制的数据,你可能希望考虑挂载存储卷或者使用独立的数据库或者文件服务。

ConfigMap的创建

可以使用kubectl create configmap从文件、目录或者key-value字符串创建等创建ConfigMap。也可以通过kubectl create -f file创建。

使用key-value 字符串创建

创建name和age

$ kubectl create configmap config-test-1 --from-literal=name=xiaoming  --from-literal=age=22

查看结果

$ kubectl get configmap config-test-1 -o go-template='{{.data}}'
map[age:22 name:xiaoming]#

从env文件创建

创建env文件

$ echo -e "name=xiaobai\nage=25" | tee config.env
name=xiaobai
age=25

写入config-test-1内容

$ kkubectl create configmap config-test-2 --from-env-file=config.env
configmap/config-test-2 created

查看内容

$ kubectl get configmap config-test-2 -o go-template='{{.data}}'
map[age:25 name:xiaobai]#

从目录创建

创建对应的目录

$ mkdir config
$ echo 18>config/age
$ echo xiaohua>config/name

写入config-test-3内容

$ kubectl create configmap config-test-3 --from-file=config/
configmap/config-test-3 created

查看写入的内容

$ kubectl get configmap config-test-3 -o go-template='{{.data}}'
map[age:18
name:xiaohua
]#

通过Yaml/Json创建

apiVersion: v1
kind: ConfigMap
metadata:
name: config-test-4
namespace: default
data:
name: xiaolong
age: 16year # 需要是string

创建

$ kubectl create  -f config-test-4.yaml
configmap/config-test-4 created

ConfigMap使用

ConfigMap可以通过三种方式在Pod中使用,三种分别方式为:设置环境变量、设置容器命令行参数以及在Volume中直接挂载文件或目录。

需要注意的点

ConfigMap 必须在 Pod 引用它之前创建

使用 envFrom 时,将会自动忽略无效的键

Pod 只能使用同一个命名空间内的 ConfigMap

首先创建 ConfigMap:

$ kubectl create configmap special-config --from-literal=name=long --from-literal=realname=xiaolong
$ kubectl create configmap env-config --from-literal=log_level=INFO

用作环境变量

apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
containers:
- name: test-container
image: busybox
command: ["/bin/sh", "-c", "env"]
env:
- name: SPECIAL_NAME_KEY
valueFrom:
configMapKeyRef:
name: special-config
key: name
- name: SPECIAL_REALNAME_KEY
valueFrom:
configMapKeyRef:
name: special-config
key: realname
envFrom:
- configMapRef:
name: env-config
restartPolicy: Never

运行之后查看日志

$ kubectl logs -f test-pod
HOSTNAME=test-pod
SPECIAL_NAME_KEY=long
log_level=INFO
SPECIAL_REALNAME_KEY=xiaolong

发现上面的值已成功写入了

用作命令参数

ConfigMap用作命令行参数时,需要先把ConfigMap的数据保存在环境变量中,然后通过$(VAR_NAME)的方式引用环境变量。

apiVersion: v1
kind: Pod
metadata:
name: dapi-test-pod
spec:
containers:
- name: test-container
image: gcr.io/google_containers/busybox
command: ["/bin/sh", "-c", "echo $(SPECIAL_NAME_KEY) $(SPECIAL_REALNAME_KEY)" ]
env:
- name: SPECIAL_NAME_KEY
valueFrom:
configMapKeyRef:
name: special-config
key: name
- name: SPECIAL_REALNAME_KEY
valueFrom:
configMapKeyRef:
name: special-config
key: realname
restartPolicy: Never

运行之后打印日志

$ kubectl logs -f dapi-test-pod
long xiaolong

输出我们之前的写入的配置信息

使用volume将ConfigMap作为文件或目录直接挂载

将创建的ConfigMap直接挂载至 Pod 的/etc/config目录下,其中每一个key-value键值对都会生成一个文件,key为文件名,value为内容

apiVersion: v1
kind: Pod
metadata:
name: vol-test-pod
spec:
containers:
- name: test-container
image: busybox
command: ["/bin/sh", "-c", "cat /etc/config/name"]
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: special-config
restartPolicy: Never

启动之后打印输出

$ kubectl logs -f vol-test-pod
long#

使用subpath将ConfigMap作为单独的文件挂载到目录

在一般情况下configmap挂载文件时,会先覆盖掉挂载目录,然后再将congfigmap中的内容作为文件挂载进行。如果想不对原来的文件夹下的文件造成覆盖,只是将configmap中的每个 key,按照文件的方式挂载到目录下,可以使用subpath参数。

apiVersion: v1
kind: Pod
metadata:
name: dapi-test-pod
spec:
containers:
- name: test-container
image: nginx
command: ["/bin/sh","-c","sleep 36000"]
volumeMounts:
- name: config-volume
mountPath: /etc/nginx/name
subPath: name
volumes:
- name: config-volume
configMap:
name: special-config
items:
- key: name
path: name
restartPolicy: Never

进入到pod中查看

root@dapi-test-pod:/etc/nginx# ls
conf.d mime.types name scgi_params
fastcgi_params modules nginx.conf uwsgi_params

被挂载的ConfigMap内容会被自动更新

当卷中使用的ConfigMap被更新时,所投射的键最终也会被更新。kubelet组件会在每次周期性同步时检查所挂载的ConfigMap是否为最新。 不过,kubelet使用的是其本地的高速缓存来获得ConfigMap的当前值。

ConfigMap既可以通过watch操作实现内容传播(默认形式),也可实现基于TTL的缓存,还可以直接经过所有请求重定向到API服务器。 因此,从ConfigMap被更新的那一刻算起,到新的主键被投射到Pod中去,这一 时间跨度可能与 kubelet 的同步周期加上高速缓存的传播延迟相等。 这里的传播延迟取决于所选的高速缓存类型 (分别对应watch操作的传播延迟、高速缓存的TTL时长或者 0)。

以环境变量方式使用的ConfigMap数据不会被自动更新。 更新这些数据需要重新启动Pod

不可变更的ConfigMap

Kubernetes特性 不可变更的SecretConfigMap提供了一种将各个SecretConfigMap设置为不可变更的选项。对于大量使用 ConfigMap 的 集群(至少有数万个各不相同的ConfigMapPod 挂载)而言,禁止更改ConfigMap的数据有以下好处:

  • 保护应用,使之免受意外(不想要的)更新所带来的负面影响。

  • 通过大幅降低对 kube-apiserver 的压力提升集群性能,这是因为系统会关闭 对已标记为不可变更的ConfigMap的监视操作。

可以通过将immutable字段设置为true创建不可变更的ConfigMap。 例如:

apiVersion: v1
kind: ConfigMap
metadata:
...
data:
...
immutable: true

一旦某ConfigMap被标记为不可变更,则 无法 逆转这一变化,,也无法更改databinaryData字段的内容。你只能删除并重建ConfigMap。 因为现有的Pod会维护一个对已删除的ConfigMap的挂载点,建议重新创建这些Pods

参考

【ConfigMap】https://kubernetes.io/zh/docs/concepts/configuration/configmap/

【ConfigMap】https://feisky.gitbooks.io/kubernetes/content/concepts/configmap.html

小白学k8s(10)-k8s中ConfigMap理解的更多相关文章

  1. 跟我一起学WCF(10)——WCF中事务处理

    一.引言 好久没更新,总感觉自己欠了什么一样的,所以今天迫不及待地来更新了,因为后面还有好几个系列准备些,还有很多东西需要学习总结的.今天就来介绍下WCF对事务的支持. 二.WCF事务详解 2.1 事 ...

  2. K8S(10)配置中心实战-configmap资源

    k8s配置中心实战-configmap资源 目录 k8s配置中心实战-configmap资源 0 configmap前置说明 0.1.1 configmap和secret 0.1.2 怎么使用conf ...

  3. 小白学k8s(7)helm[v3]使用了解

    helm使用 什么是helm 安装helm Helm V2 & V3 架构设计 配置kube config helm使用 添加仓库 helm安装nginx helm的核心概念 Chart Co ...

  4. K8s之实践Pod深入理解

      K8s之实践Pod深入理解 1.同一pod下的nginx+php+mysql nginx+php+mysql.yaml文件 --- apiVersion: v1 kind: Secret meta ...

  5. k8s集群中部署prometheus server

    1.概述 本文档主要介绍如何在k8s集群中部署prometheus server用来作为监控的数据采集服务器,这样做可以很方便的对k8s集群中的指标.pod的.节点的指标进行采集和监控. 2.下载镜像 ...

  6. 在k8s集群中安装rook-ceph 1.8版本步骤

    官方文档地址:https://rook.io/docs/rook/v1.8/quickstart.html Kubernetes 最小版本号 Kubernetes 最小版本号:Kubernetes v ...

  7. k8s 集群中的etcd故障解决

    一次在k8s集群中创建实例发现etcd集群状态出现连接失败状况,导致创建实例失败.于是排查了一下原因. 问题来源 下面是etcd集群健康状态: [root@docker01 ~]# cd /opt/k ...

  8. 小白学 Python(10):基础数据结构(列表)(下)

    人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...

  9. 小白学 Python 爬虫(10):Session 和 Cookies

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  10. 将 master 节点服务器从 k8s 集群中移除并重新加入

    背景 1 台 master 加入集群后发现忘了修改主机名,而在 k8s 集群中修改节点主机名非常麻烦,不如将 master 退出集群改名并重新加入集群(前提是用的是高可用集群). 操作步骤 ssh 登 ...

随机推荐

  1. CentOS 7上安装 Jenkins 2.346 -- yum 方式

    CentOS 7上安装 Jenkins -- yum 方式 装插件太麻烦了,最后选择了 装JAVA 11,安装最版本 Jenkins https://mirrors.jenkins.io/war/ 开 ...

  2. Jmeter对各种接口类型的测试

    JMeter对各种类型接口的测试 默认做接口测试前,已经给出明确的接口文档(如,http://test.nnzhp.cn/wiki/index.php?doc-view-59):本地配好了JMeter ...

  3. 【Go】函数高级 包的使用 gin框架入门 if-else 循环 switch 数组

    目录 昨日回顾 今日内容 1 函数高级 2 包的使用 3 gin框架使用 4 if-else 5 循环 6 switch 7 数组 昨日回顾 # 1 go 基础数据类型 -数字:整数,正整数,浮点数, ...

  4. 什么是「滑动窗口算法」(sliding window algorithm),有哪些应用场景?

    今天是算法数据结构专题的第2篇文章,我们一起来学习一下「滑动窗口算法」. 前言 最近刷到leetCode里面的一道算法题,里面有涉及到Sliding windowing算法,因此写一篇文章稍微总结一下 ...

  5. Codeforces Round #666 (Div. 2) 题解报告

    https://codeforces.com/contest/1397/problem/A 题意: 给定n个字符串,问重新组合以后是否能构成相同的n个字符串 思路: 直接判断所给的字符串的每种字母是否 ...

  6. Kite 使用教程 轻量级代码提示

    概述 今天看小甲鱼视频的VSC Python 安装教程里视频博主强烈推荐安装Kite插件 ,这是什么玩意? 下载下来试一试? 原来:就是一个代码提示插件.. 说白了" 就是让开发者 在轻量级 ...

  7. java字符串与json互转

    开发中经常遇到将字符串转成json和字符串转成json属组的方法,网上搜到的方法,好多都是不好用的,今天这里记录一下方便自己今后查看,也提供给需要的人. 依赖: <!-- 处理json --&g ...

  8. freeswitch设置最大呼叫时长

    概述 freeswitch 作为开源VOIP软交换,对经过fs的每一通电话都要有足够的控制. 在一通电话呼叫中,通话时长是一个重要的数据,客户在实际使用过程中,会有各种针对呼叫时长的场景需求. 本篇文 ...

  9. C# 几种常见数据结构(数组、链表、Hash表)

    一.内存上连续存储,节约空间,可以索引访问,读取快,增删慢 Array: 在内存上连续分配的,而且元素类型是一样的,可以坐标访问;读取快--增删慢,长度不变 { //Array:在内存上连续分配的,而 ...

  10. 问题--去除CSDN水印

    1.问题如上 有时候需要使用其中的图片,但是水印很让人烦恼 确实可以用PS中的修复画笔工具,修复工具等进行处理 但是当水印覆盖到字体时,就会破坏到原有字体 2.解决方式 从CSDN添加水印的方式入手 ...