作用理解


核心用途就是容器和配置的分离解耦。

如启用一个mysql容器,mysql容器重要的文件有两部分,一部分为存储数据文件,一部分为配置文件my.cnf,存储数据可以用持久存储实现和容器的分离解耦,配置文件也能够实现和容器的分离解耦,也就是说mysql容器能够直接读取并使用预先配置好的配置文件(而不是使用容器中默认自带的配置文件).这就是configMap的功能。

ConfigMap 用于保存配置数据的键值对,可以用来保存单个属性,也可以用来保存配置文件。ConfigMap 跟 secret 很类似,但它可以更方便地处理不包含敏感信息的字符串。

创建ConfigMap有两种方式


通过yaml文件创建

通过kubectl create创建

示例

命令行创建

  1. # 方式一:
  2. [root@master-01 configmap]# kubectl create cm mysql-config --from-file=mysqld.cnf
  3. configmap/mysql-config created
  4. [root@master-01 configmap]# kubectl describe cm mysql-config
  5. Name: mysql-config
  6. Namespace: default
  7. Labels: <none>
  8. Annotations: <none>
  9. Data
  10. ====
  11. mysqld.cnf:
  12. ----
  13. [client]
  14. port = 3306
  15. socket = /var/run/mysqld/mysqld.sock
  16. [mysql]
  17. no-auto-rehash
  18. [mysqld]
  19. user = mysql
  20. port = 3306
  21. socket = /var/run/mysqld/mysqld.sock
  22. datadir = /var/lib/mysql
  23. [mysqld_safe]
  24. log-error= /var/log/mysql/mysql_oldboy.err
  25. pid-file = /var/run/mysqld/mysqld.pid
  26. Events: <none>
  27. # 方式二:
  28. [root@master-01 configmap]# kubectl create configmap env-config --from-literal=log_level=INFO
  29. # 以key:value的形式创建

