Kubernetes(k8s)ConfigMap详解及应用

打印 上一主题 下一主题

主题 872|帖子 872|积分 2626

目录

一、ConfigMap概述

ConfigMap是k8s的一个配置管理组件,可以将配置以key-value的形式传递,通常用来保存不需要加密的配置信息,加密信息则需用到Secret,主要用来应对以下场景:


  • 使用k8s部署应用,当你将应用配置写进代码中,就会存在一个问题,更新配置时也需要打包镜像,ConfigMap可以将配置信息和docker镜像解耦
  • 使用微服务架构的话,存在多个服务共用配置的情况,如果每个服务中单独一份配置的话,那么更新配置就很麻烦,使用ConfigMap可以友好的进行配置共享
二、ConfigMap创建

可以使用 kubectl create configmap 从文件、目录或者 key-value 字符串创建等创建 ConfigMap。
1)通过命令行创建configmap(key-value键值对)
  1. $ kubectl create configmap configmapname --from-literal=key=value
  2. # 获取整个configmap 数据
  3. $ kubectl get configmap configmapname -o go-template='{{.data}}'
  4. # 查看详情
  5. $ kubectl describe configmap configmapname
  6. # 获取具体某个key值
  7. $ kubectl get configmap configmapname -o go-template='{{.data.key}}'
  8. # 删除
  9. $ kubectl delete configmap configmapname
  10. # 再查看
  11. $ kubectl get configmap configmapname
复制代码

2)通过文件创建configmap
  1. $ echo hello > test1.txt
  2. $ ehco world > test2.txt
  3. $ kubectl create configmap my-config --from-file=key1=test1.txt  --from-file=key2=test2.txt
  4. $ kubectl describe configmap my-config
复制代码

看到该configmap中有两个键值对,key1:hello 和 key2:world
3)通过文件夹创建configmap
  1. $ mkdir config
  2. $ echo hello > config/test1
  3. $ echo world > config/test2
  4. $ kubectl create configmap dir-config --from-file=config/
  5. $ kubectl describe configmap dir-config
复制代码

4)通过yaml文件创建
  1. $ cat << EOF > config.yaml
  2. apiVersion: v1
  3. kind: ConfigMap
  4. metadata:
  5. name: my-config2
  6. data:
  7. key1: hello
  8. key2: world
  9. EOF
复制代码
执行
  1. $ kubectl create -f config.yaml
  2. $ kubectl describe configmap my-config2
复制代码

三、ConfigMap简单使用

Pod可以通过三种方式来使用ConfigMap,分别为:

  • 将ConfigMap中的数据设置为环境变量
  • 将ConfigMap中的数据设置为命令行参数
  • 使用Volume将ConfigMap作为文件或目录挂载
【注意】

  • ConfigMap必须在Pod使用它之前创建
  • 使用envFrom时,将会自动忽略无效的键
  • Pod只能使用同一个命名空间的ConfigMap
1)用作环境变量

首先创建两个ConfigMap,分别名为special-config和env-config:
  1. $ kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm
  2. $ kubectl create configmap env-config --from-literal=log_level=INFO
复制代码
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: test-pod
  5. spec:
  6.   containers:
  7.     - name: test-container
  8.       image: busybox
  9.       command: [ "/bin/sh", "-c", "env" ]
  10.       env:
  11.         - name: SPECIAL_LEVEL_KEY
  12.           valueFrom:
  13.             configMapKeyRef:
  14.               name: special-config
  15.               key: special.how
  16.         - name: SPECIAL_TYPE_KEY
  17.           valueFrom:
  18.             configMapKeyRef:
  19.               name: special-config
  20.               key: special.type
  21.       envFrom:
  22.         - configMapRef:
  23.             name: env-config
  24.   restartPolicy: Never
复制代码
执行
  1. $ kubectl apply -f test-pod.yaml
  2. $ kubectl get pod test-pod
  3. # 查看pod日志输出env
  4. $ kubectl logs test-pod
复制代码
当pod运行结束后,环境变量中会多输出如下:
  1. SPECIAL_LEVEL_KEY=very
  2. SPECIAL_TYPE_KEY=charm
  3. log_level=INFO
复制代码

2)用作命令行参数

