分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 教程案例

Kubernetes 配置管理 ConfigMap(十二)

发布时间:2023-09-06 02:26责任编辑:顾先生关键词:配置
一、背景

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

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

二、创建 ConfigMap

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

创建ConfigMap的方式有4种:

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

2.1、通过 --from-literal

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

查看配置的内容。

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

2.2、通过 --from-file

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

查看配置内容:

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

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

2.3、通过--from-env-file

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

查看配置内容:

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

2.4、YAML 配置文件

配置文件内容如下。

apiVersion: v1kind: ConfigMapmetadata: ?name: test-config4data: ?db.host: 172.18.8.200 ?db.port: "3306"

创建并查看其内容。

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

三、ConfigMap 使用

使用ConfigMap有二种方式:

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

3.1、通过环境变量使用

使用valueFromconfigMapKeyRefnamekey指定要用的key。

apiVersion: v1kind: Podmetadata: ?name: mypodspec: ?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: v1kind: Podmetadata: ?name: mypodspec: ?containers: ?- name: mypod ???image: busybox ???args: [ "/bin/sh", "-c", "sleep 3000" ] ???envFrom: ???- configMapRef: ???????name: test-config3

3.2、作为volume挂载使用

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

apiVersion: v1kind: Podmetadata: ?name: mypodspec: ?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 -altotal 0drwxrwxrwx ???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.654058863lrwxrwxrwx ???1 root ????root ???????????31 Dec 16 05:23 ..data -> ..2018_12_16_05_23_04.654058863lrwxrwxrwx ???1 root ????root ???????????14 Dec 16 05:23 db.host -> ..data/db.hostlrwxrwxrwx ???1 root ????root ???????????14 Dec 16 05:23 db.port -> ..data/db.port/etc/db # cat db.host 172.18.8.200/etc/db # 

3.3、ConfigMap的热更新

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

3.4、最佳使用方法

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

[mysqld]datadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.socksymbolic-links=0[mysqld_safe]log-error=/var/log/mariadb/mariadb.logpid-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 yamlapiVersion: v1data: ?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.dkind: ConfigMapmetadata: ?creationTimestamp: "2018-12-16T05:38:29Z" ?name: mysql-cm ?namespace: default ?resourceVersion: "9273" ?selfLink: /api/v1/namespaces/default/configmaps/mysql-cm ?uid: d1201233-00f4-11e9-9fa7-000c291fb1b3

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

apiVersion: v1kind: Podmetadata: ?name: mypodspec: ?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/mysqlsocket=/var/lib/mysql/mysql.socksymbolic-links=0[mysqld_safe]log-error=/var/log/mariadb/mariadb.logpid-file=/var/run/mariadb/mariadb.pid!includedir /etc/my.cnf.d/ # exit

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

Kubernetes 配置管理 ConfigMap(十二)

原文地址:http://blog.51cto.com/wzlinux/2331050

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved