ConfigMap 是一种 Kubernetes 资源,用于将配置注入到您的容器中。它们让您可以将堆栈的设置与其代码分开维护。以下是如何使用 ConfigMaps 并将它们提供给您的 Pod。
ConfigMap 有什么用?
ConfigMap专门设计用于封装少量非敏感配置数据。它们是一种将任意键值对放入 Pod 的机制。它们通常用于存储您的数据库服务器的 IP 地址、应用程序的外发电子邮件地址以及您需要在 Pod 外部配置的其他特定于应用程序的设置。
ConfigMap 允许您在专用的 Kubernetes 资源中管理这些数据。Pod 接收键值对作为环境变量或挂载卷中的文件。
什么不可以使用它们?
在有些情况下应在ConfigMap某些情况下不能使用。
ConfigMap 没有安全存储,它们的值没有加密。它们不得包含任何泄露后会构成安全或隐私风险的敏感或机密数据。
不要将密码、API 密钥或加密密钥放入 ConfigMap——而是使用Kubernetes Secret,因为它们的功能类似于 ConfigMap,但具有额外的保护。需要数据库连接的系统应将主机名放在 ConfigMap 中,并将凭据放在单独的 Secret 中。
单个 ConfigMap 的大小不能超过 1 MB。需要更多配置键的系统可以通过替代方法更好地服务,例如通过卷注入手动生成的配置文件。
如果您想坚持使用 ConfigMap,请考虑将您的配置拆分到多个 ConfigMap 资源中。这种方法应该避免 1 MB 的上限,同时让您为每个 Pod 提供所需的最少配置键集。
ConfigMap 值可以是 UTF-8 字符串或编码为 base64 字符串的二进制数据。键名可以包含字母数字、.(句点)、-(连字符)和_(下划线)字符。某些编程语言和框架可能对配置变量有不同的约定,因此请确保使用 Kubernetes 和您的应用程序都支持的格式。
创建配置映射
ConfigMap 具有简单的 YAML 清单。每个 ConfigMap 都需要一个name标准 Kubernetes 格式和一个data包含您的键值对的字段:
apiVersion: v1
kind: ConfigMap
metadata:
name: example-configmap
data:
database_host: "192.168.0.10"
system_email: "[email protected]"
该data字段用于指定具有字符串值的键。您可以binaryData改为使用或data添加 base64 编码的二进制值。钥匙必须在两个独特的data和binaryData。
使用kubectl或您的首选工具将清单应用到您的集群。
链接 ConfigMap 和 Pod
ConfigMap 本身不做任何事情。您已经向集群添加了一些数据;现在让我们将它链接到一个 Pod:
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
containers:
- name: example-container
image: example-image:latest
envFrom:
- configMapRef:
name: example-configmap
该envFrom字段引入由另一个引用资源定义的环境变量。在这种情况下,aconfigMapRef标识了之前创建的 ConfigMap。Pod 的容器将启动database_host并system_email定义环境变量。
有选择地添加环境变量
envFrom当您想使用 ConfigMap 中的每个键并且您确定不会与 Pod 的其他环境变量发生冲突时,它很有用。在更可控的情况下,使用常规env部分,定义单个键,并从 ConfigMap 中提取每个键的值:
env:
- name: DATABASE_HOST_IP
valueFrom:
configMapKeyRef:
name: example-configmap
key: database_host
此示例展示了如何仅database_host使用 ConfigMap 中的密钥启动 Pod 。密钥在注入前也被重命名,因此 Pod 将接收它作为DATABASE_HOST_IP.
将 ConfigMap 与卷一起使用
ConfigMaps 可以作为文件挂载在 Pods 中。Kubernetes 创建一个卷,将 ConfigMap 的内容作为一组文件注入,并将该卷挂载到您的 Pod。
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
containers:
- name: example-container
image: example-image:latest
volumeMounts:
- name: app-config
mountPath: "/etc/config-data"
readOnly: true
volumes:
- name: app-config
configMap:
name: example-configmap
这个 Pod 清单创建了一个名为app-config. 该configMap字段将使用指定 ConfigMap 中的数据预填充卷。
Pod 将卷挂载到/etc/config-data. 您的容器可以读取目录中的文件以访问您的配置值。每个 ConfigMap 键在挂载点中都有自己的文件。
更新 ConfigMap 值
由于 ConfigMap 是标准的 Kubernetes API 资源,您可以随时通过修改清单并将其重新应用到集群来更新值。新值如何到达您的 Pod 取决于您使用的注入机制。
挂载的卷
通过卷挂载到 Pod 中的 ConfigMap 将由 Kubernetes 更新。定期检查对 ConfigMap 的更改;当检测到差异时,您卷中的文件将被更新,因此您的 Pod 将收到新数据。延迟取决于为您的工作节点上的 Kubelet 实例配置的同步间隔。
环境变量
无法更改 Pod 的环境变量,因此 ConfigMap 更改不会到达通过此机制引用键的现有 Pod。您必须更换 Pod 才能使用新数据。
新创建的 Pod 将始终接收当前的 ConfigMap 数据,无论您使用的是卷还是环境变量。如果您需要强制更新配置,请更改 Pod 上的注释,以便 Kubernetes 重新创建它。
不可变的 ConfigMap
ConfigMaps 有一个可选immutable字段,可以防止它们被更新。设置此字段后,您将无法更新 ConfigMap 的数据或删除不可变状态。
apiVersion: v1
kind: ConfigMap
metadata:
name: immutable-configmap
data:
foo: bar
immutable: true
当您确定配置值永远不会改变时,这会很有用。它通过消除意外编辑的可能性来提高安全性。由于 Kubernetes 不再需要监控 ConfigMap 以将任何值更改传播到您的 Pod,因此性能也可以得到提高。
概括
ConfigMaps 应该是您为 Kubernetes Pod 提供非敏感配置密钥的首选。它们是一流的 API 资源,您可以将其用作环境变量或在卷中安装文件。
密码和其他凭据属于 Secrets。这些功能与 ConfigMaps 非常相似,并且被 Pods 以相同的方式引用。替代configMapRef与secretRef拉一键出一个名为秘密的,而不是一个ConfigMap的。