k8s之ConfigMap详细理解及使用

ConfigMap是Kubernetes中用于存储非加密配置数据的API对象,常用于环境变量、命令行参数和存储卷。本文介绍了如何通过命令行和YAML文件创建ConfigMap,以及在Pod中作为环境变量、命令行参数和Volume使用的方式,并对比了不同使用方式的更新特性。

一、ConfigMap介绍

ConfigMap是一种API对象,用来将非加密数据保存到键值对中。可以用作环境变量、命令行参数或者存储卷中的配置文件。

ConfigMap可以将环境变量配置信息和容器镜像解耦,便于应用配置的修改。如果需要存储加密信息时可以使用Secret对象。

二、ConfigMap创建

1.通过命令行创建configmap

 可以使用 kubectl create configmap 从文件、目录或者 key-value 字符串创建等创建 ConfigMap

 (1)通过文件创建configmap

$ echo hello > test1.txt
$ ehco world > test2.txt
$ kubectl create configmap my-config --from-file=key1=test1.txt  --from-file=key2=test2.txt
$ kubectl describe configmap my-config

看到该configmap中有两个键值对,key1:hello 和 key2:world

(2)通过文件夹创建configmap

$ mkdir config
$ echo hello > config/test1
$ echo world > config/test2

#根据文件夹创建configmap

$ kubectl create configmap dir-config --from-file=config/

$ kubectl describe configmap dir-config

看到该configmap资源中有两个键值对,test1:hello和test2:world,key为文件名,value为文件内容

(3)通过键值对创建configmap

$ kubectl create configmap literal-config --from-literal=key1=hello --from-literal=key2=world

$ kubectl describe configmap literal-config

2.通过yaml文件创建

#config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
 name: my-config
data:
 key1: hello
 key2: world

$ kubectl create -f config.yaml

$ kubectl describe configmap my-config

三、ConfigMap的使用

Pod的使用方式:

1. 将ConfigMap中的数据设置为容器的环境变量

2. 将ConfigMap中的数据设置为命令行参数

3. 使用Volume将ConfigMap作为文件或目录挂载

4. 编写代码在 Pod 中运行,使用 Kubernetes API 来读取 ConfigMap

1.配置到容器的环境变量

# test-pod-configmap.yaml
apiVersion: v1
kind: Pod
metadata:
 name: test-pod-configmap
spec:
 containers:
  - name: test-busybox
    image: busybox
    imagePullPolicy: IfNotPresent
    args:
    - sleep
    - "86400"
    env:
    - name: KEY1
      valueFrom:
       configMapKeyRef:
        name: my-config
        key: key1
    - name: KEY2
      valueFrom:
       configMapKeyRef:
        name: my-config
        key: key2

#创建pod

$ kubectl create -f test-pod-configmap.yaml

2. 设置为命令行参数

# test-pod-configmap-cmd
apiVersion: v1
kind: Pod
metadata:
 name: test-pod-configmap-cmd
spec:
 containers:
  - name: test-busybox
    image: busybox
    imagePullPolicy: IfNotPresent
    command: [ "/bin/sh","-c","echo $(KEY1) $(KEY2)"]
    env:
    - name: KEY1
      valueFrom:
       configMapKeyRef:
        name: my-config
        key: key1
    - name: KEY2
      valueFrom:
       configMapKeyRef:
        name: my-config
        key: key2
 restartPolicy: Never

# 创建pod,该pod成功启动后会输出环境变量KEY1和KEY2的值

$ kubectl create -f test-pod-configmap-cmd.yaml              

#查看pod的日志

$ kubectl logs test-pod-configmap-cmd

#进入到容器中查看环境变量

$ kubectl exec -it test-pod-configmap -- /bin/sh

3.将configmap挂载到容器中

# test-pod-projected-configmap-volume.yaml
apiVersion: v1
kind: Pod
metadata:
 name: test-pod-projected-configmap-volume
spec:
 containers:
 - name: test-pod-busybox
   image: busybox
   imagePullPolicy: IfNotPresent
   args:
   - sleep
   - "86400"
   volumeMounts:
   - name: config-volume
     mountPath: "/projected-volume"
     readOnly: true
 volumes:
 - name: config-volume
   projected:
    sources:
    - configMap:
       name: my-config

#创建pod

kubectl create -f test-pod-projected-configmap-volume.yaml

#进入容器

$ kubectl exec -it test-pod-projected-configmap-volume -- /bin/sh

#查看挂在到容器中的文件内容

通过volume挂载和环境变量的区别

通过Volume挂载到容器内部时,当该configmap的值发生变化时,容器内部具备自动更新的能力,但是通过环境变量设置到容器内部该值不具备自动更新的能力。

注意:

ConfigMap必须在Pod使用它之前创建

使用envFrom时,将会自动忽略无效的键

Pod只能使用同一个命名空间的ConfigMap

感谢:

https://kubernetes.io/zh/docs/concepts/configuration/configmap/

k8s -- ConfigMap - 简书