yaml文件创建

  1. [root@master-01 configmap]# cat my-config.yaml
  2. apiVersion: v1
  3. kind: ConfigMap
  4. metadata:
  5. name: mysql-config2
  6. data:
  7. mysqld.cnf: |
  8. [client]
  9. port = 3306
  10. socket = /var/run/mysqld/mysqld.sock
  11. [mysql]
  12. no-auto-rehash
  13. [mysqld]
  14. user = mysql
  15. port = 3306
  16. socket = /var/run/mysqld/mysqld.sock
  17. datadir = /var/lib/mysql
  18. [mysqld_safe]
  19. log-error= /var/log/mysql/mysql_oldboy.err
  20. pid-file = /var/run/mysqld/mysqld.pid
  21. [root@master-01 configmap]# kubectl apply -f my-config.yaml
  22. configmap/mysql-config2 created
  23. [root@master-01 configmap]# kubectl describe cm mysql-config2
  24. Name: mysql-config2
  25. Namespace: default
  26. Labels: <none>
  27. Annotations: kubectl.kubernetes.io/last-applied-configuration:
  28. {"apiVersion":"v1","data":{"mysqld.cnf":"[client]\nport = 3306\nsocket = /var/run/mysqld/mysqld.sock\n[mysql]\nno-auto-rehash\n\n[mysqld]\...
  29. Data
  30. ====
  31. mysqld.cnf:
  32. ----
  33. [client]
  34. port = 3306
  35. socket = /var/run/mysqld/mysqld.sock
  36. [mysql]
  37. no-auto-rehash
  38. [mysqld]
  39. user = mysql
  40. port = 3306
  41. socket = /var/run/mysqld/mysqld.sock
  42. datadir = /var/lib/mysql
  43. [mysqld_safe]
  44. log-error= /var/log/mysql/mysql_oldboy.err
  45. pid-file = /var/run/mysqld/mysqld.pid
  46. Events: <none>

ConfigMap 使用


ConfigMap 可以通过三种方式在 Pod 中使用

1.环境变量方式

2.volume挂载方式(一般都是用这个,支持热更新)

3.设置容器命令行参数

用环境变量

  1. [root@master-01 configmap]# kubectl create configmap env-config --from-literal=log_level=INFO
  2. configmap/env-config created
  3. [root@master-01 configmap]# kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm
  4. configmap/special-config created

编排

  1. [root@master-01 configmap]# cat bu.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5. name: test-pod
  6. spec:
  7. containers:
  8. - name: test-container
  9. image: busybox
  10. command: ["/bin/sh", "-c", "env"]
  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. envFrom:
  23. - configMapRef:
  24. name: env-config
  25. restartPolicy: Never
  26. [root@master-01 configmap]# kubectl apply -f bu.yaml
  27. pod/test-pod created

查看日志可以发现,环境变量注入到了容器中了

  1. [root@master-01 configmap]# kubectl logs test-pod
  2. ...
  3. SPECIAL_TYPE_KEY=charm
  4. SPECIAL_LEVEL_KEY=very
  5. log_level=INFO

用作命令行参数

将 ConfigMap 用作命令行参数时,需要先把 ConfigMap 的数据保存在环境变量中,然后通过 $(VAR_NAME) 的方式引用环境变量.

编排

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: dapi-test-pod
  5. spec:
  6. containers:
  7. - name: test-container
  8. image: busybox
  9. command: ["/bin/sh", "-c", "echo $(SPECIAL_LEVEL_KEY) $(SPECIAL_TYPE_KEY)" ]
  10. ...

查看日志可以看到环境变量被输出

  1. [root@master-01 configmap]# kubectl logs dapi-test-pod
  2. very charm

volume挂载方式(支持动态更新)

configmap 挂载文件时,会先覆盖掉挂载目录,然后再将 congfigmap 中的内容作为文件挂载进行。如果想不对原来的文件夹下的文件造成覆盖,只是将 configmap 中的每个 key,按照文件的方式挂载到目录下,可以使用 subpath 参数。

实战例子

编排

  1. [root@master-01 configmap]# cat mysql-d.yaml
  2. apiVersion: v1
  3. kind: ConfigMap
  4. metadata:
  5. name: myconfig
  6. data:
  7. v1: Abc1234!@#
  8. ---
  9. apiVersion: v1
  10. kind: Service
  11. metadata:
  12. name: mysql-t
  13. spec:
  14. ports:
  15. - port: 3306
  16. selector:
  17. app: mysql-t
  18. ---
  19. apiVersion: apps/v1beta1
  20. kind: Deployment
  21. metadata:
  22. name: mysql-t
  23. spec:
  24. selector:
  25. matchLabels:
  26. app: mysql-t
  27. template:
  28. metadata:
  29. labels:
  30. app: mysql-t
  31. spec:
  32. containers:
  33. - image: mysql:5.7
  34. name: mysql-t
  35. ports:
  36. - containerPort: 3306
  37. env:
  38. - name: MYSQL_ROOT_PASSWORD
  39. valueFrom:
  40. configMapKeyRef:
  41. name: my-config
  42. key: v2
  43. volumeMounts:
  44. - name: mysql-t1
  45. mountPath: /etc/mysql/mysql.conf.d
  46. volumes:
  47. - name: mysql-t1
  48. configMap:
  49. name: mysql-config2
  50. [root@master-01 configmap]# kubectl apply -f mysql-d.yaml
  51. configmap/myconfig created
  52. service/mysql-t created
  53. deployment.apps/mysql-t created

volumeMounts/mountPath:    容器里挂载的目录,这个目录其实很重要,你要使用个容器的应用,需熟悉这个应用的配置文件存放目录并且挂载到正确目录.挂载目录错了容器应用无法读取到配置文件。

volumes:  定义使用的卷

name: mysql-t1  注意volumes和volumeMounts的name是相对应的.

进入mysql容器中测试,可以看到读取的就是congfigmap,密码已经生效.

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

查看pod详情

  1. [root@master-01 configmap]# kubectl describe pod mysql-t-7bb6cbbf77-xqfc2
  2. Name: mysql-t-7bb6cbbf77-xqfc2
  3. Namespace: default
  4. Priority: 0
  5. PriorityClassName: <none>
  6. Node: 192.168.209.131/192.168.209.131
  7. Start Time: Tue, 02 Apr 2019 10:29:05 +0800
  8. Labels: app=mysql-t
  9. pod-template-hash=7bb6cbbf77
  10. Annotations: <none>
  11. Status: Running
  12. IP: 172.17.12.3
  13. Controlled By: ReplicaSet/mysql-t-7bb6cbbf77
  14. Containers:
  15. mysql-t:
  16. Container ID: docker://58d61cddb16b6cd14593d7e4d1bc12c6157e7d9c28ffa25c3d3e8a571867bb71
  17. Image: mysql:5.7
  18. Image ID: docker-pullable://mysql@sha256:dba5fed182e64064b688ccd22b2f9cad4ee88608c82f8cff21e17bab8da72b81
  19. Port: 3306/TCP
  20. Host Port: 0/TCP
  21. State: Running
  22. Started: Tue, 02 Apr 2019 10:29:06 +0800
  23. Ready: True
  24. Restart Count: 0
  25. Environment:
  26. MYSQL_ROOT_PASSWORD: <set to the key 'v1' of config map 'myconfig'> Optional: false
  27. Mounts:
  28. /etc/mysql/mysql.conf.d from mysql-t1 (rw)
  29. /var/run/secrets/kubernetes.io/serviceaccount from default-token-tb5bg (ro)
  30. Conditions:
  31. Type Status
  32. Initialized True
  33. Ready True
  34. ContainersReady True
  35. PodScheduled True
  36. Volumes:
  37. mysql-t1:
  38. Type: ConfigMap (a volume populated by a ConfigMap)
  39. Name: mysql-config2
  40. Optional: false
  41. default-token-tb5bg:
  42. Type: Secret (a volume populated by a Secret)
  43. SecretName: default-token-tb5bg
  44. Optional: false
  45. QoS Class: BestEffort
  46. Node-Selectors: <none>
  47. Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
  48. node.kubernetes.io/unreachable:NoExecute for 300s
  49. Events:
  50. Type Reason Age From Message
  51. ---- ------ ---- ---- -------
  52. Normal Scheduled 3m32s default-scheduler Successfully assigned default/mysql-t-7bb6cbbf77-xqfc2 to 192.168.209.131
  53. Normal Pulled 3m31s kubelet, 192.168.209.131 Container image "mysql:5.7" already present on machine
  54. Normal Created 3m31s kubelet, 192.168.209.131 Created container
  55. Normal Started 3m31s kubelet, 192.168.209.131 Started container

configmap配置段为

  1. Environment:
  2. MYSQL_ROOT_PASSWORD: <set to the key 'v1' of config map 'myconfig'> Optional: false
  3. Mounts:
  4. /etc/mysql/mysql.conf.d from mysql-t1 (rw)

热更新测试

修改my-cnfig2,使用edit命令

在[mysqld]段添加如下配置

  1. server-id=1

查看my-cnfig2信息

  1. [root@master-01 configmap]# kubectl describe cm mysql-config2
  2. ...
  3. mysqld.cnf:
  4. ----
  5. [client]
  6. port = 3306
  7. socket = /var/run/mysqld/mysqld.sock
  8. [mysql]
  9. no-auto-rehash
  10. [mysqld]
  11. user = mysql
  12. port = 3306
  13. socket = /var/run/mysqld/mysqld.sock
  14. datadir = /var/lib/mysql
  15. server-id=1
  16. [mysqld_safe]
  17. log-error= /var/log/mysql/mysql_oldboy.err
  18. pid-file = /var/run/mysqld/mysqld.pid
  19. Events: <none>

进mysql容器查看

  1. [root@master-01 configmap]# kubectl edit cm mysql-config2
  2. configmap/mysql-config2 edited
  3. [root@master-01 configmap]# kubectl exec -ti mysql-t-7bb6cbbf77-xqfc2 bash
  4. root@mysql-t-7bb6cbbf77-xqfc2:/# cat /etc/mysql/mysql.conf.d/mysqld.cnf
  5. [client]
  6. port = 3306
  7. socket = /var/run/mysqld/mysqld.sock
  8. [mysql]
  9. no-auto-rehash
  10. [mysqld]
  11. user = mysql
  12. port = 3306
  13. socket = /var/run/mysqld/mysqld.sock
  14. datadir = /var/lib/mysql
  15. server-id=1
  16. [mysqld_safe]
  17. log-error= /var/log/mysql/mysql_oldboy.err
  18. pid-file = /var/run/mysqld/mysqld.pid
  19. root@mysql-t-7bb6cbbf77-xqfc2:/#

可以看到配置已经热更新了。

往期文章一览

1、Kubernetes集群搭建之系统初始化配置篇

2、Kubernetes集群搭建之企业级环境中基于Harbor搭建自己的私有仓库

3、Kubernetes集群搭建之Etcd集群配置篇

4、Kubernetes集群搭建之CNI-Flanneld部署篇

5、Kubernetes集群搭建之Master配置篇

6、Kubernetes系列之Coredns and Dashboard介绍篇

7、Kubernetes系列之监控Metres-server实战篇

如果您觉得不错,请别忘了转发、分享、点赞让更多的人去学习, 您的举手之劳,就是对小编最好的支持,非常感谢!

kubernetes系列之ConfigMap使用方式的更多相关文章

  1. Kubernetes系列之Helm介绍篇

    本次系列使用的所需部署包版本都使用的目前最新的或最新稳定版,安装包地址请到公众号内回复[K8s实战]获取 介绍 Helm 是 Deis 开发的一个用于 Kubernetes 应用的包管理工具,主要用来 ...

  2. Kubernetes系列之理解K8s Service的几种模式

    今天给大家介绍下k8s的service的几种访问模式. 概述 我们知道pod的ip不是固定的,是根据所在宿主机的docker0网卡生成的,每次重启,更新,调度等情况IP都会变,那pod与pod之间需要 ...

  3. kubernetes系列03—kubeadm安装部署K8S集群

    本文收录在容器技术学习系列文章总目录 1.kubernetes安装介绍 1.1 K8S架构图 1.2 K8S搭建安装示意图 1.3 安装kubernetes方法 1.3.1 方法1:使用kubeadm ...

  4. Windows玩转Kubernetes系列3-Centos安装K8S

    以往文章参考: Windows玩转Kubernetes系列1-VirtualBox安装Centos Windows玩转Kubernetes系列2-Centos安装Docker 安装K8S yum in ...

  5. kubernetes系列(十七) - 通过helm安装dashboard详细教程

    1. 前提条件 2. 配置https证书为secret 3. dashboard安装 3.1 helm拉取dashboard的chart 3.2 配置dashboard的chart包配置 3.3 he ...

  6. 从0到1使用Kubernetes系列(六):数据持久化实战

    本文是从 0 到 1 使用 Kubernetes 系列第六篇,上一篇<从 0 到 1 使用 Kubernetes 系列(五):Kubernetes Scheduling>介绍了 Kuber ...

  7. 从0到1使用Kubernetes系列(七):网络

    本文是从 0 到 1 使用 Kubernetes 系列第七篇,上一篇<从 0 到 1 使用 Kubernetes 系列(六):数据持久化实战> 介绍了 Kubernetes 中的几种常用储 ...

  8. 从0到1使用Kubernetes系列(八):Kubernetes安全

    本文是从 0 到 1 使用 Kubernetes 系列第八篇,上一篇从0到1使用Kubernetes系列(七):网络介绍了 K8S 网络相关的内容,本文将带你了解 K8S 的安全问题. Kuberne ...

  9. Kubernetes系列(五) Ingress

    作者: LemonNan 原文地址: https://juejin.im/post/6878269825639317517 Kubernetes 系列 Kubernetes系列(一) Pod Kube ...

随机推荐

  1. webpack4与babel配合使es6代码可运行于低版本浏览器

    使用es6+新语法编写代码,可是不能运行于低版本浏览器,需要将语法转换成es5的.那就借助babel7转换,再加上webpack打包,实现代码的转换. 转换包括两部分:语法和API let.const ...

  2. ASP.NET Core 的 `Core` 有几种写法?

    一.概述 本文将会根据情况持续更新. 作为一个 Framework,ASP.NET Core 提供了诸多的扩展点.使用内置的组件和默认的配置通常就能够满足部分需求,当需要扩展的时就需要先去找出这些扩展 ...

  3. tensorflow用dropout解决over fitting-【老鱼学tensorflow】

    在机器学习中可能会存在过拟合的问题,表现为在训练集上表现很好,但在测试集中表现不如训练集中的那么好. 图中黑色曲线是正常模型,绿色曲线就是overfitting模型.尽管绿色曲线很精确的区分了所有的训 ...

  4. SVM python代码自实践

    import numpy as np import matplotlib.pyplot as plt #创造数据 x = [-2,6,-2,7,-3,3,0,8,1,10,2,12,2,5,3,6,4 ...

  5. Linux从入门到放弃(为做一个开发+运维的全能性人才而奋斗)

    Linux?听说是一个操作系统,好用吗?” “我也不知道呀,和windows有什么区别?我能在Linux上玩LOL吗” “别提了,我用过Linux,就是黑乎乎一个屏幕,鼠标也不能用,不停地的敲键盘,手 ...

  6. 2016-3-1 安装Hexo过程中遇到的问题

      查找问题地址: http://hexo.io/docs/troubleshooting.html   1.通过npm安装hexo运行命令:sudo npm install -g hexo 出现这个 ...

  7. Linux环境下Hadoop集群搭建

    Linux环境下Hadoop集群搭建 前言: 最近来到了武汉大学,在这里开始了我的研究生生涯.昨天通过学长们的耐心培训,了解了Hadoop,Hdfs,Hive,Hbase,MangoDB等等相关的知识 ...

  8. less是什么?直接用css好还是less好

    问:Less是一个动态CSS语言框架,Less扩展了CSS的动态特性 [1]:从实现角度来说,直接用css看起来能方便一些,而less还要编译? [2]:技术上好像灵活,但是从使用者的角度来说,css ...

  9. WinForm 中 comboBox控件之数据绑定

    一.IList 现在我们直接创建一个List集合,然后绑定 1 IList<string> list = new List<string>(); 2 list.Add(&quo ...

  10. 1.3 正则表达式和Python语言-1.3.5使用 search()在一个字符串中查找模式(搜索与匹配 的对比)

    1.3.5 使用 search()在一个字符串中查找模式(搜索与匹配的对比) 其实,想要搜索的模式出现在一个字符串中间部分的概率,远大于出现在字符串起始部分的概率.这也就是 search()派上用场的 ...