EvenChan's Ops.

k8s-ConfigMap 实现应用和配置分离

字数统计: 1.1k阅读时长: 4 min
2023/04/07

ConfigMap 背景

应用程序的运行可能会依赖一些配置,而这些配置又是可能会随着需求产生变化的,如果我们的应用程序架构不是应用和配置分离的,那么就会存在当我们需要去修改某些配置项的属性时需要重新构建镜像文件的窘境。

现在,ConfigMap组件可以很好的帮助我们实现应用和配置分离,避免因为修改配置项而重新构建镜像。 ConfigMap 用于保存配置数据的键值对,可以用来保存单个属性,也可以用来保存配置文件。ConfigMap 跟 Secret 很类似,但它可以更方便地处理不包含敏感信息的字符串。

ConfigMap 创建方式

ConfigMap 可以通过多种方式创建,包括:

  • 命令行工具 kubectl

可以使用 kubectl create configmap 命令从文件或文本创建 ConfigMap。

例如,以下命令将名为 my-config 的 ConfigMap 从文件创建:

1
kubectl create configmap my-config --from-file=config.properties

  • 声明式 YAML 文件

可以使用声明式 YAML 文件定义 ConfigMap 对象。

例如,以下 YAML 定义了一个名为 my-config 的 ConfigMap:

1
2
3
4
5
6
7
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-config
data:
  DB_USERNAME: admin
  DB_PASSWORD: password123

  • 配置自动加载

在 Kubernetes 中,可以使用特定的挂载点来自动加载 ConfigMap 作为环境变量或卷。

这可以通过 Pod 中的 Volume 和环境变量实现。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: my-container
      image: my-image
      volumeMounts:
        - name: config-volume
          mountPath: /etc/config
      env:
        - name: DB_USERNAME
          valueFrom:
            configMapKeyRef:
              name: my-config
              key: DB_USERNAME
  volumes:
    - name: config-volume
      configMap:
        name: my-config

ConfigMap 的使用

在 Kubernetes 中,有三种主要方式可以将 ConfigMap 注入到 Pod 中。

  • 定义成环境变量

在 Pod 中,可以将 ConfigMap 数据注入到容器的环境变量中。假设已经创建了一个名为 my-config 的 ConfigMap,包含以下数据:

1
2
DB_USERNAME=admin
DB_PASSWORD=password123

可以通过定义环境变量引用 ConfigMap 的键来将该数据注入到容器中。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: my-container
      image: my-image
      env:
        - name: DB_USERNAME
          valueFrom:
            configMapKeyRef:
              name: my-config
              key: DB_USERNAME
        - name: DB_PASSWORD
          valueFrom:
            configMapKeyRef:
              name: my-config
              key: DB_PASSWORD

  • 使用卷

另一种常见的方法是将 ConfigMap 数据作为文件或目录挂载到容器中。假设已经创建了一个名为 my-config 的 ConfigMap,包含以下数据:

1
2
3
config.properties:
  server.port=8080
  database.url=jdbc:mysql://localhost/mydb

则可以使用以下 YAML 定义一个 Pod,将 ConfigMap 作为 Volume 挂载到容器中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: my-container
      image: my-image
      volumeMounts:
        - name: config-volume
          mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        name: my-config

在容器内,可以使用与卷相同的路径来访问 ConfigMap 中的数据。

  • 自定义全局参数

还可以将 ConfigMap 数据作为自定义全局参数传递给 Kubernetes 对象,如 Deployment。

例如,以下 YAML 定义了一个 Deployment,其中参数可以通过 ConfigMap 设置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-container
          image: my-image
          command: ["/bin/myapp"]
          args: ["--config=/etc/myapp/config.json"]
          env:
            - name: MY_APP_ENV
              value: "production"
          volumeMounts:
            - name: config-volume
              mountPath: /etc/myapp/
      volumes:
        - name: config-volume
          configMap:
            name: my-config

在此示例中,我们通过 ConfigMap 将 myapp 的配置文件传递给容器,并将环境设置为 production。

使用 ConfigMap 的注意事项

ConfigMap 是 Kubernetes 中非常有用的功能,但要正确使用它需要注意以下几点:

  1. 避免包含敏感信息

由于 ConfigMap 存储在明文中,因此不应该将其中包含敏感信息,例如密码或密钥等。这些信息应该以其他安全方式存储和管理,例如 Kubernetes 的 Secret 对象。

  1. 注意 ConfigMap 与容器之间的同步性

如果在 ConfigMap 中更改了数据,Pod 中的容器可能无法及时获得更改的信息。这可以通过将 Pod 设置为重新启动或在运行时重新加载 ConfigMap 来解决。

  1. 指定必须存在的键

如果在容器中引用 ConfigMap 的不存在密钥,则容器将无法启动。因此,建议在 YAML 文件中定义 ConfigMap 时指定必须存在的键。

  1. 存储 ConfigMap 在默认 namespace 下可能会产生问题

如果 ConfigMap 存储在默认命名空间中,则在另一个命名空间中使用 ConfigMap 时可能会出现问题。因此,建议将 ConfigMap 存储在自己的命名空间中。

总结

ConfigMap 是 Kubernetes 中重要的资源对象,可以存储不敏感的配置信息并将其注入到 Pod 中。

CATALOG
  1. 1. ConfigMap 背景
  2. 2. ConfigMap 创建方式
  3. 3. ConfigMap 的使用
  4. 4. 使用 ConfigMap 的注意事项
  5. 5. 总结