概述

主要用于向Pod注入非敏感数据,使用时,用户将数据直接存储在ConfigMap对象当中,然后Pod通过使用ConfigMap卷进行引用
ConfigMap 在容器中使用的场景通常有 3 种,分别如下所示:

  • 生成为容器中的环境变量
  • 设置容器启动命令的启动参数(需设置为环境变量)
  • 以 Volume 的形式挂载为容器内部的文件或目录

    限制条件

  • ConfigMap 必须在 Pod 之前创建

  • ConfigMap 受 Namespace 限制,只有处于相同 Namespace 中的 Pod 才可以引用它
  • kubelet 只支持可以被 API Server 管理的 Pod 使用 ConfigMap,kubelet 在本 Node 上通过 —manifest-url 或 —config 自动创建的静态 Pod 无法引用 ConfigMap
  • 在 Pod 对 ConfigMap 进行挂载(volume)操作时,在容器内部只能挂载为“目录”,不能挂载为“文件”。在挂载到容器内部后,在目录下将包含 ConfigMap 定义的每个 item,如果在该目录下原来还有其它文件,则容器内的该目录将被挂载的 ConfigMap 覆盖。如果想要保存原来的其它文件,可以将 ConfigMap 挂载到容器内部的临时目录,再通过启动脚本将配置文件复制(cp)或链接(link)到应用所在的实际目录

创建

执行 kubectl explain cm

参数 类型 说明
apiVersion string
binaryData map[string]string 二进制数据
data map[string]string
immutable boolean 是否可以修改cm
kind string
metadata Object

YAML 配置文件

  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4. name: cm-appvars # ConfigMap 的名称
  5. data: # 配置信息
  6. apploglevel: info
  7. appdatadir: /var/data

执行 配置文件

  1. $ kubectl create -f cm-appvars.yaml
  2. configmap/cm-appvars created

查看配置信息

  1. $ kubectl get configmap
  2. NAME DATA AGE
  3. cm-appvars 2 37s

查看配置详细

  1. $ kubectl describe configmap cm-appvars
  2. Name: cm-appvars
  3. Namespace: default
  4. Labels: <none>
  5. Annotations: <none>
  6. Data
  7. ====
  8. appdatadir:
  9. ----
  10. /var/data
  11. apploglevel:
  12. ----
  13. info
  14. Events: <none>

kubectl 命令行

  1. kubectl create configmap <map-name> <data-source>

—from-literal

eg:

  1. kubectl create cm myconfig --from-literal=k=v -n test
  2. configmap/myconfig created

命令解释:

  • cm: ConfigMap 的简写
  • myconfig: 要创建的 ConfigMap 的名称,可以自己定义
  • —from-literal=k=v:表示直接从命令行指定 key-value 值,k=v 的格式是<key>=<value>,这个参数也可以指定多次
  • -n test : 在 test 这个 namespace 下面创建 ConfigMap

查看myconfig 信息

  1. kubectl get cm myconfig -n test -o yaml
  2. apiVersion: v1
  3. data:
  4. k: v
  5. kind: ConfigMap
  6. metadata:
  7. creationTimestamp: "2020-07-12T16:08:14Z"
  8. managedFields:
  9. - apiVersion: v1
  10. fieldsType: FieldsV1
  11. fieldsV1:
  12. f:data:
  13. .: {}
  14. f:k: {}
  15. manager: kubectl
  16. operation: Update
  17. time: "2020-07-12T16:08:14Z"
  18. name: myconfig
  19. namespace: test
  20. resourceVersion: "217482"
  21. selfLink: /api/v1/namespaces/test/configmaps/myconfig
  22. uid: 8a8169bd-e605-4f3b-8b3f-c9148abf54c6

—from-file

  1. [client]
  2. port = 3306
  3. socket = /var/run/mysqld/mysqld.sock
  4. [mysql]
  5. no-auto-rehash
  6. [mysqld]
  7. user = mysql
  8. port = 3306
  9. socket = /var/run/mysqld/mysqld.sock
  10. datadir = /var/lib/mysql
  11. [mysqld_safe]
  12. log-error= /var/log/mysql/mysql_oldboy.err
  13. pid-file = /var/run/mysqld/mysqld.pid

从文件创建名为 mysql-config 的 ConfigMap:

  1. $ kubectl create configmap mysql-config --from-file=mysqld.cnf
  2. configmap/mysql-config created

使用 key-value 键值对创建名为 myconfig 的 ConfigMap:

  1. $ kubectl create configmap myconfig --from-literal=root_passwd=123456
  2. configmap/myconfig created

创建mysql

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: mysql
  5. spec:
  6. selector:
  7. matchLabels:
  8. app: mysql
  9. template:
  10. metadata:
  11. labels:
  12. app: mysql
  13. spec:
  14. containers:
  15. - image: mysql:5.7
  16. name: mysql
  17. ports:
  18. - containerPort: 3306
  19. env:
  20. - name: MYSQL_ROOT_PASSWORD
  21. valueFrom:
  22. configMapKeyRef:
  23. name: myconfig
  24. key: root_passwd
  25. volumeMounts:
  26. - name: mysql
  27. mountPath: /etc/mysql/mysql.conf.d
  28. volumes:
  29. - name: mysql
  30. configMap:
  31. name: mysql-config

执行

  1. $ kubectl create -f mysql-config.yaml

查看

  1. $ kubectl get pods
  2. NAME READY STATUS RESTARTS AGE
  3. mysql-598f68bc4f-hkz62 0/1 ContainerCreating 0 90s

进入容器

  1. $ kubectl exec -it mysql-598f68bc4f-hkz62 /bin/bash

执行mysql客户端

  1. # mysql -uroot -p123456
  2. mysql: [Warning] Using a password on the command line interface can be insecure.
  3. Welcome to the MySQL monitor. Commands end with ; or \g.
  4. Your MySQL connection id is 2
  5. Server version: 5.7.30 MySQL Community Server (GPL)
  6. Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
  7. Oracle is a registered trademark of Oracle Corporation and/or its
  8. affiliates. Other names may be trademarks of their respective
  9. owners.
  10. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  11. mysql>