0x00 概述

很多情况下我们为某一应用做好镜像,当我们想修改其中的一些参数的时候,就变得比较麻烦,又要重新制作镜像,我们是不是有一种方式,让镜像根据不同的场景调用我们不同的配置文件呢,那我们就需要用到 k8s 的另外一种资源,那就是 ConfigMap。

我们知道,在几乎所有的应用开发中,都会涉及到配置文件的变更,比如说在web的程序中,需要连接数据库,缓存甚至是队列等等。而我们的一个应用程序从写第一行代码开始,要经历开发环境、测试环境、预发布环境只到最终的线上环境。而每一个环境都要定义其独立的各种配置。如果我们不能很好的管理这些配置文件,你的运维工作将顿时变的无比的繁琐。为此业内的一些大公司专门开发了自己的一套配置管理中心,如360的Qcon,百度的disconf等。kubernetes也提供了自己的一套方案,即ConfigMap。kubernetes通过ConfigMap来实现对容器中应用的配置管理。

0x01 创建 ConfigMap

ConfigMap是用来存储配置文件的kubernetes资源对象,所有的配置内容都存储在etcd中。

创建ConfigMap的方式有4种:

  • 通过直接在命令行中指定configmap参数创建,即--from-literal
  • 通过指定文件创建,即将一个配置文件创建为一个ConfigMap,--from-file=<文件>
  • 通过一个文件内多个键值对,--from-env-file=<文件>
  • 事先写好标准的configmap的yaml文件,然后kubectl create -f 创建。

1.1、通过 --from-literal

kubectl create configmap test-config1 --from-literal=db.host=172.18.8.200 --from-literal=db.port=''

查看配置的内容。

[root@master ~]# kubectl get cm test-config1 -o yaml
apiVersion: v1
data:
db.host: 172.18.8.200
db.port: ""
kind: ConfigMap
metadata:
creationTimestamp: "2018-12-16T04:32:42Z"
name: test-config1
namespace: default
resourceVersion: ""
selfLink: /api/v1/namespaces/default/configmaps/test-config1
uid: a0ee762b-00eb-11e9-9fa7-000c291fb1b3

1.2、通过 --from-file

echo -n 172.18.8.200 > ./db.host
echo -n 3306 > ./db.port
kubectl create cm test-config2 --from-file=./db.host --from-file=./db.port

查看配置内容:

[root@master ~]# kubectl get cm test-config2 -o yaml
apiVersion: v1
data:
db.host: 172.18.8.200
db.port: ""
kind: ConfigMap
metadata:
creationTimestamp: "2018-12-16T04:37:50Z"
name: test-config2
namespace: default
resourceVersion: ""
selfLink: /api/v1/namespaces/default/configmaps/test-config2
uid: 583ed4e7-00ec-11e9-9fa7-000c291fb1b3

每个文件内容对应一个信息条目。

1.3、通过--from-env-file

cat << EOF > env.txt
db.host=172.18.8.200
db.port=3306
EOF
kubectl create cm test-config3 --from-env-file=env.txt

查看配置内容:

[root@master ~]# kubectl get cm test-config3 -o yaml
apiVersion: v1
data:
db.host: 172.18.8.200
db.port: ""
kind: ConfigMap
metadata:
creationTimestamp: "2018-12-16T04:43:02Z"
name: test-config3
namespace: default
resourceVersion: ""
selfLink: /api/v1/namespaces/default/configmaps/test-config3
uid: 12746e5f-00ed-11e9-9fa7-000c291fb1b3

1.4、YAML 配置文件

配置文件内容如下。

apiVersion: v1
kind: ConfigMap
metadata:
name: test-config4
data:
db.host: 172.18.8.200
db.port: ""

创建并查看其内容。

[root@master ~]# kubectl apply -f db.yaml
configmap/test-config4 created
[root@master ~]# kubectl get cm test-config4 -o yaml
apiVersion: v1
data:
db.host: 172.18.8.200
db.port: ""
kind: ConfigMap
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","data":{"db.host":"172.18.8.200","db.port":""},"kind":"ConfigMap","metadata":{"annotations":{},"name":"test-config4","namespace":"default"}}
creationTimestamp: "2018-12-16T04:49:01Z"
name: test-config4
namespace: default
resourceVersion: ""
selfLink: /api/v1/namespaces/default/configmaps/test-config4
uid: e87cdafa-00ed-11e9-9fa7-000c291fb1b3

0x02 ConfigMap 使用

使用ConfigMap有二种方式:

  • 第一种是通过环境变量的方式,直接传递给pod;
  • 第二种是作为volume的方式挂载到pod内。

