关于Kubernetes中的ConfigMap

正如我们在最近几篇文章中看到的最常用的 Kubernetes 资源一样,在这篇文章中,我们将看到一个更重要的 Kubernetes 资源,称为 configMap。我们将了解什么是 configMap,如何在集群中创建、管理和使用它。
如果您最近开始使用 Kubernetes 或只是进行部分管理,您可能会遇到一个问题,例如如何从外部或动态管理我的应用程序配置,我可以在其中定义连接字符串、外部服务 URL、多个环境的自定义配置值。在哪里存储?如果可能的话?
您可以在 UDEMY 上了解更多 Kubernetes 和最新技术,交易延长:课程最高可享受 85% 折扣
简单的答案是肯定的,Kubernetes 有称为 ConfigMaps 的资源。

在本文中,让我们了解如何在 Kubernetes 中使用 ConfigMaps,以及如何创建 ConfigMaps 将它们挂载到卷中,并将它们用作环境变量。
什么是 Kubernetes 中的 ConfigMap?
ConfigMap 是一个 API 对象,用于在键值对中存储非机密数据。Pod可以使用 ConfigMaps 作为环境变量、命令行参数或卷中的配置文件。
ConfigMap 允许您将特定于环境的配置与容器映像分离,以便您的应用程序易于移植。
注意: ConfigMap 不提供保密或加密功能。如果您要存储的数据是机密的,请使用Secret而不是 ConfigMap,或者使用其他(第三方)工具来保护您的数据的私密性。
ConfigMap 有什么用?
始终建议将配置设置分开,以确保它可以被广泛重用。根据十二要素应用程序它有助于维护环境之间的配置,因为 DB 值、资源、外部服务和主机名等会发生变化。
这使您可以根据环境(开发、QA、生产等)轻松更改配置,并在运行时动态更改配置。
ConfigMap 是如何工作的?
假设您有多个环境(即使您可以使用单个环境,也没有限制)并且每个环境都有不同的配置值。您有多个 ConfigMap,每个环境一个。 ConfigMap 被创建并添加到 Kubernetes 集群中。
最后,Pod 中的容器引用 ConfigMap 并使用其值。

创建并挂载 ConfigMap 作为卷
使用 Yaml configmap 很容易创建和管理,这将允许您像使用 `kubectl apply -f $file.yaml`的任何其他 Kubernetes 资源一样创建该 ConfigMap。之后,将 ConfigMap 挂载为 Pod 的 YAML 规范中的卷。
在 YAML 文件中定义 ConfigMap。
创建一个 YAML 文件,为您的 ConfigMap 设置键值对。
api版本:v1
种类:ConfigMap 元数据:
名称:测试配置图
数据:
配置值可以设置为键值属性
数据库:mongodb
数据库_uri: mongodb://localhost:27017
或者设置为完整的文件内容(甚至是 JSON!)
键:|
image.public.keyu003d771
rsa.public.keyu003d42
在您的 Kubernetes 集群中创建 ConfigMap
使用命令创建 ConfigMap
# kubectl apply -f config-map.yaml
通过卷挂载 ConfigMap
此 ConfigMap 中的每个属性名称在您挂载后都将成为挂载目录 (`/etc/config`) 中的一个新文件。
种类:豆荚
api版本:v1
元数据:
名称:pod-using-configmap 规格:
将 ConfigMap 作为卷添加到 Pod
卷:
`name`这里必须匹配名字
在卷挂载中指定
- 名称:test-configmap-volume
使用配置映射数据填充卷
配置映射:
`name`这里必须匹配名字
在 ConfigMap 的 YAML 中指定
名称:测试配置图
容器:
- 名称:容器配置图
图片:nginx:1.20.2
挂载包含配置数据的卷
进入你的容器文件系统
卷装:
`name`这里必须匹配名字
来自此 pod 的卷部分
- 名称:test-configmap-volume
挂载路径:/etc/config
使用 `kubectl exec -it pod-using-configmap sh`附加到创建的 Pod。然后运行 `ls /etc/config`,您可以看到 ConfigMap 中的每个键作为文件添加到目录中。您可以使用 `cat`查看每个文件的内容,您将看到来自 ConfigMap 的值。
使用环境变量和 `envFrom`创建一个 ConfigMap?
您可以使用 `envFrom`属性通过正在运行的容器中的环境变量来使用 ConfigMap。
使用上一节中的示例创建 ConfigMap。将每个容器中的 `envFrom`键设置为包含要包含的 ConfigMap 列表的对象。
种类:豆荚
api版本:v1
元数据:
名称:pod-env-var
规格:
容器:
- 名称:env-var-configmap
图片:nginx:1.20.2
env来自:
- configMapRef:
名称:测试配置图
使用 `kubectl exec -it pod-env-var sh`附加到创建的 Pod。然后运行 `env`并查看 ConfigMap 中的每个键现在都可用作环境变量。
请注意:作为环境变量使用的 ConfigMap 不会自动更新,需要重新启动 pod。
创建配置映射
这是 kubectl 的模式,使用这个 kubectl 命令:
# kubectl create configmap <名称> <数据源>
<name> 是 ConfigMap 的名称,它应该有效地用作 DNS 子域。 <data-source> 表示应该从中获取 ConfigMap 数据的文件或值。
您可以基于一个文件、多个文件、目录或 env 文件(环境变量列表)创建 ConfigMap。每个文件的基本名称用作键,文件的内容成为值。
ConfigMap 数据源示例 kubectl 命令单个文件kubectl create configmap app-settings –from-fileu003dapp-container/settings/app.properties多个文件kubectl create configmap app-settings –from-fileu003dapp-container /settings/app.properties–from-fileu003dapp-container/settings/backend.propertiesEnv-filekubectl create configmap app-env-file–from-env-fileu003dapp-container/settings/app- env-file.properties目录kubectl create configmap app-settings –from-fileu003dapp-container/settings/
您可以使用以下命令获取有关此命令的更多信息
# kubectl 创建配置映射 --help
不可变的配置映射
Kubernetes 功能 Immutable Secrets 和 ConfigMaps 提供了将单个 Secrets 和 ConfigMaps 设置为不可变的选项。对于广泛使用 ConfigMap 的集群(至少有数万个唯一的 ConfigMap 到 Pod 挂载),防止对其数据进行更改具有以下优点:
保护您免受可能导致应用程序中断的意外(或不需要的)更新
通过关闭标记为不可变的 ConfigMap 的监视,显着减少 kube-apiserver 上的负载,从而提高集群的性能。
此功能由 ImmutableEphemeralVolumes 功能门控制。您可以通过将不可变字段设置为 true 来创建不可变的 ConfigMap。例如:
api版本:v1
种类:ConfigMap
元数据:
...
数据:
...
不可变:真
一旦 ConfigMap 被标记为不可变,就无法恢复此更改,也无法改变数据或 binaryData 字段的内容。您只能删除并重新创建 ConfigMap。由于现有 Pod 维护已删除 ConfigMap 的挂载点,因此建议重新创建这些 Pod。
如果你喜欢这篇文章,可以请我喝咖啡Prabhakar 是 DevOps 工程师 (buymeacoffee.com)
更多推荐
所有评论(0)