【Kubernetes】Pod 之 使用 ConfigMap

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

一、前言

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

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

传统思路有三:

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

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

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

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



二、在 Pod 中使用 ConfigMap

每次使用的时候,都需要先定义 ConfigMap,然后在 Pod 中引用定义好的配置信息。通过环境变量方式使用 ConfigMap

(0)配置信息作为环境变量

基本步骤:

  1. 创建ConfigMap
  2. 定义pod yaml文件
  3. 执行创建pod

kubectl create -f <pod.yaml>

  1. 查看日志

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中配置数据挂载到卷

  1. 创建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
复制代码
  1. 执行创建
$ kubectl create -f pods/pod-configmap-volume.yaml
pod/dapi-test-pod-5 created
复制代码
  1. 查看日志,获取容器中 /etc/config 目录下的文件列表
$ kubectl logs dapi-test-pod-5
SPECIAL_LEVEL
SPECIAL_TYPE
复制代码

2)卷挂载时明确存储路径

path字段:明确挂载到容器后的文件名

  1. 创建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
复制代码
  1. 执行创建
$ kubectl create -f pods/pod-configmap-volume-specific-key.yaml
pod/dapi-test-pod-6 created
复制代码
  1. 查看日志,检查 /etc/config/keys 文件中存储的值是否为 SPECIAL_LEVEL 对应的值
$ kubectl logs dapi-test-pod-6
very
复制代码

猜你喜欢

转载自juejin.im/post/7082436322207465502