正如我们在最近几篇文章中看到的最常用的 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)

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