ConfigMap

ConfigMap

ConfigMap 是 Kubernetes 中用于配置管理的资源对象。它允许你将配置信息从容器镜像中解耦,使得配置可以独立于应用程序进行管理和更新。以下是 ConfigMap 的详细介绍,包括其主要功能、用法以及常见的场景。

1. ConfigMap 基本概念

ConfigMap 是 Kubernetes 用来存储非机密的配置信息的对象。你可以将配置数据存储在 ConfigMap 中,然后将这些数据挂载到容器内,或者将其以环境变量的形式注入到容器中。这使得你可以在无需重新构建镜像的情况下更新配置。

2. ConfigMap 的主要功能

  • 存储配置数据:将配置数据存储在 Kubernetes 集群中。
  • 注入配置数据:通过挂载到容器内的文件、目录或环境变量的方式将配置数据提供给容器。
  • 动态更新ConfigMap 的数据可以在运行时更新,应用程序可以根据需要获取最新的配置数据。

3. ConfigMap 的创建和管理

创建 ConfigMap

可以通过 YAML 文件、kubectl 命令行工具或者从文件中创建 ConfigMap

1. 从 YAML 文件创建:

yaml 复制代码
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-configmap
data:
  key1: value1
  key2: value2

示例:

yaml 复制代码
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-configmap
data:
  SIMPLE_KEY: simple_value
  nginx_d: /usr/local/nginx
  config.yaml: |
    server:
      port: 8080
      host: localhost
  db.properties: |
    db.user=root
    db.password=secret
    db.url=jdbc:mysql://localhost:3306/mydb
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-with-config-files
  labels:
    app: nginx
spec:
  containers:
  - name: my-container
    image: harbor.hiuiu.com/nginx/nginx:1.21.5
    env:
    - name: NGINX
      valueFrom:
        configMapKeyRef:
          name: my-configmap
          key: nginx_d
    volumeMounts:
    - name: config-volume
      mountPath: "/etc/config"
      readOnly: true
  volumes:
  - name: config-volume
    configMap:
      name: my-configmap
      items:
      - key: "config.yaml"
        path: "config.yaml"
      - key: "db.properties"
        path: "db.properties"
  restartPolicy: Never

使用 kubectl apply -f configmap.yaml 创建 ConfigMap

2. 从命令行创建:

bash 复制代码
kubectl create configmap my-config --from-literal=key1=value1 --from-literal=key2=value2

示例:

将一个包含 Tomcat 相关配置信息的 ConfigMap 引入到一个 Pod 中

yaml 复制代码
kubectl create configmap tomcat-config --from-literal=tomcat_dir=/usr/local/tomcat --from-literal=server_name=tomcat.com

apiVersion: v1
kind: Pod
metadata:
  name: tomcat-pod
spec:
  containers:
    - name: tomcat-container
      image: c7-tomcat:9.0.16
      imagePullPolicy: Never
      command: ["/bin/sh"]
      args: ["-c","while true; do echo hello; sleep 10; done"]
      env:
        - name: TOMCAT_DIR
          valueFrom:
            configMapKeyRef:
              name: tomcat-config
              key: tomcat_dir
        - name: SERVER_NAME
          valueFrom:
            configMapKeyRef:
              name: tomcat-config
              key: server_name
      ports:
        - containerPort: 8080
kubectl apply -f cm.yaml 

kubectl exec tomcat-pod -- env | grep TOMCAT_DIR
输出结果// TOMCAT_DIR=/usr/local/tomcat
kubectl exec tomcat-pod -- env | grep SERVER_NAME
输出结果// SERVER_NAME=tomcat.com

3. 从文件创建:

bash 复制代码
kubectl create configmap my-config --from-file=path/to/config/file

示例:

创建一个 Kubernetes Pod,并将 default.conf 文件作为 NGINX 配置文件挂载到 Pod 中

yaml 复制代码
vim default.conf 
server {
    listen       8080;
    listen  [::]:8080;
    server_name  localhost;
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;

}
    error_page  500 502 503 504  /50.html;
    location = /50.html{
        root   /usr/share/nginx/html;
}
}

kubectl create configmap apps-config --from-file=default.conf

