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 版本和实现而异。
相关推荐
鸠摩智首席音效师1 小时前
Docker 中如何限制CPU和内存的使用 ?
docker·容器
Michaelwubo2 小时前
Docker dockerfile镜像编码 centos7
运维·docker·容器
好像是个likun2 小时前
使用docker拉取镜像很慢或者总是超时的问题
运维·docker·容器
暴富的Tdy4 小时前
【快速上手Docker 简单配置方法】
docker·容器·eureka
魏 无羡5 小时前
linux CentOS系统上卸载docker
linux·kubernetes·centos
Karoku0665 小时前
【k8s集群应用】kubeadm1.20高可用部署(3master)
运维·docker·云原生·容器·kubernetes
豆豆豆豆变5 小时前
docker之compose篇
docker·容器·自动化运维
凌虚7 小时前
Kubernetes APF(API 优先级和公平调度)简介
后端·程序员·kubernetes
saynaihe7 小时前
安全地使用 Docker 和 Systemctl 部署 Kafka 的综合指南
运维·安全·docker·容器·kafka
G_whang8 小时前
centos7下docker 容器实现redis主从同步
redis·docker·容器