diff --git a/content/zh-cn/docs/tasks/configure-pod-container/configure-pod-configmap.md b/content/zh-cn/docs/tasks/configure-pod-container/configure-pod-configmap.md index ce863b1e9a5cd..ccec13bd1bf47 100644 --- a/content/zh-cn/docs/tasks/configure-pod-container/configure-pod-configmap.md +++ b/content/zh-cn/docs/tasks/configure-pod-container/configure-pod-configmap.md @@ -1,7 +1,7 @@ --- title: 配置 Pod 使用 ConfigMap content_type: task -weight: 150 +weight: 190 card: name: tasks weight: 50 @@ -9,7 +9,7 @@ card: -很多应用在其初始化或运行期间要依赖一些配置信息。大多数时候, -存在要调整配置参数所设置的数值的需求。 -ConfigMap 是 Kubernetes 用来向应用 Pod 中注入配置数据的方法。 +很多应用在其初始化或运行期间要依赖一些配置信息。 +大多数时候,存在要调整配置参数所设置的数值的需求。 +ConfigMap 是 Kubernetes 的一种机制,可让你将配置数据注入到应用的 +{{< glossary_tooltip text="Pod" term_id="pod" >}} 内部。 -ConfigMap 允许你将配置文件与镜像文件分离,以使容器化的应用程序具有可移植性。 + +ConfigMap 概念允许你将配置清单与镜像内容分离,以保持容器化的应用程序的可移植性。 +例如,你可以下载并运行相同的{{< glossary_tooltip text="容器镜像" term_id="image" >}}来启动容器, +用于本地开发、系统测试或运行实时终端用户工作负载。 + + 本页提供了一系列使用示例,这些示例演示了如何创建 ConfigMap 以及配置 Pod 使用存储在 ConfigMap 中的数据。 ## {{% heading "prerequisites" %}} -{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} +{{< include "task-tutorial-prereqs.md" >}} + + +你需要安装 `wget` 工具。如果你有不同的工具,例如 `curl`,而没有 `wget`, +则需要调整下载示例数据的步骤。 + ## 创建 ConfigMap {#create-a-configmap} 你可以使用 `kubectl create configmap` 或者在 `kustomization.yaml` 中的 ConfigMap -生成器来创建 ConfigMap。注意,`kubectl` 从 1.14 版本开始支持 `kustomization.yaml`。 +生成器来创建 ConfigMap。 -### 使用 kubectl create configmap 创建 ConfigMap {#create-a-configmap-using-kubectl-create-configmap} +### 使用 `kubectl create configmap` 创建 ConfigMap {#create-a-configmap-using-kubectl-create-configmap} 你可以使用 `kubectl create configmap` 命令基于[目录](#create-configmaps-from-directories)、 [文件](#create-configmaps-from-files)或者[字面值](#create-configmaps-from-literal-values)来创建 @@ -66,7 +91,8 @@ kubectl create configmap <映射名称> <数据源> ``` @@ -75,7 +101,8 @@ The name of a ConfigMap object must be a valid [DNS 子域名](/zh-cn/docs/concepts/overview/working-with-objects/names#dns-subdomain-names). 在你基于文件来创建 ConfigMap 时,`<数据源>` 中的键名默认取自文件的基本名, 而对应的值则默认为文件的内容。 @@ -89,47 +116,65 @@ about a ConfigMap. [`kubectl get`](/docs/reference/generated/kubectl/kubectl-commands/#get) 获取有关 ConfigMap 的信息。 -#### 基于目录创建 ConfigMap {#create-configmaps-from-directories} +#### 基于一个目录来创建 ConfigMap {#create-configmaps-from-directories} 你可以使用 `kubectl create configmap` 基于同一目录中的多个文件创建 ConfigMap。 -当你基于目录来创建 ConfigMap 时,kubectl 识别目录下基本名可以作为合法键名的文件, +当你基于目录来创建 ConfigMap 时,kubectl 识别目录下文件名可以作为合法键名的文件, 并将这些文件打包到新的 ConfigMap 中。普通文件之外的所有目录项都会被忽略 (例如:子目录、符号链接、设备、管道等等)。 -例如: +{{< note >}} + +用于创建 ConfigMap 的每个文件名必须由可接受的字符组成,即:字母(`A` 到 `Z` 和 +`a` 到 `z`)、数字(`0` 到 `9`)、'-'、'_'或'.'。 +如果在一个目录中使用 `kubectl create configmap`,而其中任一文件名包含不可接受的字符, +则 `kubectl` 命令可能会失败。 +`kubectl` 命令在遇到不合法的文件名时不会打印错误。 -# Download the sample files into `configure-pod-container/configmap/` directory -wget https://kubernetes.io/examples/configmap/game.properties -O configure-pod-container/configmap/game.properties -wget https://kubernetes.io/examples/configmap/ui.properties -O configure-pod-container/configmap/ui.properties +{{< /note >}} -# Create the configmap -kubectl create configmap game-config --from-file=configure-pod-container/configmap/ -``` + +创建本地目录: + ```shell -# 创建本地目录 mkdir -p configure-pod-container/configmap/ +``` + +现在,下载示例的配置并创建 ConfigMap: + +```shell # 将示例文件下载到 `configure-pod-container/configmap/` 目录 wget https://kubernetes.io/examples/configmap/game.properties -O configure-pod-container/configmap/game.properties wget https://kubernetes.io/examples/configmap/ui.properties -O configure-pod-container/configmap/ui.properties -# 创建 configmap +# 创建 ConfigMap kubectl create configmap game-config --from-file=configure-pod-container/configmap/ ``` 以上命令将 `configure-pod-container/configmap` 目录下的所有文件,也就是 `game.properties` 和 `ui.properties` 打包到 game-config ConfigMap @@ -170,7 +215,8 @@ how.nice.to.look=fairlyNice ``` `configure-pod-container/configmap/` 目录中的 `game.properties` 和 `ui.properties` 文件出现在 ConfigMap 的 `data` 部分。 @@ -188,7 +234,7 @@ The output is similar to this: apiVersion: v1 kind: ConfigMap metadata: - creationTimestamp: 2016-02-18T18:52:05Z + creationTimestamp: 2022-02-18T18:52:05Z name: game-config namespace: default resourceVersion: "516" @@ -212,7 +258,8 @@ data: @@ -260,7 +307,8 @@ secret.code.lives=30 ``` 你可以多次使用 `--from-file` 参数,从多个数据源创建 ConfigMap。 @@ -308,33 +356,23 @@ how.nice.to.look=fairlyNice ``` -当 `kubectl` 基于非 ASCII 或 UTF-8 的输入创建 ConfigMap 时, -该工具将这些输入放入 ConfigMap 的 `binaryData` 字段,而不是 `data` 中。 -同一个 ConfigMap 中可同时包含文本数据和二进制数据源。 -如果你想查看 ConfigMap 中的 `binaryData` 键(及其值), -你可以运行 `kubectl get configmap -o jsonpath='{.binaryData}' `。 +使用 `--from-env-file` 选项基于 env 文件创建 ConfigMap,例如: -使用 `--from-env-file` 选项从环境文件创建 ConfigMap,例如: - - -Env 文件包含环境变量列表。其中适用以下语法规则: - -- Env 文件中的每一行必须为 VAR=VAL 格式。 -- 以#开头的行(即注释)将被忽略。 -- 空行将被忽略。 -- 引号不会被特殊处理(即它们将成为 ConfigMap 值的一部分)。 - -将示例文件下载到 `configure-pod-container/configmap/` 目录: - -```shell -wget https://kubernetes.io/examples/configmap/game-env-file.properties -O configure-pod-container/configmap/game-env-file.properties -wget https://kubernetes.io/examples/configmap/ui-env-file.properties -O configure-pod-container/configmap/ui-env-file.properties -``` - -Env 文件 `game-env-file.properties` 如下所示: - -```shell -cat configure-pod-container/configmap/game-env-file.properties -``` - -``` -enemies=aliens -lives=3 -allowed="true" -``` ```shell kubectl create configmap game-config-env-file \ @@ -375,16 +387,16 @@ kubectl create configmap game-config-env-file \ ``` -将产生以下 ConfigMap: +将产生以下 ConfigMap。查看 ConfigMap: ```shell kubectl get configmap game-config-env-file -o yaml ``` 输出类似以下内容: @@ -392,7 +404,7 @@ where the output is similar to this: apiVersion: v1 kind: ConfigMap metadata: - creationTimestamp: 2017-12-27T18:36:28Z + creationTimestamp: 2019-12-27T18:36:28Z name: game-config-env-file namespace: default resourceVersion: "809965" @@ -434,7 +446,7 @@ where the output is similar to this: apiVersion: v1 kind: ConfigMap metadata: - creationTimestamp: 2017-12-27T18:38:34Z + creationTimestamp: 2019-12-27T18:38:34Z name: config-multi-env-files namespace: default resourceVersion: "810136" @@ -451,7 +463,8 @@ data: #### 定义从文件创建 ConfigMap 时要使用的键 {#define-the-key-to-use-when-generating-a-configmap-from-a-file} @@ -468,7 +481,8 @@ kubectl create configmap game-config-3 --from-file=<我的键名>=<文件路径> ``` `<我的键名>` 是你要在 ConfigMap 中使用的键名,`<文件路径>` 是你想要键所表示的数据源文件的位置。 @@ -499,7 +513,7 @@ where the output is similar to this: apiVersion: v1 kind: ConfigMap metadata: - creationTimestamp: 2016-02-18T18:54:22Z + creationTimestamp: 2022-02-18T18:54:22Z name: game-config-3 namespace: default resourceVersion: "530" @@ -518,7 +532,8 @@ data: #### 根据字面值创建 ConfigMap {#create-configmaps-from-literal-values} @@ -530,7 +545,8 @@ kubectl create configmap special-config --from-literal=special.how=very --from-l ``` 你可以传入多个键值对。命令行中提供的每对键值在 ConfigMap 的 `data` 部分中均表示为单独的条目。 @@ -547,7 +563,7 @@ The output is similar to this: apiVersion: v1 kind: ConfigMap metadata: - creationTimestamp: 2016-02-18T19:14:38Z + creationTimestamp: 2022-02-18T19:14:38Z name: special-config namespace: default resourceVersion: "651" @@ -560,15 +576,13 @@ data: ### 基于生成器创建 ConfigMap {#create-a-configmap-from-generator} -自 1.14 开始,`kubectl` 开始支持 `kustomization.yaml`。 -你还可以基于生成器(Generators)创建 ConfigMap,然后将其应用于 API 服务器上创建对象。 +你还可以基于生成器(Generators)创建 ConfigMap,然后将其应用于集群的 API 服务器上创建对象。 生成器应在目录内的 `kustomization.yaml` 中指定。 ```shell # 创建包含 ConfigMapGenerator 的 kustomization.yaml 文件 cat <./kustomization.yaml configMapGenerator: - name: game-config-4 + labels: + game-config: config-4 files: - configure-pod-container/configmap/game.properties EOF ``` 应用(Apply)kustomization 目录创建 ConfigMap 对象: @@ -618,21 +623,26 @@ configmap/game-config-4-m9dm2f92bt created -你可以检查 ConfigMap 被创建如下: +你可以像这样检查 ConfigMap 已经被创建: ```shell kubectl get configmap ``` - ``` NAME DATA AGE game-config-4-m9dm2f92bt 1 37s +``` + +也可以这样: +```shell kubectl describe configmaps/game-config-4-m9dm2f92bt +``` +``` Name: game-config-4-m9dm2f92bt Namespace: default -Labels: +Labels: game-config=config-4 Annotations: kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"v1","data":{"game.properties":"enemies=aliens\nlives=3\nenemies.cheat=true\nenemies.cheat.level=noGoodRotten\nsecret.code.p... @@ -651,8 +661,8 @@ Events: ``` 请注意,生成的 ConfigMap 名称具有通过对内容进行散列而附加的后缀, 这样可以确保每次修改内容时都会生成新的 ConfigMap。 @@ -670,22 +680,13 @@ with the key `game-special-key` 例如,从 `configure-pod-container/configmap/game.properties` 文件生成 ConfigMap, 但使用 `game-special-key` 作为键名: - ```shell # 创建包含 ConfigMapGenerator 的 kustomization.yaml 文件 cat <./kustomization.yaml configMapGenerator: - name: game-config-5 + labels: + game-config: config-5 files: - game-special-key=configure-pod-container/configmap/game.properties EOF @@ -699,37 +700,28 @@ Apply the kustomization directory to create the ConfigMap object. ```shell kubectl apply -k . ``` - ``` configmap/game-config-5-m67dt67794 created ``` #### 基于字面值生成 ConfigMap {#generate-configmaps-from-literals} -要基于字符串 `special.type=charm` 和 `special.how=very` 生成 ConfigMap, -可以在 `kustomization.yaml` 中配置 ConfigMap 生成器: +此示例向你展示如何使用 Kustomize 和 kubectl,基于两个字面键/值对 +`special.type=charm` 和 `special.how=very` 创建一个 `ConfigMap`。 +为了实现这一点,你可以配置 `ConfigMap` 生成器。 +创建(或替换)`kustomization.yaml`,使其具有以下内容。 - -```shell -# 创建带有 ConfigMapGenerator 的 kustomization.yaml 文件 -cat <./kustomization.yaml +```yaml +--- +# 基于字面创建 ConfigMap 的 kustomization.yaml 内容 configMapGenerator: - name: special-config-2 literals: @@ -739,18 +731,40 @@ EOF ``` 应用 Kustomization 目录创建 ConfigMap 对象。 ```shell kubectl apply -k . ``` - ``` configmap/special-config-2-c92b5mmcf2 created ``` + +## 临时清理 {#interim-cleanup} + +在继续之前,清理你创建的一些 ConfigMap: + +```bash +kubectl delete configmap special-config +kubectl delete configmap env-config +kubectl delete configmap -l 'game-config in (config-4,config-5)’ +``` + + +现在你已经学会了定义 ConfigMap,你可以继续下一节,学习如何将这些对象与 Pod 一起使用。 + +--- + -* 与前面的示例一样,首先创建 ConfigMap。 +与前面的示例一样,首先创建 ConfigMap。 +这是你将使用的清单: - {{< codenew file="configmap/configmaps.yaml" >}} +{{< codenew file="configmap/configmaps.yaml" >}} - - 创建 ConfigMap: + +* 创建 ConfigMap: ```shell kubectl create -f https://kubernetes.io/examples/configmap/configmaps.yaml @@ -832,6 +848,15 @@ configmap/special-config-2-c92b5mmcf2 created --> 现在,Pod 的输出包含环境变量 `SPECIAL_LEVEL_KEY=very` 和 `LOG_LEVEL=INFO`。 + + 一旦你乐意继续前进,删除该 Pod: + + ```shell + kubectl delete pod dapi-test-pod --now + ``` + @@ -854,7 +879,8 @@ configmap/special-config-2-c92b5mmcf2 created ``` * 使用 `envFrom` 将所有 ConfigMap 的数据定义为容器环境变量,ConfigMap 中的键成为 Pod 中的环境变量名称。 @@ -871,50 +897,72 @@ configmap/special-config-2-c92b5mmcf2 created ``` 现在,Pod 的输出包含环境变量 `SPECIAL_LEVEL=very` 和 `SPECIAL_TYPE=charm`。 + 一旦你乐意继续前进,删除该 Pod: + + ```shell + kubectl delete pod dapi-test-pod --now + ``` + ## 在 Pod 命令中使用 ConfigMap 定义的环境变量 {#use-configmap-defined-environment-variables-in-pod-commands} 你可以使用 `$(VAR_NAME)` Kubernetes 替换语法在容器的 `command` 和 `args` 属性中使用 ConfigMap 定义的环境变量。 -例如,以下 Pod 规约 +例如,以下 Pod 清单: {{< codenew file="pods/pod-configmap-env-var-valueFrom.yaml" >}} -通过运行下面命令创建 Pod: +通过运行下面命令创建该 Pod: ```shell kubectl create -f https://kubernetes.io/examples/pods/pod-configmap-env-var-valueFrom.yaml ``` -在 `test-container` 容器中产生以下输出: +此 Pod 在 `test-container` 容器中产生以下输出: ``` very charm ``` + +一旦你乐意继续前进,删除该 Pod: + +```shell +kubectl delete pod dapi-test-pod --now +``` + ## 将 ConfigMap 数据添加到一个卷中 {#add-configmap-data-to-a-volume} @@ -923,9 +971,9 @@ As explained in [Create ConfigMaps from files](#create-configmaps-from-files), w 文件内容成为键对应的值。 -本节中的示例引用了一个名为 'special-config' 的 ConfigMap,如下所示: +本节中的示例引用了一个名为 `special-config` 的 ConfigMap: {{< codenew file="configmap/configmap-multikeys.yaml" >}} @@ -942,8 +990,9 @@ kubectl create -f https://kubernetes.io/examples/configmap/configmap-multikeys.y ### Populate a Volume with data stored in a ConfigMap Add the ConfigMap name under the `volumes` section of the Pod specification. -This adds the ConfigMap data to the directory specified as `volumeMounts.mountPath` (in this case, `/etc/config`). -The `command` section lists directory files with names that match the keys in ConfigMap. +This adds the ConfigMap data to the directory specified as `volumeMounts.mountPath` (in this +case, `/etc/config`). The `command` section lists directory files with names that match the +keys in ConfigMap. --> ### 使用存储在 ConfigMap 中的数据填充卷 {#populate-a-volume-with-data-stored-in-a-configmap} @@ -973,21 +1022,32 @@ SPECIAL_LEVEL SPECIAL_TYPE ``` -{{< caution >}} -如果在 `/etc/config/` 目录中有一些文件,这些文件将被删除。 -{{< /caution >}} +文本数据会展现为 UTF-8 字符编码的文件。如果使用其他字符编码, +可以使用 `binaryData`(详情参阅 [ConfigMap 对象](/zh-cn/docs/concepts/configuration/configmap/#configmap-object))。 {{< note >}} + -文本数据会展现为 UTF-8 字符编码的文件。如果使用其他字符编码, -可以使用 `binaryData`。 +如果该容器镜像的 `/etc/config` +目录中有一些文件,卷挂载将使该镜像中的这些文件无法访问。 {{< /note >}} + +一旦你乐意继续前进,删除该 Pod: + +```shell +kubectl delete pod dapi-test-pod --now +``` + -创建Pod: +创建 Pod: ```shell kubectl create -f https://kubernetes.io/examples/pods/pod-configmap-volume-specific-key.yaml @@ -1027,26 +1087,89 @@ Like before, all previous files in the `/etc/config/` directory will be deleted. 如前,`/etc/config/` 目录中所有先前的文件都将被删除。 {{< /caution >}} + +删除该 Pod: + +```shell +kubectl delete pod dapi-test-pod --now +``` + + ### 映射键到指定路径并设置文件访问权限 {#project-keys-to-specific-paths-and-file-permissions} 你可以将指定键名投射到特定目录,也可以逐个文件地设定访问权限。 -[Secret 用户指南](/zh-cn/docs/concepts/configuration/secret/#using-secrets-as-files-from-a-pod) -中为这一语法提供了解释。 +[Secret](/zh-cn/docs/concepts/configuration/secret/#using-secrets-as-files-from-a-pod) +指南中为这一语法提供了解释。 + + +### 可选引用 {#optional-references} + +ConfigMap 引用可以被标记为**可选**。 +如果 ConfigMap 不存在,则挂载的卷将为空。 +如果 ConfigMap 存在,但引用的键不存在,则挂载点下的路径将不存在。 +有关更多信息,请参阅[可选 ConfigMap](#optional-configmaps) 细节。 + + +### 挂载的 ConfigMap 会被自动更新 {#mounted-configMaps-are-updated-automatically} +当已挂载的 ConfigMap 被更新时,所投射的内容最终也会被更新。 +这适用于 Pod 启动后可选引用的 ConfigMap 重新出现的情况。 + +Kubelet 在每次定期同步时都会检查所挂载的 ConfigMap 是否是最新的。 +然而,它使用其基于 TTL 机制的本地缓存来获取 ConfigMap 的当前值。 +因此,从 ConfigMap 更新到新键映射到 Pod 的总延迟可能与 kubelet +同步周期(默认为1分钟)+ kubelet 中 ConfigMap 缓存的 TTL(默认为1分钟)一样长。 +你可以通过更新 Pod 的一个注解来触发立即刷新。 + +{{< note >}} + +使用 ConfigMap 作为 [subPath](/zh-cn/docs/concepts/storage/volumes/#using-subpath) +卷的容器将不会收到 ConfigMap 更新。 +{{< /note >}} ## 了解 ConfigMap 和 Pod {#understanding-configmaps-and-pods} @@ -1058,7 +1181,10 @@ ConfigMap 与 [Secret](/zh-cn/docs/concepts/configuration/secret/) 类似, {{< note >}} ConfigMap 应该引用属性文件,而不是替换它们。可以将 ConfigMap 理解为类似于 Linux `/etc` 目录及其内容的东西。例如,如果你基于 ConfigMap 创建 @@ -1067,12 +1193,13 @@ ConfigMap 应该引用属性文件,而不是替换它们。可以将 ConfigMap {{< /note >}} ConfigMap 的 `data` 字段包含配置数据。如下例所示,它可以简单 (如用 `--from-literal` 的单个属性定义)或复杂 -(如用 `--from-file` 的配置文件或 JSON blob定义)。 - +(如用 `--from-file` 的配置文件或 JSON blob 定义)。 ```yaml apiVersion: v1 @@ -1093,66 +1220,44 @@ data: ``` -### 限制 {#restrictions} - -- 在 Pod 规约中引用某个 `ConfigMap` 之前,必须先创建这个对象, -或者在 Pod 规约中将 ConfigMap 标记为 `optional`(请参阅[可选的 ConfigMaps](#optional-configmaps))。 -如果所引用的 ConfigMap 不存在,并且没有将应用标记为 `optional` 则 Pod 将无法启动。 -同样,引用 ConfigMap 中不存在的主键也会令 Pod 无法启动,除非你将 Configmap 标记为 `optional`。 +当 `kubectl` 从非 ASCII 或 UTF-8 编码的输入创建 ConfigMap 时, +该工具将这些输入放入 ConfigMap 的 `binaryData` 字段,而不是 `data` 字段。 +文本和二进制数据源都可以组合在一个 ConfigMap 中。 -- 如果你使用 `envFrom` 来基于 ConfigMap 定义环境变量,那么无效的键将被忽略。 - Pod 可以被启动,但无效名称将被记录在事件日志中(`InvalidVariableNames`)。 - 日志消息列出了每个被跳过的键。例如: - - ```shell - kubectl get events - ``` - - - 输出与此类似: - - ``` - LASTSEEN FIRSTSEEN COUNT NAME KIND SUBOBJECT TYPE REASON SOURCE MESSAGE - 0s 0s 1 dapi-test-pod Pod Warning InvalidEnvironmentVariableNames {kubelet, 127.0.0.1} Keys [1badkey, 2alsobad] from the EnvFrom configMap default/myconfig were skipped since they are considered invalid environment variable names. - ``` - - -- ConfigMap 位于确定的{{< glossary_tooltip term_id="namespace" text="名字空间" >}}中。 - 每个 ConfigMap 只能被同一名字空间中的 Pod 引用. +如果你想查看 ConfigMap 中的 `binaryData` 键(及其值), +可以运行 `kubectl get configmap -o jsonpath='{.binaryData}' `。 -- 你不能将 ConfigMap 用于{{< glossary_tooltip text="静态 Pod" term_id="static-pod" >}}, - 因为 Kubernetes 不支持这种用法。 +Pod 可以从使用 `data` 或 `binaryData` 的 ConfigMap 中加载数据。 ### 可选的 ConfigMap {#optional-configmaps} 你可以在 Pod 规约中将对 ConfigMap 的引用标记为 **可选(optional)**。 -如果 ConfigMap 不存在,那么它在 Pod 中为其提供数据的配置(例如环境变量、挂载的卷)将为空。 +如果 ConfigMap 不存在,那么它在 Pod 中为其提供数据的配置(例如:环境变量、挂载的卷)将为空。 如果 ConfigMap 存在,但引用的键不存在,那么数据也是空的。 例如,以下 Pod 规约将 ConfigMap 中的环境变量标记为可选: @@ -1165,7 +1270,7 @@ spec: containers: - name: test-container image: gcr.io/google_containers/busybox - command: [ "/bin/sh", "-c", "env" ] + command: ["/bin/sh", "-c", "env"] env: - name: SPECIAL_LEVEL_KEY valueFrom: @@ -1175,6 +1280,7 @@ spec: optional: true # 将环境变量标记为可选 restartPolicy: Never ``` + 你也可以在 Pod 规约中将 ConfigMap 提供的卷和文件标记为可选。 此时 Kubernetes 将总是为卷创建挂载路径,即使引用的 ConfigMap 或键不存在。 例如,以下 Pod 规约将所引用得 ConfigMap 的卷标记为可选: - ```yaml apiVersion: v1 kind: Pod @@ -1205,7 +1311,7 @@ spec: containers: - name: test-container image: gcr.io/google_containers/busybox - command: [ "/bin/sh", "-c", "ls /etc/config" ] + command: ["/bin/sh", "-c", "ls /etc/config"] volumeMounts: - name: config-volume mountPath: /etc/config @@ -1217,20 +1323,25 @@ spec: restartPolicy: Never ``` -### 挂载的 ConfigMap 将被自动更新 {#mounted-configmaps-are-updated-automatically} - +### 挂载的 ConfigMap 将被自动更新 {#mounted-configmaps-are-updated-automatically} + 当某个已被挂载的 ConfigMap 被更新,所投射的内容最终也会被更新。 对于 Pod 已经启动之后所引用的、可选的 ConfigMap 才出现的情形, 这一动态更新现象也是适用的。 kubelet 在每次周期性同步时都会检查已挂载的 ConfigMap 是否是最新的。 但是,它使用其本地的基于 TTL 的缓存来获取 ConfigMap 的当前值。 @@ -1244,11 +1355,92 @@ A container using a ConfigMap as a [subPath](/docs/concepts/storage/volumes/#usi 使用 ConfigMap 作为 [subPath](/zh-cn/docs/concepts/storage/volumes/#using-subpath) 的数据卷将不会收到 ConfigMap 更新。 {{< /note >}} + + +### 限制 {#restrictions} + + +- 在 Pod 规约中引用某个 `ConfigMap` 之前,必须先创建这个对象, + 或者在 Pod 规约中将 ConfigMap 标记为 `optional`(请参阅[可选的 ConfigMaps](#optional-configmaps))。 + 如果所引用的 ConfigMap 不存在,并且没有将应用标记为 `optional` 则 Pod 将无法启动。 + 同样,引用 ConfigMap 中不存在的主键也会令 Pod 无法启动,除非你将 Configmap 标记为 `optional`。 + + +- 如果你使用 `envFrom` 来基于 ConfigMap 定义环境变量,那么无效的键将被忽略。 + Pod 可以被启动,但无效名称将被记录在事件日志中(`InvalidVariableNames`)。 + 日志消息列出了每个被跳过的键。例如: + + ```shell + kubectl get events + ``` + + + 输出与此类似: + ``` + LASTSEEN FIRSTSEEN COUNT NAME KIND SUBOBJECT TYPE REASON SOURCE MESSAGE + 0s 0s 1 dapi-test-pod Pod Warning InvalidEnvironmentVariableNames {kubelet, 127.0.0.1} Keys [1badkey, 2alsobad] from the EnvFrom configMap default/myconfig were skipped since they are considered invalid environment variable names. + ``` + + +- ConfigMap 位于确定的{{< glossary_tooltip term_id="namespace" text="名字空间" >}}中。 + 每个 ConfigMap 只能被同一名字空间中的 Pod 引用. + + +- 你不能将 ConfigMap 用于{{< glossary_tooltip text="静态 Pod" term_id="static-pod" >}}, + 因为 Kubernetes 不支持这种用法。 + +## {{% heading "cleanup" %}} + + +删除你创建那些的 ConfigMap 和 Pod: + +```bash +kubectl delete configmaps/game-config configmaps/game-config-2 configmaps/game-config-3 \ + configmaps/game-config-env-file +kubectl delete pod dapi-test-pod --now + +# 你可能已经删除了下一组内容 +kubectl delete configmaps/special-config configmaps/env-config +kubectl delete configmap -l 'game-config in (config-4,config-5)’ +``` + + +如果你创建了一个目录 `configure-pod-container` 并且不再需要它,你也应该删除这个目录, +或者将该目录移动到回收站/删除文件的位置。 + ## {{% heading "whatsnext" %}} * 浏览[使用 ConfigMap 配置 Redis](/zh-cn/docs/tutorials/configuration/configure-redis-using-configmap/) 真实示例。 -