ConfigMap

1 创建

ConfigMap 资源对象使用key-value形式的键值对来配置数据,这些数据可以在Pod里面使用,ConfigMap和我们后面要讲到的Secrets比较类似,一个比较大的区别是ConfigMap可以比较方便的处理一些非敏感的数据,比如密码之类的还是需要使用Secrets来进行管理。我们来举个例子说明下ConfigMap的使用方法:

kind: ConfigMap
apiVersion: v1
metadata:
  name: cm-demo
  namespace: default
data:
  data.1: hello
  data.2: world
  config: |
    property.1=value-1
    property.2=value-2
    property.3=value-3

其中配置数据在data属性下面进行配置,前两个被用来保存单个属性,后面一个被用来保存一个配置文件。

config: |:使用 | 符号表示多行文本,这种格式称为 "多行字符串""块标量"。这意味着 config 键的值是一个多行文本块

当然同样的我们可以使用kubectl create -f xx.yaml来创建上面的ConfigMap对象,但是如果我们不知道怎么创建ConfigMap的话,不要忘记kubectl是我们最好的老师,可以使用kubectl create configmap -h来查看关于创建ConfigMap的帮助信息,

Examples:
  # Create a new configmap named my-config based on folder bar
  kubectl create configmap my-config --from-file=path/to/bar

  # Create a new configmap named my-config with specified keys instead of file basenames on disk
  kubectl create configmap my-config --from-file=key1=/path/to/bar/file1.txt --from-file=key2=/path/to/bar/file2.txt

  # Create a new configmap named my-config with key1=config1 and key2=config2
  kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2

我们可以看到可以从一个给定的目录来创建一个ConfigMap对象,比如我们有一个testcm的目录,该目录下面包含一些配置文件,redismysql的连接信息,如下:

然后我们可以使用from-file关键字来创建包含这个目录下面所以配置文件的ConfigMap

其中from-file参数指定在该目录下面的所有文件都会被用在ConfigMap里面创建一个键值对,键的名字就是文件名,值就是文件的内容。

创建完成后,同样我们可以使用如下命令来查看ConfigMap列表:

可以看到已经创建了一个cm-demo1ConfigMap对象,然后可以使用describe命令查看详细信息:

我们可以看到两个keytestcm目录下面的文件名称,对应的value值的话就是文件内容,这里值得注意的是如果文件里面的配置信息很大的话,describe的时候可能不会显示对应的值,要查看键值的话,可以使用如下命令:

除了通过文件目录进行创建,我们也可以使用指定的文件进行创建ConfigMap,同样的,以上面的配置文件为例,我们创建一个redis的配置的一个单独ConfigMap对象:

我们可以看到一个关联redis.conf文件配置信息的ConfigMap对象创建成功了,另外值得注意的是--from-file这个参数可以使用多次,比如我们这里使用两次分别指定redis.confmysql.conf文件,就和直接指定整个目录是一样的效果了。

另外,通过帮助文档我们可以看到我们还可以直接使用字符串进行创建,通过--from-literal参数传递配置信息,同样的,这个参数可以使用多次,格式如下:

2 使用

ConfigMap创建成功了,那么我们应该怎么在Pod中来使用呢?我们说ConfigMap这些配置数据可以通过很多种方式在Pod里使用,主要有以下几种方式:

  • 设置环境变量的值

  • 在容器里设置命令行参数

  • 在数据卷里面创建config文件

首先,我们使用ConfigMap来填充我们的环境变量:

这个Pod运行后会输出如下几行:

我们可以看到DB_HOSTDB_PORT都已经正常输出了,另外的环境变量是因为我们这里直接把cm-demo1给注入进来了,所以把他们的整个键值给输出出来了,这也是符合预期的。

另外我们可以使用ConfigMap来设置命令行参数,ConfigMap也可以被用来设置容器中的命令或者参数值,如下Pod:

运行这个Pod后会输出如下信息:

另外一种是非常常见的使用ConfigMap的方式:通过数据卷使用,在数据卷里面使用ConfigMap,就是将文件填入数据卷,在这个文件中,键就是文件名,键值就是文件内容:

运行这个Pod的,查看日志:

当然我们也可以在ConfigMap值被映射的数据卷里去控制路径,如下Pod定义:

运行这个Pod的,查看日志:

另外需要注意的是,当ConfigMap以数据卷的形式挂载进Pod的时,这时更新ConfigMap(或删掉重建ConfigMap),Pod内挂载的配置信息会热更新。这时可以增加一些监测配置文件变更的脚本,然后reload对应服务。

3 实践

  • server-id.cnf:一个配置文件,用于设置 MySQL 的 server-id

    • @@SERVER_ID@@ 是一个占位符,通常在部署时会被替换为具体的值。

  • create-peers.sh:一个 Shell 脚本,用于生成集群中所有节点的连接字符串。

    • 使用 while 循环遍历副本数({{ .Values.replicaCount }}),生成每个节点的地址。

  • leader-start.shleader-stop.sh:用于在 Kubernetes 中动态更改 Pod 的标签,以实现主从切换。

    • 使用 curl 命令向 Kubernetes API 发送 PATCH 请求,修改 Pod 的 role 标签。

    • leader-start.sh 将 Pod 标签设置为 leader,而 leader-stop.sh 将其设置为 follower

3.1 configmap 列表

kubectl get configmap

3.2 configmap 详情

kubectl describe configmap xdbmysql57001

Last updated