了解 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"