<think>好的,我现在需要详细解释一下 Kubernetes 的 ConfigMap。首先,我得确认自己理解 ConfigMap 的基本概念和作用。ConfigMap 是 Kubernetes 中用来管理非机密性配置数据的资源对象,它允许将配置信息与容器镜像分离,提高应用的可移植性。用户可以通过 ConfigMap 存储键值对、配置文件或者环境变量,然后在 Pod 中引用这些配置。 接下来,我需要考虑用户可能的疑问点。比如,ConfigMap 和 Secret 的区别,如何创建 ConfigMap,如何在 Pod 中使用它,以及使用时的最佳实践。这些方面都需要涵盖到。 然后,回忆一下 ConfigMap 的创建方式。常见的几种方法包括通过命令行 kubectl create configmap,或者通过 YAML 文件定义。例如,可以通过指定文件、目录或者直接键值对来生成 ConfigMap。这时候要确保给出具体的例子,比如使用 --from-file 或 --from-literal 参数。 在 Pod 中引用 ConfigMap 的方式主要有两种:作为环境变量注入,或者作为卷挂载到容器内。对于环境变量,可能需要展示如何在 Pod 的 YAML 文件中配置 env.valueFrom.configMapKeyRef。而作为卷挂载的话,需要说明 volumes 和 volumeMounts 的配置方法,以及文件如何被映射到容器中的路径。 还需要提到 ConfigMap 的热更新问题。当 ConfigMap 更新后,挂载为卷的配置会自动更新,但作为环境变量的话则不会,可能需要重启 Pod。这一点用户可能会关心,所以需要明确说明。 另外,注意事项也很重要。比如 ConfigMap 的大小限制(1MB),以及不适用于存储敏感信息(应该用 Secret)。同时,命名空间的作用域,确保用户知道 ConfigMap 在哪个命名空间下创建和使用。 结构方面,按照概述、创建方式、使用方式、注意事项、示例的步骤来组织内容会比较清晰。每个部分都需要简明扼要,避免冗长,但又要足够详细,让用户理解操作步骤和原理。 最后,要检查是否有遗漏的重要点,比如 ConfigMap 的更新机制,或者与其他资源的关联,比如如何与 Deployment 配合使用。同时,确保所有命令行示例和 YAML 片段正确无误,符合 LaTeX 格式要求,比如用 $$...$$ 包裹独立代码块,行内变量用 $...$。 可能还需要比较一下 ConfigMap 和其他类似机制的区别,比如与 Secret 的对比,或者与通过环境变量直接传递配置的优劣。这有助于用户更好地理解何时应该使用 ConfigMap。 总结一下,整个思考过程需要覆盖 ConfigMap 的定义、创建方法、使用方法、注意事项、示例以及常见问题,确保用户能够全面理解并正确应用 ConfigMap。</think>以下是 Kubernetes ConfigMap详细解释: --- ### 一、ConfigMap 概述 ConfigMap 是 Kubernetes 中用于存储 **非机密性配置数据** 的资源对象,主要解决以下问题: 1. 将配置与容器镜像解耦,提升应用的可移植性 2. 集中管理不同环境(开发/测试/生产)的配置 3. 支持动态更新配置(部分场景) 与 Secret 的区别: ConfigMap 存储普通文本数据,Secret 专用于敏感信息(如密码、密钥)。 --- ### 二、创建 ConfigMap 的 3 种方式 #### 1. 命令行创建(kubectl) ```bash # 从键值对创建 $$ kubectl create configmap my-config --from-literal=key1=value1 --from-literal=key2=value2 $$ # 从文件创建(自动以文件名作为键) $$ kubectl create configmap my-config --from-file=path/to/config-file.conf $$ # 从目录创建(合并目录下所有文件) $$ kubectl create configmap my-config --from-file=path/to/config-dir/ $$ ``` #### 2. YAML 文件定义 ```yaml $$ apiVersion: v1 kind: ConfigMap metadata: name: game-config data: game.properties: | enemy.types=aliens,monsters player.maxHealth=5 ui.properties: | color.good=purple color.bad=yellow $$ ``` --- ### 三、在 Pod 中使用 ConfigMap #### 方式 1:作为环境变量 ```yaml $$ apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: busybox env: - name: SPECIAL_LEVEL valueFrom: configMapKeyRef: name: my-config # ConfigMap 名称 key: key1 # 指定键名 $$ ``` #### 方式 2:挂载为 Volume ```yaml $$ apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: busybox volumeMounts: - name: config-volume mountPath: /etc/config volumes: - name: config-volume configMap: name: my-config $$ ``` --- ### 四、核心特性与注意事项 1. **热更新** - 挂载为 Volume:更新 ConfigMap 后,容器内文件会自动同步(约 1 分钟延迟) - 环境变量方式:需重启 Pod 才能生效 2. **限制** - 单个 ConfigMap 最大 1MB - 仅适用于非敏感数据(敏感数据应使用 Secret) 3. **命名空间** ConfigMap 属于 Namespace 级别资源,需与 Pod 在同一 Namespace --- ### 五、典型使用场景示例 #### 场景:动态调整日志级别 1. 创建 ConfigMap 存储日志配置 2. 将 ConfigMap 挂载到容器的 `/etc/logging.conf` 3. 应用监听配置文件变化,自动重载配置 (无需重启 Pod) --- 通过以上机制,ConfigMap 实现了配置与代码的分离,是 Kubernetes 配置管理的核心组件之一。
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值