2.1、通过环境变量使用

使用valueFromconfigMapKeyRefnamekey指定要用的key。

apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: busybox
args: [ "/bin/sh", "-c", "sleep 3000" ]
env:
- name: DB_HOST
valueFrom:
configMapKeyRef:
name: test-config4
key: db.host
- name: DB_PORT
valueFrom:
configMapKeyRef:
name: test-config4
key: db.port

还可以通过envFromconfigMapRefname使得configmap中的所有key/value对都自动变成环境变量。

apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: busybox
args: [ "/bin/sh", "-c", "sleep 3000" ]
envFrom:
- configMapRef:
name: test-config3

2.2、作为volume挂载使用

test-config4所有key/value挂载进来:

apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: busybox
args: [ "/bin/sh", "-c", "sleep 3000" ]
volumeMounts:
- name: db
mountPath: "/etc/db"
readOnly: true
volumes:
- name: db
configMap:
name: test-config4

进入容器查看,看到在db文件夹下以每一个key为文件名value为值创建了多个文件。

[root@master ~]# kubectl exec -it mypod -- /bin/sh
/ # cd /etc/db
/etc/db # ls -al
total 0
drwxrwxrwx 3 root root 89 Dec 16 05:23 .
drwxr-xr-x 1 root root 16 Dec 16 05:23 ..
drwxr-xr-x 2 root root 36 Dec 16 05:23 ..2018_12_16_05_23_04.654058863
lrwxrwxrwx 1 root root 31 Dec 16 05:23 ..data -> ..2018_12_16_05_23_04.654058863
lrwxrwxrwx 1 root root 14 Dec 16 05:23 db.host -> ..data/db.host
lrwxrwxrwx 1 root root 14 Dec 16 05:23 db.port -> ..data/db.port
/etc/db # cat db.host
172.18.8.200/etc/db #

2.3、ConfigMap的热更新

使用该 ConfigMap 挂载的 Env 不会同步更新;
使用该 ConfigMap 挂载的 Volume 中的数据需要一段时间(实测大概10秒)才能同步更新。

2.4、最佳使用方法

大多数情况下,配置信息都以文件形式提供,所以在创建 ConfigMap 时通常采用 --from-file 或 YAML 方式,读取 ConfigMap 时通常采用 Volume 方式。
比如我们的 MySQL 配置文件/etc/my.cnf

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
!includedir /etc/my.cnf.d

创建CongifMap。

kubectl create cm mysql-cm --from-file=/etc/my.cnf

查看创建好的cm。

[root@master ~]# kubectl get cm mysql-cm -o yaml
apiVersion: v1
data:
my.cnf: |
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
!includedir /etc/my.cnf.d
kind: ConfigMap
metadata:
creationTimestamp: "2018-12-16T05:38:29Z"
name: mysql-cm
namespace: default
resourceVersion: ""
selfLink: /api/v1/namespaces/default/configmaps/mysql-cm
uid: d1201233-00f4-11e9-9fa7-000c291fb1b3

在 Pod 中使用此 ConfigMap,配置文件为:

apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: busybox
args: [ "/bin/sh", "-c", "sleep 3000" ]
volumeMounts:
- name: mysql
mountPath: "/tmp"
volumes:
- name: mysql
configMap:
name: mysql-cm
items:
- key: my.cnf
path: mysql/my.cnf

创建 Pod 并读取配置信息:

[root@master ~]# kubectl exec -it mypod sh
/ # cat /tmp/mysql/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
!includedir /etc/my.cnf.d
/ # exit

关于挂在路径大家可以自行进行修改。

参考

