目 录CONTENT

文章目录

k8s | 深入理解 ConfigMap

RobKing
2023-07-19 / 0 评论 / 0 点赞 / 225 阅读 / 1,109 字

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

参考链接

0

评论区