From 95b49efb19705eeebb2169a297f45e55fd6e62b7 Mon Sep 17 00:00:00 2001 From: windsonsea Date: Fri, 13 Sep 2024 09:12:01 +0800 Subject: [PATCH] [zh] Sync a concept: configuation/configmap.md --- .../docs/concepts/configuration/configmap.md | 104 ++++++++++++++++-- .../examples/configmap/env-configmap.yaml | 12 ++ 2 files changed, 109 insertions(+), 7 deletions(-) create mode 100644 content/zh-cn/examples/configmap/env-configmap.yaml diff --git a/content/zh-cn/docs/concepts/configuration/configmap.md b/content/zh-cn/docs/concepts/configuration/configmap.md index 4fc5950310bcf..d3bbb5eef50f0 100644 --- a/content/zh-cn/docs/concepts/configuration/configmap.md +++ b/content/zh-cn/docs/concepts/configuration/configmap.md @@ -1,11 +1,19 @@ --- -title: ConfigMaps +title: ConfigMap api_metadata: - apiVersion: "v1" kind: "ConfigMap" content_type: concept weight: 20 --- + @@ -108,17 +116,17 @@ You can write a Pod `spec` that refers to a ConfigMap and configures the contain in that Pod based on the data in the ConfigMap. The Pod and the ConfigMap must be in the same {{< glossary_tooltip text="namespace" term_id="namespace" >}}. --> -## ConfigMaps 和 Pods +## ConfigMap 和 Pod {#configmaps-and-pods} 你可以写一个引用 ConfigMap 的 Pod 的 `spec`,并根据 ConfigMap 中的数据在该 Pod 中配置容器。这个 Pod 和 ConfigMap 必须要在同一个 {{< glossary_tooltip text="名字空间" term_id="namespace" >}} 中。 +{{< note >}} -{{< note >}} {{< glossary_tooltip text="静态 Pod" term_id="static-pod" >}} 中的 `spec` 字段不能引用 ConfigMap 或任何其他 API 对象。 {{< /note >}} @@ -150,6 +158,7 @@ data: color.bad=yellow allow.textmode=true ``` + -{{< note >}} -使用 ConfigMap 作为 [subPath](/zh-cn/docs/concepts/storage/volumes#using-subpath) 卷挂载的容器将不会收到 ConfigMap 的更新。 +使用 ConfigMap 作为 [subPath](/zh-cn/docs/concepts/storage/volumes#using-subpath) +卷挂载的容器将不会收到 ConfigMap 的更新。 {{< /note >}} 下面是一个将 ConfigMap 定义为 Pod 环境变量的示例: +以下 ConfigMap (myconfigmap.yaml) 存储两个属性:username 和 access_level: + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: myconfigmap +data: + username: k8s-admin + access_level: "1" +``` + + +以下命令将创建 ConfigMap 对象: + +```shell +kubectl apply -f myconfigmap.yaml +``` + + +以下 Pod 将 ConfigMap 的内容用作环境变量: + +{{% code_sample file="configmap/env-configmap.yaml" %}} + + +`envFrom` 字段指示 Kubernetes 使用其中嵌套的源创建环境变量。 +内部的 `configMapRef` 通过 ConfigMap 的名称引用之,并选择其所有键值对。 +将 Pod 添加到你的集群中,然后检索其日志以查看 printenv 命令的输出。 +此操作可确认来自 ConfigMap 的两个键值对已被设置为环境变量: + +```shell +kubectl apply -f env-configmap.yaml +``` + +```shell +kubectl logs pod/ env-configmap +``` + + +输出类似于: + +```console +... +username: "k8s-admin" +access_level: "1" +... +``` + + +有时 Pod 不需要访问 ConfigMap 中的所有值。 +例如,你可以有另一个 Pod 只使用 ConfigMap 中的 username 值。 +在这种使用场景中,你可以转为使用 `env.valueFrom` 语法,这样可以让你选择 ConfigMap 中的单个键。 +环境变量的名称也可以不同于 ConfigMap 中的键。例如: + ```yaml apiVersion: v1 kind: Pod @@ -404,9 +487,16 @@ spec: configMapKeyRef: name: myconfigmap key: username - ``` + +在从此清单创建的 Pod 中,你将看到环境变量 `CONFIGMAP_USERNAME` 被设置为 ConfigMap 中 `username` 的取值。 +来自 ConfigMap 数据中的其他键不会被复制到环境中。 + -Kubernetes 特性 _Immutable Secret 和 ConfigMaps_ 提供了一种将各个 +Kubernetes 特性 **Immutable Secret 和 ConfigMap** 提供了一种将各个 Secret 和 ConfigMap 设置为不可变更的选项。对于大量使用 ConfigMap 的集群 (至少有数万个各不相同的 ConfigMap 给 Pod 挂载)而言,禁止更改 ConfigMap 的数据有以下好处: diff --git a/content/zh-cn/examples/configmap/env-configmap.yaml b/content/zh-cn/examples/configmap/env-configmap.yaml new file mode 100644 index 0000000000000..7199b05c4bf85 --- /dev/null +++ b/content/zh-cn/examples/configmap/env-configmap.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: Pod +metadata: + name: env-configmap +spec: + containers: + - name: app + command: ["/bin/sh", "-c", "printenv"] + image: busybox:latest + envFrom: + - configMapRef: + name: myconfigmap