一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情。
一、前言
在使用
Pod
启动应用时,除了镜像之外通常还需要自定义一些参数或是配置,有的时候自定义的配置比较多,所以在Kubernetes
集群中提供了ConfigMap
向容器中提供环境变量或配置文件以实现不同的配置,这样可以使镜像的配置信息与镜像解耦,通过不同的配置信息使应用程序能够得到更好的复用。
想象一个场景:在 Kubernetes
集群中有的时候需要传递一些配置给应用,比如:数据库地址、用户名、密码等,可以有哪些办法呢?
传统思路有三:
-
在打包镜像时将配置信息直接写入配置文件中:使用这种方式特别死板,并且配置数据不能共享,坏处显而易见
-
在配置文件中通过
env
环境变量传入:这种方式如果要修改env
,就必须修改YAML
文件,并重启所有container
,而且配置数据也不能共享 -
在应用启动时通过数据库获取配置数据:这种方式具有一定可行性,配置信息可以多应用共享,但是自己实现起来比较麻烦
所以:kubernetes
提供了统一的应用配置管理方案 ConfigMap
方便我们将配置信息与应用程序分离。
二、在 Pod
中使用 ConfigMap
每次使用的时候,都需要先定义
ConfigMap
,然后在Pod
中引用定义好的配置信息。通过环境变量方式使用ConfigMap
。
(0)配置信息作为环境变量
基本步骤:
- 创建
ConfigMap
- 定义
pod yaml
文件 - 执行创建
pod
kubectl create -f <pod.yaml>
- 查看日志
kubectl logs <pod.name>
1)使用一个 ConfigMap
中的配置信息作为环境变量
pod
如下:
apiVersion: v1
kind: Pod
metadata:
name: dapi-test-pod
spec:
containers:
- name: test-container
image: busybox
command: ["/bin/sh", "-c", "env"] # 容器的启动命令是输出环境变量
env:
- name: SPECIAL_LEVEL_KEY # 定义环境变量的名称
valueFrom: # 环境变量 SPECIAL_LEVEL_KEY 的取值
configMapKeyRef:
name: config-1 # 环境变量的值取自于 config-1 ConfigMap
key: special.how # key 为 special.how
restartPolicy: Never
复制代码
2)使用多个 ConfigMap
中的配置信息作为环境变量
ConfigMap
,如下:
apiVersion: v1
kind: ConfigMap
metadata:
name: config-2
namespace: default
data:
special.how: very
---
apiVersion: v1
kind: ConfigMap
metadata:
name: config-3
namespace: default
data:
log_level: INFO
复制代码
pod
,如下:
apiVersion: v1
kind: Pod
metadata:
name: dapi-test-pod-2
spec:
containers:
- name: test-container-2
image: busybox
command: ["/bin/sh", "-c", "env"]
env:
- name: SPECIAL_LEVEL_KEY
valueFrom:
configMapKeyRef:
name: config-2
key: special.how
- name: LOG_LEVEL
valueFrom:
configMapKeyRef:
name: config-3
key: log_level
restartPolicy: Never
复制代码
3)使用ConfigMap
中的所有配置信息作为环境变量
ConfigMap
如下:
apiVersion: v1
kind: ConfigMap
metadata:
name: config-4
namespace: default
data:
SPECIAL_LEVEL: very
SPECIAL_TYPE: charm
复制代码
pod
如下:
apiVersion: v1
kind: Pod
metadata:
name: dapi-test-pod-3
spec:
containers:
- name: test-container-3
image: busybox
command: ["/bin/sh", "-c", "env"]
envFrom:
- configMapRef:
name: config-4
restartPolicy: Never
复制代码
(1)通过卷挂载volumeMount
方式使用ConfigMap
1)使用ConfigMap
中配置数据挂载到卷
- 创建
yaml
文件
apiVersion: v1
kind: Pod
metadata:
name: dapi-test-pod-5
spec:
containers:
- name: test-container-5
image: busybox
command: ["/bin/sh", "-c", "ls /etc/config"] #查看是否成功挂载
volumeMounts:
- name: config-volume # 引用 volume 的名称
mountPath: /etc/config # 挂载到容器内的目录路径
volumes:
- name: config-volume # 定义 volume 的名称
configMap:
name: config-4 # 使用 ConfigMap "config-4"
restartPolicy: Never
复制代码
- 执行创建
$ kubectl create -f pods/pod-configmap-volume.yaml
pod/dapi-test-pod-5 created
复制代码
- 查看日志,获取容器中
/etc/config
目录下的文件列表
$ kubectl logs dapi-test-pod-5
SPECIAL_LEVEL
SPECIAL_TYPE
复制代码
2)卷挂载时明确存储路径
path
字段:明确挂载到容器后的文件名
- 创建
yaml
apiVersion: v1
kind: Pod
metadata:
name: dapi-test-pod-6
spec:
containers:
- name: test-container-6
image: busybox
command: ["/bin/sh", "-c", "cat /etc/config/keys"]
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: config-4
items:
- key: SPECIAL_LEVEL
path: keys # SPECIAL_LEVEL 的 value 以 keys 文件名进行挂载
restartPolicy: Never
复制代码
- 执行创建
$ kubectl create -f pods/pod-configmap-volume-specific-key.yaml
pod/dapi-test-pod-6 created
复制代码
- 查看日志,检查
/etc/config/keys
文件中存储的值是否为SPECIAL_LEVEL
对应的值
$ kubectl logs dapi-test-pod-6
very
复制代码