了解 Kubernetes ConfigMap
- 10 分钟
在应用程序存储库中index.html
,文件中加载了配置文件,允许更新环境变量,而无需完整的映像生成。
配置文件不包含敏感信息,只需随容器一起加载。 如何在不需要加密或编码的情况下将文件装载到容器中?
了解 ConfigMap
ConfigMap 是 Secret 的对应项。 虽然机密提供了一种存储和传递敏感数据的方法,但 ConfigMap 是一种使用与机密相同的键值结构存储非敏感数据的对象。 使用 ConfigMaps 对象可以将配置与容器映像分离,使映像保持无状态。
创建一个 ConfigMap 以将配置数据与应用程序代码分开存储,并以类似于我们在 Pod 中加载 Secret 对象的方式加载该 ConfigMap。 只能使用环境变量来引用 ConfigMaps,或者将其装载为容器内的卷中的文件。
ConfigMap 具有数据大小限制:在 ConfigMap 中最多可以容纳 1 MiB 的数据。 大小限制有助于避免大型复杂配置文件,方法是将大型配置分解为较小的区块。 使用 ConfigMaps 时,只能在容器中装载所需的配置文件,这样可以实现更精细的粒度。
与 Secrets 一样,ConfigMaps 是基于命名空间的。 您只能使用创建ConfigMap时所在命名空间中的容器来访问和挂载ConfigMap。
其他工具(如 Helm 和 Kubernetes 运算符)也广泛使用 ConfigMaps 来存储和读取状态。
ConfigMap 更新
在 pod 中,作为卷装载的所有 ConfigMap 都会在其值发生更改时自动进行更新。 由于 Kubelet 配置,此更改可能不会立即发生,但它会自动发生,因此无需重启 Pod。
当 ConfigMap 绑定到环境变量时,它不会自动更新。 对于这些情况,必须重启 Pod 才能使更改生效。
创建和使用 ConfigMaps
您可以使用与 Secret 相同的方法,即使用 YAML 文件来创建 ConfigMap。 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"