apiVersion: v1
kind: Pod
metadata:
  name: app-pod-with-config
spec:
  containers:
  - name: app-container
    image: harbor.hiuiu.com/nginx/nginx:1.21.5
    volumeMounts:
      - name: config-volume
        mountPath: "/etc/nginx/conf.d"
        readOnly: true
  volumes:
  - name: config-volume
    configMap:
      name: apps-config

将一个包含环境变量的 ConfigMap 加载到 Kubernetes Pod 的容器中

ConfigMap是通过--from-env-file 选项从环境变量文件生成的

yaml 复制代码
cat env.list 
DATABASE_HOST=localhost
DATABASE_POST=3006
DATABASE_USER=root
DATABASE_PASSWORD=secret

kubectl create configmap my-configmap --from-env-file=env.list

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: harbor.hiuiu.com/nginx/nginx:1.21.5
    envFrom:
    - configMapRef:
        name: my-configmap
        
kubectl exec -it my-pod -- bash
env

4.从目录创建:

bash 复制代码
kubectl create configmap my-config --from-file=path/to/dir/
查看和编辑 ConfigMap
  • 查看 ConfigMap

    bash 复制代码
    kubectl get configmap my-config -o yaml
  • 编辑 ConfigMap

    bash 复制代码
    kubectl edit configmap my-config
删除 ConfigMap
bash 复制代码
kubectl delete configmap my-config

4. 使用 ConfigMap

ConfigMap 可以通过以下方式使用:

1. 作为环境变量

在 Pod 的 YAML 配置中,将 ConfigMap 的数据作为环境变量注入到容器中:

yaml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-image
    env:
    - name: CONFIG_KEY
      valueFrom:
        configMapKeyRef:
          name: my-config
          key: key1
2. 作为挂载卷

ConfigMap 挂载到容器内的文件系统中:

yaml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-image
    volumeMounts:
    - name: config-volume
      mountPath: /etc/config
  volumes:
  - name: config-volume
    configMap:
      name: my-config

挂载后,ConfigMap 的数据将被以文件的形式写入到指定的挂载路径(例如 /etc/config)。

3. 作为命令行参数

可以将 ConfigMap 的数据作为命令行参数传递给容器:

yaml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-image
    command: ["/bin/sh", "-c"]
    args:
      - echo $(CONFIG_KEY);
    env:
    - name: CONFIG_KEY
      valueFrom:
        configMapKeyRef:
          name: my-config
          key: key1

5. ConfigMap 的注意事项

  • 非机密数据ConfigMap 主要用于存储非机密的配置数据。对于敏感数据,建议使用 Secret 对象。
  • 数据更新 :如果 ConfigMap 的数据被更新,挂载到 Pod 中的数据不会自动更新,除非重新创建 Pod 或者容器。
  • 大小限制 :单个 ConfigMap 的大小有上限限制,通常为 1MB,但这个限制可能会因 Kubernetes 版本和实现而异。
相关推荐
SimonLiu0096 分钟前
清理HiNas(海纳斯) Docker日志并限制日志大小
java·docker·容器
高峰君主3 小时前
Docker容器持久化
docker·容器·eureka
能来帮帮蒟蒻吗3 小时前
Docker安装(Ubuntu22版)
笔记·学习·spring cloud·docker·容器
言之。7 小时前
别学了,打会王者吧
java·python·mysql·容器·spark·php·html5
秦始皇爱找茬10 小时前
docker部署Jenkins工具
docker·容器·jenkins
樽酒ﻬق14 小时前
Kubernetes 常用运维命令整理
运维·容器·kubernetes
Golinie15 小时前
Docker底层原理浅析 | namespace+cgroups+文件系统
docker·容器·文件系统·cgroups·unionfs
樽酒ﻬق15 小时前
深度解析 Kubernetes 配置管理:如何安全使用 ConfigMap 和 Secret
安全·贪心算法·kubernetes
FreeBuf_16 小时前
新型恶意软件采用独特混淆技术劫持Docker镜像
运维·docker·容器
李菠菜18 小时前
CentOS系统指定版本Docker与Docker-Compose在线安装教程
docker·容器·centos