k8s | 深入理解 ConfigMap
应用程序的运行可能会依赖一些配置,而这些配置又是可能会随着需求产生变化的,ConfigMap组件可以很好的帮助我们实现应用和配置分离。
ConfigMap
是一种API对象,用来将非机密性的数据保存到键值对中。使用时,Pods
可以将其用作环境变量、命令行参数或者存储卷中的配置文件。ConfigMap
将环境配置信息和容器镜像解耦,便于应用配置的修改
ConfigMap的创建
使用key-value 字符串创建
kubectl create configmap config-test-1 --from-literal=name=xiaoming --from-literal=age=22
查看结果,将会以map的形式展现出来
kubectl get configmap config-test-1 -o go-template='{{.data}}'
从env文件创建
创建 config.env 文件
name=robking
age=20
# 通过文件创建
kubectl create configmap config-test-2 --from-env-file=config.env
查看内容
kubectl get configmap config-test-2 -o go-template='{{.data}}'
从目录创建
创建对应的目录
$ mkdir config
$ echo 18>config/age
$ echo xiaohua>config/name
通过目录创建
kubectl create configmap config-test-3 --from-file=config/
查看内容
kubectl get configmap config-test-3 -o go-template='{{.data}}'
通过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的使用
首先需要创建 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: gcr.io/google_containers/busybox
command: ["/bin/sh", "-c", "cat /etc/config/special.how"]
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
root@dapi-test-pod:/# ls /etc/nginx/
conf.d fastcgi_params koi-utf koi-win mime.types modules nginx.conf scgi_params special.how uwsgi_params win-utf
root@dapi-test-pod:/# cat /etc/nginx/special.how
very
root@dapi-test-pod:/#
不可变ConfigMap
当集群包含大量 ConfigMap 和 Secret 时,大量的 watch 事件会急剧增加 kube-apiserver 的负载,并会导致错误配置过快传播到整个集群。在这种情况中,给不需要经常修改的 ConfigMap 和 Secret 设置 immutable: true
就可以避免类似的问题。
不可变 ConfigMap 的好处包括:
- 保护应用,使之免受意外更新所带来的负面影响。
- 通过大幅降低对 kube-apiserver 的压力提升集群性能,这是因为 Kubernetes 会关闭不可变 ConfigMap 的监视操作。
apiVersion: v1
kind: ConfigMap
metadata:
...
data:
...
immutable: true
评论区