Kubernetes ConfigMap详解,多种方式创建、多种方式使用
我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶!
1 简介
配置是程序绕不开的话题,在Kubernetes
中使用ConfigMap
来配置,它本质其实就是键值对。本文讲解如何通过5种方式创建ConfigMap
,通过4种方式使用ConfigMap
。
2 创建ConfigMap
按大类可分为两种方式,细分共有五种方式:
(一)kubectl create configmap
创建
(1)通过命令行参数字面直接创建
(2)通过指定文件创建
(3)通过指定目录创建
(4)通过指定环境变量配置文件创建
(二)yaml
文件创建
2.1 通过命令kubectl create configmap
创建
2.1.1 从字面创建
命令如下:
$ kubectl create configmap pkslow-literal \
--from-literal=pkslow.name=Larry \
--from-literal=pkslow.age=18 \
--from-literal=pkslow.webSite=www.pkslow.com
通过参数--from-literal
直接指定键值对。这种方式比较适用于临时测试使用,而且不适合配置很多的情况。
查看内容如下:
$ kubectl get configmaps pkslow-literal -o yaml
:
apiVersion: v1
data:
pkslow.age: "18"
pkslow.name: Larry
pkslow.webSite: www.pkslow.com
kind: ConfigMap
metadata:
name: pkslow-literal
namespace: default
2.1.2 从文件创建
application.yaml文件内容如下:
server:
port: 8080
pkslow:
name: Larry
age: 18
webSite: www.pkslow.com
application-uat.yaml文件内容如下:
server:
port: 8080
pkslow:
name: LarryDpk
age: 20
webSite: https://www.pkslow.com
命令如下:
$ kubectl create configmap pkslow-file \
--from-file=application.yaml \
--from-file=application-uat.yaml
通过参数--from-file
来指定文件。查看内容如下:
$ kubectl get configmaps pkslow-file -o yaml
:
apiVersion: v1
data:
application-uat.yaml: |-
server:
port: 8080
pkslow:
name: LarryDpk
age: 20
webSite: https://www.pkslow.com
application.yaml: |-
server:
port: 8080
pkslow:
name: Larry
age: 18
webSite: www.pkslow.com
kind: ConfigMap
metadata:
name: pkslow-file
namespace: default
可以看到它的key
为文件名,因为我们没有指定,所以默认为文件名。需要指定则如下:
$ kubectl create configmap pkslow-file \
--from-file=app=application.yaml \
--from-file=uat=application-uat.yaml
2.1.3 从目录创建
命令如下:
$ kubectl create configmap pkslow-directory --from-file=./
如上一种方式没有太大差别,只是--from-file
后面的参数是目录,而不是文件。
2.1.4 从环境变量配置文件创建
配置文件pkslow.env内容如下:
PKSLOW_NAME=Larry
PKSLOW_AGE=18
PKSLOW_WEBSITE=www.pkslow.com
创建命令如下:
$ kubectl create configmap pkslow-env --from-env-file=pkslow.env
查看内容如下:
kubectl get configmaps pkslow-env -o yaml
:
apiVersion: v1
data:
PKSLOW_AGE: "18"
PKSLOW_NAME: Larry
PKSLOW_WEBSITE: www.pkslow.com
kind: ConfigMap
metadata:
name: pkslow-env
namespace: default
细心的朋友应该能发现,这种方式如之前的从文件创建很不一样。它的(key, value)
不是(文件名,文件内容)
,而是文件中一个个的配置。
2.2 通过yaml
文件创建
通过yaml
文件创建就很常规了,跟普通的kubernetes
资源创建没有什么区别。先准备yaml
文件如下:
apiVersion: v1
kind: ConfigMap
metadata:
name: pkslow-yaml
data:
PKSLOW_AGE: "18"
PKSLOW_NAME: Larry
PKSLOW_WEBSITE: www.pkslow.com
application-uat.yaml: |-
server:
port: 8080
pkslow:
name: LarryDpk
age: 20
webSite: https://www.pkslow.com
application.yaml: |-
server:
port: 8080
pkslow:
name: Larry
age: 18
webSite: www.pkslow.com
再通过以下文件创建:
$ kubectl apply -f configmap.yaml
3 Pod使用ConfigMap
在Pod
中使用ConfigMap
有以下四种方式:
- 在容器命令和参数内
- 容器的环境变量
- 在只读卷里面添加一个文件,让应用来读取
- 编写代码在 Pod 中运行,使用 Kubernetes API 来读取 ConfigMap
其中第1种和第2种方式类似,只是启动命令添加环境变量,所以还是要把ConfigMap
映射为容器的环境变量。
第4种方式要访问API
,可以使用相关的库,如Spring Cloud Kubernetes
,这里不再介绍。
所以我们主要讲解第2、3种方式。
3.1 Pod的环境变量映射
把ConfigMap
的值映射到环境变量,主要有两种方式,valueFrom
和envFrom
。
3.1.1 valueFrom一一映射
通过valueFrom
来配置环境变量,Pod
的环境变量名与ConfigMap
不必相同。
apiVersion: v1
kind: Pod
metadata:
name: pkslow-env-value-from
spec:
containers:
- name: test-container
image: busybox
command: [ "/bin/sh", "-c", "env" ]
env:
- name: PKSLOW_NAME
valueFrom:
configMapKeyRef:
name: pkslow-yaml
key: PKSLOW_NAME
- name: PKSLOW_WEBSITE
valueFrom:
configMapKeyRef:
name: pkslow-yaml
key: PKSLOW_WEBSITE
restartPolicy: Never
查看结果如下:
$ kubectl logs -f pkslow-env-value-from | grep PKSLOW
PKSLOW_WEBSITE=www.pkslow.com
PKSLOW_NAME=Larry
NOTE:当然也可以把application-uat.yaml
这种文件映射成环境变量,但因为文件内容可能是多行的,我们一般不会这样做。
3.1.2 envFrom全部映射
通过envFrom
会把ConfigMap
的所有键值对都映射到Pod
的环境变量中去。使用如下:
apiVersion: v1
kind: Pod
metadata:
name: pkslow-env-env-from
spec:
containers:
- name: test-container
image: busybox
command: [ "/bin/sh", "-c", "env" ]
envFrom:
- configMapRef:
name: pkslow-yaml
restartPolicy: Never
查看环境变量如下:
$ kubectl logs -f pkslow-env-env-from
PKSLOW_WEBSITE=www.pkslow.com
PKSLOW_AGE=18
PKSLOW_NAME=Larry
application.yaml=server:
port: 8080
pkslow:
name: Larry
age: 18
webSite: www.pkslow.com
application-uat.yaml=server:
port: 8080
pkslow:
name: LarryDpk
age: 20
webSite: https://www.pkslow.com
显然看起来这种方式更简便,不用每个环境变量都配一遍,但它可能会带来脏数据,就看怎么使用了。
3.2 加载文件
3.2.1 通过volume加载
可以通过volume
的方式把ConfigMap
加载进Pod
,如下:
apiVersion: v1
kind: Pod
metadata:
name: pkslow-mount-volume
spec:
volumes:
- name: config-volume
configMap:
name: pkslow-yaml
containers:
- name: test-container
image: busybox
command: [ "/bin/sh", "-c", "sleep 1000000" ]
imagePullPolicy: IfNotPresent
volumeMounts:
- name: config-volume
mountPath: /data/config
restartPolicy: Never
进入Pod
,查看内容如下:
$ kubectl exec -it pkslow-mount-volume -- /bin/sh
/ # cd /data/config/
/data/config # ls -lrt
total 0
lrwxrwxrwx 1 root root 23 Feb 21 17:10 application.yaml -> ..data/application.yaml
lrwxrwxrwx 1 root root 27 Feb 21 17:10 application-uat.yaml -> ..data/application-uat.yaml
lrwxrwxrwx 1 root root 21 Feb 21 17:10 PKSLOW_WEBSITE -> ..data/PKSLOW_WEBSITE
lrwxrwxrwx 1 root root 18 Feb 21 17:10 PKSLOW_NAME -> ..data/PKSLOW_NAME
lrwxrwxrwx 1 root root 17 Feb 21 17:10 PKSLOW_AGE -> ..data/PKSLOW_AGE
/data/config # cat PKSLOW_WEBSITE
www.pkslow.com
/data/config # cat application.yaml
server:
port: 8080
pkslow:
name: Larry
age: 18
webSite: www.pkslow.com
如果只想要ConfigMap
的部分内容,并自定义文件名,可通过items
来配置,如下:
apiVersion: v1
kind: Pod
metadata:
name: pkslow-mount-volume
spec:
volumes:
- name: config-volume
configMap:
name: pkslow-yaml
items:
- key: application.yaml
path: app.yaml
- key: application-uat.yaml
path: uat.yaml
containers:
- name: test-container
image: busybox
command: [ "/bin/sh", "-c", "sleep 1000000" ]
imagePullPolicy: IfNotPresent
volumeMounts:
- name: config-volume
mountPath: /data/config
restartPolicy: Never
3.2.2 通过subPath加载
通过配置subPath
字段,把文件一个一个加载到Pod
中去。
apiVersion: v1
kind: Pod
metadata:
name: pkslow-mount-subpath
spec:
volumes:
- name: config-volume
configMap:
name: pkslow-yaml
containers:
- name: test-container
image: busybox
command: [ "/bin/sh", "-c", "sleep 1000000" ]
imagePullPolicy: IfNotPresent
volumeMounts:
- name: config-volume
mountPath: /data/config/dev.yaml
subPath: application.yaml
- name: config-volume
mountPath: /data/config/uat.yaml
subPath: application-uat.yaml
restartPolicy: Never
查看内容如下:
$ kubectl exec -it pkslow-mount-subpath -- /bin/sh
/ # cd /data/config/
/data/config # ls -lrt
total 8
-rw-r--r-- 1 root root 89 Feb 21 17:31 uat.yaml
-rw-r--r-- 1 root root 78 Feb 21 17:31 dev.yaml
/data/config # cat dev.yaml
server:
port: 8080
pkslow:
name: Larry
age: 18
webSite: www.pkslow.com
/data/config # cat uat.yaml
server:
port: 8080
pkslow:
name: LarryDpk
age: 20
webSite: https://www.pkslow.com
4 不可变的ConfigMap
可以禁止修改ConfigMap
,好处有:
- 保护应用,使之免受意外(不想要的)更新所带来的负面影响。
- 通过大幅降低对 kube-apiserver 的压力提升集群性能,这是因为系统会关闭 对已标记为不可变更的 ConfigMap 的监视操作。
此功能特性由 ImmutableEphemeralVolumes
特性门控 来控制。你可以通过将 immutable
字段设置为 true
创建不可变更的 ConfigMap。 例如:
apiVersion: v1
kind: ConfigMap
metadata:
...
data:
...
immutable: true
一旦某 ConfigMap 被标记为不可变更,则 无法 逆转这一变化,也无法更改 data
或 binaryData
字段的内容。你只能删除并重建 ConfigMap。 因为现有的 Pod 会维护一个对已删除的 ConfigMap 的挂载点,建议重新创建 这些 Pods。
5 总结
Secret
与ConfigMap
的创建与使用也是类似的,不再详细介绍了。
代码请查看:https://github.com/LarryDpk/pkslow-samples
欢迎关注微信公众号<南瓜慢说>,将持续为你更新...
多读书,多分享;多写作,多整理。
Kubernetes ConfigMap详解,多种方式创建、多种方式使用的更多相关文章
- kubernetes 控制器详解【持续完善中】
目录 资源创建详解 一:Pod及常用参数 1.简介 2.模板 3.删除pod 4.设置Pod主机名 5.镜像拉取策略(ImagePullPolicy) 二:RC 1.简介 2.模板 三:Deploym ...
- LVS原理详解(3种工作方式8种调度算法)--老男孩
一.LVS原理详解(4种工作方式8种调度算法) 集群简介 集群就是一组独立的计算机,协同工作,对外提供服务.对客户端来说像是一台服务器提供服务. LVS在企业架构中的位置: 以上的架构只是众多企业里面 ...
- 详解 清除浮动 的多种方式(clearfix)
说明 本文适合知道HTML 与 CSS基础知识的读者,或者想要了解清除浮动背后原理的读者! 1.什么是浮动 首先我们需要知道定位 元素在页面中的位置就是定位,解决问题之前我们先来了解下几种定位方式 : ...
- Kubernetes K8S之存储ConfigMap详解
K8S之存储ConfigMap概述与说明,并详解常用ConfigMap示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS ...
- Kubernetes Controller详解
运行容器化应用是Kubernetes最重要的核心功能.为满足不同的业务需要,Kubernetes提供了多种Controller,主要包括Deployment.DaemonSet.Job.CronJob ...
- 详解Oracle手动创建数据库几大步骤
在这里我们将介绍Oracle手动创建数据库几大步骤,包括前期的准备工作,以及具体的实施. Oracle手动创建数据库是本文介绍的重点,希望通过本文能帮助大家更好的利用Oracle.51CTO也向您推荐 ...
- parted分区详解 查看UUID两种方式 blkid 和 ls -l /dev/disk/by-uuid
通常我们用的比较多的一般都是fdisk工具来进行分区,但是现在由于磁盘越来越廉价,而且磁盘空间越来越大:而fdisk工具他对分区是有大小限制的,它只能划分小于2T的磁盘.但是现在的磁盘空间很多都已经是 ...
- 详解Tensorflow数据读取有三种方式(next_batch)
转自:https://blog.csdn.net/lujiandong1/article/details/53376802 Tensorflow数据读取有三种方式: Preloaded data: 预 ...
- Kubernetes Pod详解
目录 基本概念 pod资源配额 容器的健康检查 静态pod 基本概念 Pod是kubernetes集群中最基本的资源对象.每个pod由一个或多个业务容器和一个根容器(Pause容器)组成.Kubern ...
随机推荐
- c#RSA 私钥加签公钥解签
/// RSA签名 /// </summary> /// <param name="data">待签名数据</param> /// <pa ...
- opencv——轮廓发现与轮廓(二值图像)分析
引言 二值图像分析最常见的一个主要方式就是轮廓发现与轮廓分析,其中轮廓发现的目的是为轮廓分析做准备,经过轮廓分析我们可以得到轮廓各种有用的属性信息. 这里顺带提下边缘检测,和轮廓提取的区别: 边缘检测 ...
- php-round()四舍六入
今天被问到了四舍六入的问题,好吧,第一次听说.后来查询之后说是银行家算法用的 摘自PHP官方文档.http://php.net/manual/zh/function.round.php (PHP 4, ...
- 【转载】CentOS 7 系统区域(语言)和键盘设置
CentOS 7 系统区域(语言)和键盘设置 即使是在window中,平常说的语言设置这一项也是归类为系统区域,CentOS可以通过修改/etc/locale.conf配置文件或使用localec ...
- SQL注入和XSS攻击
SQL注入 定义:黑客通过在请求的数据中填入特殊字符,影响服务器数据库操作程序正常执行,从而达到攻击的目的. 形式: 拼接SQL: 登录验证:前台输入 username:yan password:12 ...
- Linux进阶之LAMP和LNMP动态网站搭建
一.什么是LAMP LAMP=Linux Apache Mysql/MariaDB PHP/Perl/Python 这些软件都是开源免费的软件,几个程序各自是独立的,经常为了达到我们需要的效果而协同工 ...
- C语言函数sscanf()的用法-(转自Walter L)
在我的学习过程中,从文件读取数据是一件很麻烦的事,所幸有sscanf()函数. C语言函数sscanf()的用法sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型: int ss ...
- vue 表格中的下拉框单选、多选处理
最近在用vue做前后端分离,需要在表格中用到下拉框,由于需求变动,从最开始的单选变为多选,折腾了许久,记录一下,供后人铺路 vue 中的表格下拉框单选 collectionsColnumOptions ...
- 郑政 | 2021软件代码开发技术作业四 | 需求改进&系统设计
需求改进&系统设计 -------------------------------------------------------------------------------------- ...
- Task类学习教程—组合任务ContinueWith
Task类学习教程-组合任务.ContinueWith 一.简介 通过任务,可以指定在任务完成之后,应开始运行之后另一个特定任务.ContinueWith是Task根据其自身状况,决定后续应该作何操作 ...