一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情。
一、前言
在使用
Pod启动应用时,除了镜像之外通常还需要自定义一些参数或是配置,有的时候自定义的配置比较多,所以在Kubernetes集群中提供了ConfigMap向容器中提供环境变量或配置文件以实现不同的配置,这样可以使镜像的配置信息与镜像解耦,通过不同的配置信息使应用程序能够得到更好的复用。
想象一个场景:在 Kubernetes 集群中有的时候需要传递一些配置给应用,比如:数据库地址、用户名、密码等,可以有哪些办法呢?
传统思路有三:
-
在打包镜像时将配置信息直接写入配置文件中:使用这种方式特别死板,并且配置数据不能共享,坏处显而易见
-
在配置文件中通过
env环境变量传入:这种方式如果要修改env,就必须修改YAML文件,并重启所有container,而且配置数据也不能共享 -
在应用启动时通过数据库获取配置数据:这种方式具有一定可行性,配置信息可以多应用共享,但是自己实现起来比较麻烦
所以:kubernetes 提供了统一的应用配置管理方案 ConfigMap 方便我们将配置信息与应用程序分离。
ConfigMap 简介
ConfigMap 在容器中使用的场景通常有 3 种,分别如下所示:
-
生成为容器中的环境变量
-
设置容器启动命令的启动参数(需设置为环境变量)
-
以
Volume的形式挂载为容器内部的文件或目录
使用 ConfigMap 的限制条件:
-
ConfigMap必须在Pod之前创建 -
ConfigMap受Namespace限制,只有处于相同Namespace中的Pod才可以引用它 -
kubelet只支持可以被API Server管理的Pod使用ConfigMap:kubelet在本Node上通过--manifest-url或--config自动创建的静态Pod无法引用ConfigMap -
在
Pod对ConfigMap进行挂载 (volume) 操作时,在容器内部只能挂载为“目录”,不能挂载为“文件”。在挂载到容器内部后,在目录下将包含
ConfigMap定义的每个item,如果在该目录下原来还有其它文件,则容器内的该目录将被挂载的ConfigMap覆盖。如果想要保存原来的其它文件,可以将
ConfigMap挂载到容器内部的临时目录,再通过启动脚本将配置文件复制 (cp) 或链接 (link) 到应用所在的实际目录下。
二、创建 ConfigMap 资源对象
创建ConfigMap资源对象方式:
- 通过
yaml配置文件 kubectl创建- 通过
ConfigMap生成器kustomization.yaml创建
(1)yaml配置文件
yaml配置文件
apiVersion: v1
kind: ConfigMap
metadata:
name: cm-appvars # ConfigMap 的名称
data: # 配置信息
apploglevel: info
appdatadir: /var/data
- 命令执行
$ kubectl create -f cm-appvars.yaml
configmap/cm-appvars created
- 查看
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创建
kubectl1.14 版本开始支持kustomization.yaml
步骤:
-
使用生成器创建
ConfigMap -
发送给
API Server创建资源对象 -
从文件创建生成器
# 使用 game.properties 文件生成一个 ConfigMap
# 注意目录
cat <<EOF >/home/donald/kustomization.yaml
configMapGenerator:
- name: game-config-5
files:
- game.properties
EOF
- 执行创建
# 注意目录
donald:/home/donald/ $ kubectl apply -k .
# 查看
kubectl get configmap | grep game-config