了解 Kubernetes ConfigMap

已完成

应用程序存储库中,有一个配置文件已加载到 index.html 文件中,以便无需完整的映像生成即可更新环境变量。

配置文件不包含敏感信息,只需随容器一起加载。 如何在不需要加密或编码的情况下将文件装载到容器中?

了解 ConfigMap

ConfigMap 与 Secret 相对应。 Secret 提供了一种存储和传递敏感数据的方式,而 ConfigMap 是用于存储非敏感数据的对象,它使用的键值结构与机密相同。 ConfigMap 对象允许你将配置与容器映像分离,因此这些映像保持无状态。

创建一个 ConfigMap 以将配置数据与应用程序代码分开存储,并以类似于我们在 Pod 中加载 Secret 对象的方式加载该 ConfigMap。 只能使用环境变量来引用 ConfigMaps,或者将其装载为容器内的卷中的文件。

ConfigMap 具有数据大小限制;在 ConfigMap 中最多可以容纳 1 MiB 的数据。 大小限制可以将大型配置分解为较小的块,从而帮助避免使用大型、复杂的配置文件。 通过 ConfigMap,你可以只在容器中装载所需的配置文件,从而实现更大的粒度。

与机密一样,ConfigMap 也是命名空间资源。 只能使用容器创建时所在的同一命名空间中的容器访问和装载 ConfigMap。

ConfigMap 还由其他工具(如 Helm 和 Kubernetes Operators)广泛用于存储和读取状态。

ConfigMap 更新

在 pod 中,作为卷装载的所有 ConfigMap 都会在其值发生更改时自动进行更新。 由于 Kubelet 配置的原因,此项更改可能不会立即发生,但它会自动发生,因此无需重启 Pod。

当 ConfigMap 绑定到环境变量时,它不会自动更新。 对于这种情况,需要重启 Pod 才能使更改生效。

创建和使用 ConfigMap

可以像创建 Secret 一样创建 ConfigMap:YAML 文件。 ConfigMap 规范如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: configmap-name
  namespace: default
data:
  key-name: "value as key"
  key.name: |
    multi line
    property, called "file-like" values

可以通过 Pod 或部署规范中的一个或多个键引用 ConfigMap,如以下示例所示:

apiVersion: v1
kind: Pod
metadata:
  name: configmap-as-env
  namespace: default
spec:
  containers:
    - name: configmap-env
      image: alpine
      command: ["sleep", "3600"]
      env:
        - name: ENVIRONMENT_VARIABLE_NAME
          valueFrom:
            configMapKeyRef:
              name: configmap-name
              key: key-name

还可以使用只读卷将其作为文件装载到 Pod 内,如以下示例所示:

apiVersion: v1
kind: Pod
metadata:
  name: configmap-as-env
  namespace: default
spec:
  containers:
    - name: configmap-env
      image: alpine
      command: ["sleep", "3600"]
      volumeMounts:
      - name: volume-name
        mountPath: "/path/to/mount"
        readOnly: true
  volumes:
    - name: volume-name
      configMap:
        name: configmap-name
        items:
        - key: "key-name"
          path: "path/to/mount/the/key"

知识检查

1.

为什么应使用 ConfigMap?

2.

如何在应用程序中使用 ConfigMap?

3.

ConfigMap 是否对命名空间有限制?