我最新最全的文章都在南瓜慢说 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有以下四种方式:

  1. 在容器命令和参数内
  2. 容器的环境变量
  3. 在只读卷里面添加一个文件,让应用来读取
  4. 编写代码在 Pod 中运行,使用 Kubernetes API 来读取 ConfigMap

其中第1种和第2种方式类似,只是启动命令添加环境变量,所以还是要把ConfigMap映射为容器的环境变量。

第4种方式要访问API,可以使用相关的库,如Spring Cloud Kubernetes,这里不再介绍。

所以我们主要讲解第2、3种方式。

3.1 Pod的环境变量映射

ConfigMap的值映射到环境变量,主要有两种方式,valueFromenvFrom

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

5 总结

SecretConfigMap的创建与使用也是类似的,不再详细介绍了。

代码请查看:https://github.com/LarryDpk/pkslow-samples


欢迎关注微信公众号<南瓜慢说>,将持续为你更新...

多读书,多分享;多写作,多整理。

最新文章

  1. 一篇文章看懂TPCx-BB(大数据基准测试工具)源码
  2. ElasticSearch 5学习(3)——单台服务器部署多个节点
  3. Intent的七大组件——Android开发之路5
  4. python Web开发框架-Django (2)
  5. 第一章 第一个spring boot程序(转载)
  6. java9-9 匿名内部类
  7. NFS挂载启动
  8. Linux命令(4):cat命令
  9. JavaScript 要点(十四)HTML DOM 元素(节点)
  10. jquery ajax 报交请求返回 HTTP 400 错误
  11. devexpress中gridview控件编辑时改变输入法状态
  12. Eclipse SVN 安装注意事项
  13. 《Linux Device Drivers》第十四章 Linux 设备型号
  14. css3动画图片波纹效果
  15. pip 警告!The default format will switch to columns in the future
  16. 嵌入式Linux基于framebuffer的jpeg格式本地LCD屏显示
  17. JDK和tomcat的安装配置
  18. SpringMVC中Json数据格式转换
  19. #035 大数阶乘 PTA题目6-10 阶乘计算升级版 (20 分)
  20. PHP配置文件php.ini详解

热门文章

  1. 前端面试 CSS三大特性
  2. Spring Cloud Gateway之动态路由(数据库版)
  3. 关于__new__和__call__的想法
  4. 发现数据结构与算法之美的第n次重新学习 ——— 初遇数据结构与算法(了解)
  5. [bug] Nginx:src/os/unix/ngx_user.c:36:7: 错误:‘struct crypt_data’没有名为‘current_salt’的成员
  6. commit信息修改
  7. 用PHP爬取知乎的100万用户
  8. 9.2-3 pstree &amp; pgrep
  9. Docker无法正常启动的原因及解决办法
  10. unity texture 占用内存大小对比