K8S学习笔记之Kubernetes 配置管理 ConfigMap的更多相关文章

  1. K8S学习笔记之Kubernetes数据持久化方案

    在开始介绍k8s持久化存储前,我们有必要了解一下k8s的emptydir和hostpath.configmap以及secret的机制和用途. 0x00 Emptydir EmptyDir是一个空目录, ...

  2. K8S学习笔记之kubernetes 日志架构

    0x00 概述 应用程序和系统日志可以帮助我们了解集群内部的运行情况,日志对于我们调试问题和监视集群情况也是非常有用的.而且大部分的应用都会有日志记录,对于传统的应用大部分都会写入到本地的日志文件之中 ...

  3. K8S学习笔记之Kubernetes核心概念

    0x00  Kubernetes简介 Kubernetes(K8S)是Google开源的容器集群管理系统,其设计源于Google在容器编排方面积累的丰富经验,并结合社区创新的最佳实践. K8S在Doc ...

  4. K8S学习笔记之Kubernetes 部署策略详解

    0x00 概述 在Kubernetes中有几种不同的方式发布应用,所以为了让应用在升级期间依然平稳提供服务,选择一个正确的发布策略就非常重要了. 选择正确的部署策略是要依赖于我们的业务需求的,下面我们 ...

  5. 【K8s学习笔记】K8s是如何部署应用的?

    本文内容 本文致力于介绍K8s一些基础概念与串联部署应用的主体流程,使用Minikube实操 基础架构概念回顾 温故而知新,上一节[K8S学习笔记]初识K8S 及架构组件 我们学习了K8s的发展历史. ...

  6. 【k8s学习笔记】使用 kubeadm 部署 v1.18.5 版本 Kubernetes集群

    说明 本文系搭建kubernetes v1.18.5 集群笔记,使用三台虚拟机作为 CentOS 测试机,安装kubeadm.kubelet.kubectl均使用yum安装,网络组件选用的是 flan ...

  7. Docker 与 K8S学习笔记(二十三)—— Kubernetes集群搭建

    小伙伴们,好久不见,这几个月实在太忙,所以一直没有更新,今天刚好有空,咱们继续k8s的学习,由于我们后面需要深入学习Pod的调度,所以我们原先使用MiniKube搭建的实验环境就不能满足我们的需求了, ...

  8. DOCKER 学习笔记9 Kubernetes (K8s) 生产级容器编排 上

    前言 在上一节的学习中.我们已经可以通过最基本的 Docker Swarm 创建集群,然后在集群里面加入我们需要运行的任务 以及任务的数量 这样我们就创建了一个服务. 当然,这样的方式在我们本地虚拟机 ...

  9. Kubernetes 配置管理 ConfigMap(十二)

    目录 一.背景 二.创建 ConfigMap 2.1.通过 --from-literal 2.2.通过 --from-file 2.3.通过--from-env-file 2.4.YAML 配置文件 ...

随机推荐

  1. mongo连接不上Timed out after 30000

    本地连接mongo报错,错误代码为: Caused by: com.mongodb.MongoTimeoutException: Timed out after 30000 ms while wait ...

  2. Alipay 支付类

    本版本参考网友 <?php namespace App\Tools; class Alipay { //应用ID,您的APPID. private $appID = '111'; //商户私钥 ...

  3. Linux下远程连接MySQL数据库

    估计搞了一个多小时才把这个远程连接搞好.一台本地电脑,一台云服务器,都是linux系统. 步骤 在服务器端开启远程访问 首先进入mysql数据库,然后输入下面两个命令: grant all privi ...

  4. Make Rounddog Happy(2019年杭电多校第十场1011+HDU6701+启发式分治)

    目录 题目链接 题意 思路 代码 题目链接 传送门 题意 求有多少个子区间满足\(a_l,a_{l+1},\dots,a_r\)均不相同且\(max(a_l,a_{l+1},\dots,a_r)-(r ...

  5. Chrome调试 ---- 控制台获取元素上绑定的事件信息以及监控事件

    需求场景 在前端开发中,偶尔需要验证下某个元素上到底绑定了哪些事件,以及监控某个元素上的事件触发情况. 解决方案 普通操作 之前面对这种情况,一般采取的措施就是在各个事件里写console.info, ...

  6. python3字符串的方法及注释/ 字符串格式化符号含义及格式化符号含义

     capitalize()   把字符串的第一个字符改为大写   casefold()   把整个字符串的所有字符改为小写   center(width)   将字符串居中,并使用空格填充至长度wid ...

  7. VIJOS-P1152 肥猫的游戏

    洛谷 P1488 肥猫的游戏 洛谷传送门 JDOJ 1314: VIJOS-P1152 肥猫的游戏 JDOJ传送门 Description 野猫与胖子,合起来简称肥猫,是一个班的同学,他们也都是数学高 ...

  8. Oracle EBS 11i x86-64 的预安装

    1.EBS11i的软件组成,28个zip包 Oracle ApplicationsOracle Application with NLSOracle Database technology stack ...

  9. python: int to unicode string

    >>> import types >>> print type(str(2)) <type 'str'> >>> ')) <ty ...

  10. [Gamma]阶段发布说明

    小小易校园微信小程序发布说明 第二版小小易校园小程序发布啦~ 打开微信,点击右上角➕,选择扫一扫,扫描以下二维码即可进入小程序: 版本功能: 上一版功能请参见[Beta阶段]发布说明. 当前版本的更新 ...