将ConfigMap用作命令行参数时,需要先把ConfigMap的数据保存在环境变量中,然后通过$(VAR_NAME)的方式引用环境变量。
  1. #test-pod-command-args.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5.   name: test-pod-command-args
  6. spec:
  7.   containers:
  8.     - name: test-container
  9.       image: busybox
  10.       command: [ "/bin/sh", "-c", "echo $(SPECIAL_LEVEL_KEY) $(SPECIAL_TYPE_KEY)" ]
  11.       env:
  12.         - name: SPECIAL_LEVEL_KEY
  13.           valueFrom:
  14.             configMapKeyRef:
  15.               name: special-config
  16.               key: special.how
  17.         - name: SPECIAL_TYPE_KEY
  18.           valueFrom:
  19.             configMapKeyRef:
  20.               name: special-config
  21.               key: special.type
  22.   restartPolicy: Never
复制代码
执行
  1. $ kubectl apply -f test-pod-command-args.yaml
  2. $ kubectl get pod test-pod-command-args -o wide
  3. $ kubectl get pod test-pod-command-args -o wide
复制代码

另开窗口执行,容器没起来,执行下面命令会报错
  1. $ kubectl logs -f test-pod-command-arg
复制代码
当pod运行结束后,它的输出如下:
very charm

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

【示例1】将创建的ConfigMap直接挂载至Pod的/etc/config目录下,其中每一个key-value键值对都会生成一个文件,key为文件名,value为内容
  1. $ cat << EOF >test-pod-mount-volume.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5.   name: test-pod-mount-volume
  6. spec:
  7.   containers:
  8.     - name: test-container
  9.       image: busybox
  10.       command: [ "/bin/sh", "-c", "cat /etc/config/special.how" ]
  11.       volumeMounts:
  12.       - name: config-volume
  13.         mountPath: /etc/config
  14.   volumes:
  15.     - name: config-volume
  16.       configMap:
  17.         name: special-config
  18.   restartPolicy: Never
  19. EOF
复制代码
执行
  1. $ kubectl apply -f test-pod-mount-volume.yaml
  2. $ kubectl get pod test-pod-mount-volume -o wide
复制代码

当Pod结束后会输出:
  1. $ kubectl logs test-pod-mount-volume
复制代码

【示例2】将创建的ConfigMap中special.how这个key挂载到/etc/config目录下的一个相对路径/keys/special.level。如果存在同名文件,直接覆盖
  1. $ cat << EOF >test-pod-mount-volume-path.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5.   name: test-pod-mount-volume-path
  6. spec:
  7.   containers:
  8.     - name: test-container
  9.       image: busybox
  10.       command: [ "/bin/sh","-c","cat /etc/config/keys/special.level" ]
  11.       volumeMounts:
  12.       - name: config-volume
  13.         mountPath: /etc/config
  14.   volumes:
  15.     - name: config-volume
  16.       configMap:
  17.         name: special-config
  18.         items:
  19.         - key: special.how
  20.           path: keys/special.level
  21.   restartPolicy: Never
  22. EOF
复制代码
执行
  1. $ kubectl apply -f test-pod-mount-volume-path.yaml
  2. $ kubectl get pod test-pod-mount-volume-path -o wide
复制代码

当Pod结束后会输出:
  1. $ kubectl logs test-pod-mount-volume-path
复制代码

【示例3】在一般情况下 configmap 挂载文件时,会先覆盖掉挂载目录,然后再将 congfigmap 中的内容作为文件挂载进行。如果想不对原来的文件夹下的文件造成覆盖,只是将 configmap 中的每个 key,按照文件的方式挂载到目录下,可以使用 subpath 参数
  1. $ cat << EOF >test-pod-mount-volume-subpath.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5.   name: test-pod-mount-volume-subpath
  6. spec:
  7.   containers:
  8.     - name: test-container
  9.       image: nginx
  10.       command: ["/bin/sh","-c","sleep 36000"]
  11.       volumeMounts:
  12.       - name: config-volume
  13.         mountPath: /etc/nginx/special.how
  14.         subPath: special.how
  15.   volumes:
  16.     - name: config-volume
  17.       configMap:
  18.         name: special-config
  19.         items:
  20.         - key: special.how
  21.           path: special.how
  22.   restartPolicy: Never
  23. EOF
复制代码
执行
  1. $ kubectl apply -f test-pod-mount-volume-subpath.yaml
  2. $ kubectl get pod test-pod-mount-volume-subpath -o wide
复制代码

当Pod正在运行中进入pod中查看
  1. $ kubectl exec -ti test-pod-mount-volume-subpath -- /bin/sh
  2. # ls /etc/nginx/
  3. # cat /etc/nginx/special.how
复制代码

非交互式查看
  1. $ kubectl exec -it test-pod-mount-volume-subpath -- ls /etc/nginx/
  2. $ kubectl exec -it test-pod-mount-volume-subpath -- cat /etc/nginx/special.how
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

泉缘泉

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表