【Kubernetes】Pod 之 创建 ConfigMap 资源对象

354 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情

一、前言

在使用 Pod 启动应用时,除了镜像之外通常还需要自定义一些参数或是配置,有的时候自定义的配置比较多,所以在 Kubernetes 集群中提供了 ConfigMap 向容器中提供环境变量或配置文件以实现不同的配置,这样可以使镜像的配置信息与镜像解耦,通过不同的配置信息使应用程序能够得到更好的复用。

想象一个场景:在 Kubernetes 集群中有的时候需要传递一些配置给应用,比如:数据库地址、用户名、密码等,可以有哪些办法呢?

传统思路有三:

  1. 在打包镜像时将配置信息直接写入配置文件中:使用这种方式特别死板,并且配置数据不能共享,坏处显而易见

  2. 在配置文件中通过 env 环境变量传入:这种方式如果要修改 env,就必须修改 YAML 文件,并重启所有 container,而且配置数据也不能共享

  3. 在应用启动时通过数据库获取配置数据:这种方式具有一定可行性,配置信息可以多应用共享,但是自己实现起来比较麻烦

所以:kubernetes 提供了统一的应用配置管理方案 ConfigMap 方便我们将配置信息与应用程序分离。

ConfigMap 简介

ConfigMap 在容器中使用的场景通常有 3 种,分别如下所示:

  1. 生成为容器中的环境变量

  2. 设置容器启动命令的启动参数(需设置为环境变量)

  3. Volume 的形式挂载为容器内部的文件或目录

使用 ConfigMap 的限制条件:

  • ConfigMap 必须在 Pod 之前创建

  • ConfigMapNamespace 限制,只有处于相同 Namespace 中的 Pod 才可以引用它

  • kubelet 只支持可以被 API Server 管理的 Pod 使用 ConfigMapkubelet 在本 Node 上通过 --manifest-url--config 自动创建的静态 Pod 无法引用 ConfigMap

  • PodConfigMap 进行挂载 (volume) 操作时,在容器内部只能挂载为“目录”,不能挂载为“文件”。

    在挂载到容器内部后,在目录下将包含 ConfigMap 定义的每个 item,如果在该目录下原来还有其它文件,则容器内的该目录将被挂载的 ConfigMap 覆盖。

    如果想要保存原来的其它文件,可以将 ConfigMap 挂载到容器内部的临时目录,再通过启动脚本将配置文件复制 (cp) 或链接 (link) 到应用所在的实际目录下。



二、创建 ConfigMap 资源对象

创建ConfigMap资源对象方式:

  • 通过yaml配置文件
  • kubectl创建
  • 通过ConfigMap生成器kustomization.yaml创建

(1)yaml配置文件

  1. yaml配置文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-appvars # ConfigMap 的名称
data: # 配置信息
  apploglevel: info
  appdatadir: /var/data
  1. 命令执行
$ kubectl create -f cm-appvars.yaml
configmap/cm-appvars created
  1. 查看ConfigMap
$ kubectl get configmap

# 查看刚刚创建的 cm-appvars 的详细信息
$ kubectl describe configmap cm-appvars

(2)kubectl

命令形式:kubectl create configmap <map-name> <data-source>

  • configmap:缩写 cm
  • <map-name>:设置 configmap名字
  • <data-source>: 可以是目录、文件、key-value键值对

<data-source>可选参数:

  • --from-file/--from-env-file: 从目录或文件创建
  • --from-literal:指定键值对创建

可以通过 kubectl create configmap -h 查看具体参数和使用方法。


(3)通过ConfigMap生成器kustomization.yaml创建

kubectl 1.14 版本开始支持 kustomization.yaml

步骤:

  1. 使用生成器创建ConfigMap

  2. 发送给API Server创建资源对象

  3. 从文件创建生成器

# 使用 game.properties 文件生成一个 ConfigMap

# 注意目录

cat <<EOF >/home/donald/kustomization.yaml
configMapGenerator:
- name: game-config-5
  files:
  - game.properties
EOF
  1. 执行创建
# 注意目录
donald:/home/donald/ $ kubectl apply -k .


# 查看
kubectl get configmap | grep game-config