当前位置:首页 » 《随便一记》 » 正文

【Kubernetes 系列】ConfigMap 进阶 环境变量的配置及使用

25 人参与  2022年07月29日 08:58  分类 : 《随便一记》  评论

点击全文阅读


作者:半身风雪
上一节:配置 Java 微服务
内容简介:上一节主要学习创建ConfigMap 的九种方式,那么本节内容主要讲解 ConfigMap 的使用。

在这里插入图片描述


文章目录

目标一、ConfigMap 容器环境变量的设置1.1、使用单个 ConfigMap 中的数据定义容器环境变量1.2、使用来自多个 ConfigMap 的数据定义容器环境变量1.3、使用来自多个 ConfigMap 的数据定义容器环境变量1.4、将 ConfigMap 中的所有键值对配置为容器环境变量1.5、在 Pod 命令中使用 ConfigMap 定义的环境变量 二、将 ConfigMap 数据添加到volume中2.1、使用存储在 ConfigMap 中的数据填充volume2.2、将 ConfigMap 数据添加到volume中的特定路径 三、ConfigMap 和 Pod3.1、限制 总结


目标

本节学习目标:

在ConfigMap 中的容器环境变量ConfigMap volume中的数据处理

提示:以下是本篇文章正文内容,下面案例可供参考

一、ConfigMap 容器环境变量的设置

1.1、使用单个 ConfigMap 中的数据定义容器环境变量

在 ConfigMap 中将环境变量定义为键值对:

$ kubectl create configmap special-config --from-literal=special.how=very

将 ConfigMap 中定义的 special.how 赋值给 Pod 规约中的 SPECIAL_LEVEL_KEY 环境变量。在 pods/pod-single-configmap-env-variable.yaml 文件目录中添加如下代码:
apiVersion: v1   kind: Pod   metadata:     name: dapi-test-pod   spec:     containers:       - name: test-container         image: k8s.gcr.io/busybox         command: [ "/bin/sh", "-c", "env" ]         env:           # 定义环境变量           - name: SPECIAL_LEVEL_KEY             valueFrom:               configMapKeyRef:                 # ConfigMap 包含你要赋给 SPECIAL_LEVEL_KEY 的值                 name: special-config                 # 指定与取值相关的键名                 key: special.how     restartPolicy: Never   
执行 kubectl create -f 命令,创建pod:

$ kubectl create -f https://kubernetes.io/examples/pods/pod-single-configmap-env-variable.yaml

Pod 的输出包含环境变量 SPECIAL_LEVEL_KEY=very。

1.2、使用来自多个 ConfigMap 的数据定义容器环境变量

在目录 configmap/configmaps.yaml 添加如下代码:
apiVersion: v1  kind: ConfigMap  metadata:    name: special-config    namespace: default  data:    special.how: very  ---  apiVersion: v1  kind: ConfigMap  metadata:    name: env-config    namespace: default  data:    log_level: INFO  
执行命令创建 ConfigMap:

$ kubectl create -f https://kubernetes.io/examples/configmap/configmaps.yaml

在目录 pods/pod-multiple-configmap-env-variable.yaml 中定义环境变量:
apiVersion: v1  kind: Pod  metadata:    name: dapi-test-pod  spec:    containers:      - name: test-container        image: k8s.gcr.io/busybox        command: [ "/bin/sh", "-c", "env" ]        env:          - name: SPECIAL_LEVEL_KEY            valueFrom:              configMapKeyRef:                name: special-config                key: special.how          - name: LOG_LEVEL            valueFrom:              configMapKeyRef:                name: env-config                key: log_level    restartPolicy: Never  
执行命令创建 Pod:

$ kubectl create -f https://kubernetes.io/examples/pods/pod-multiple-configmap-env-variable.yaml

Pod 的输出包含环境变量 SPECIAL_LEVEL_KEY=very 和 LOG_LEVEL=INFO。

1.3、使用来自多个 ConfigMap 的数据定义容器环境变量

在目录 configmap/configmaps.yaml 添加如下代码:
apiVersion: v1  kind: ConfigMap  metadata:    name: special-config    namespace: default  data:    special.how: very  ---  apiVersion: v1  kind: ConfigMap  metadata:    name: env-config    namespace: default  data:    log_level: INFO  
创建 ConfigMap:

$ kubectl create -f https://kubernetes.io/examples/configmap/configmaps.yaml

在目录 pods/pod-multiple-configmap-env-variable.yaml 中定义环境变量:
apiVersion: v1  kind: Pod  metadata:    name: dapi-test-pod  spec:    containers:      - name: test-container        image: k8s.gcr.io/busybox        command: [ "/bin/sh", "-c", "env" ]        env:          - name: SPECIAL_LEVEL_KEY            valueFrom:              configMapKeyRef:                name: special-config                key: special.how          - name: LOG_LEVEL            valueFrom:              configMapKeyRef:                name: env-config                key: log_level    restartPolicy: Never  
执行命令创建 Pod:

$ kubectl create -f https://kubernetes.io/examples/pods/pod-multiple-configmap-env-variable.yaml

Pod 的输出包含环境变量 SPECIAL_LEVEL_KEY=very 和 LOG_LEVEL=INFO。

1.4、将 ConfigMap 中的所有键值对配置为容器环境变量

在目录 configmap/configmap-multikeys.yaml 中创建一个包含多个键值对的 ConfigMap。
apiVersion: v1  kind: ConfigMap  metadata:    name: special-config    namespace: default  data:    SPECIAL_LEVEL: very    SPECIAL_TYPE: charm
创建 ConfigMap:

$ kubectl create -f https://kubernetes.io/examples/configmap/configmap-multikeys.yaml

pods/pod-configmap-envFrom.yaml 目录中,使用 envFrom 将所有 ConfigMap 的数据定义为容器环境变量,ConfigMap 中的键成为 Pod 中的环境变量名称。
apiVersion: v1  kind: Pod  metadata:    name: dapi-test-pod  spec:    containers:      - name: test-container        image: k8s.gcr.io/busybox        command: [ "/bin/sh", "-c", "env" ]        envFrom:        - configMapRef:            name: special-config    restartPolicy: Never  
创建 Pod:

$ kubectl create -f https://kubernetes.io/examples/pods/pod-configmap-envFrom.yaml

Pod 的输出包含环境变量 SPECIAL_LEVEL=very 和 SPECIAL_TYPE=charm。

1.5、在 Pod 命令中使用 ConfigMap 定义的环境变量

在目录 pods/pod-configmap-env-var-valueFrom.yaml 中使用**$(VAR_NAME)** Kubernetes 替换语法在容器的 commandargs 属性中使用 ConfigMap 定义的环境变量。
apiVersion: v1kind: Podmetadata:  name: dapi-test-podspec:  containers:    - name: test-container      image: k8s.gcr.io/busybox      command: [ "/bin/echo", "$(SPECIAL_LEVEL_KEY) $(SPECIAL_TYPE_KEY)" ]      env:        - name: SPECIAL_LEVEL_KEY          valueFrom:            configMapKeyRef:              name: special-config              key: SPECIAL_LEVEL        - name: SPECIAL_TYPE_KEY          valueFrom:            configMapKeyRef:              name: special-config              key: SPECIAL_TYPE  restartPolicy: Never
运行下面命令创建 Pod:

$ kubectl create -f https://kubernetes.io/examples/pods/pod-configmap-env-var-valueFrom.yaml

会在 test-container 容器中产生以下输出:
very charm

二、将 ConfigMap 数据添加到volume中

使用 --from-file 创建 ConfigMap 时,文件名成为存储在 ConfigMap 的 data 部分中的键, 文件内容成为键对应的值。

下面看一个示例configmap/configmap-multikeys.yaml

apiVersion: v1kind: ConfigMapmetadata:  name: special-config  namespace: defaultdata:  SPECIAL_LEVEL: very  SPECIAL_TYPE: charm

创建 ConfigMap:

$ kubectl create -f https://kubernetes.io/examples/configmap/configmap-multikeys.yaml

2.1、使用存储在 ConfigMap 中的数据填充volume

在 Pod 规约的 volumes 部分下添加 ConfigMap 名称。 会将 ConfigMap 数据添加到 volumeMounts.mountPath 所指定的目录 (在本例中为 /etc/config)。 command 部分列出了名称与 ConfigMap 中的键匹配的目录文件。

先看一下示例代码pods/pod-configmap-volume.yaml
apiVersion: v1kind: Podmetadata:  name: dapi-test-podspec:  containers:    - name: test-container      image: k8s.gcr.io/busybox      command: [ "/bin/sh", "-c", "ls /etc/config/" ]      volumeMounts:      - name: config-volume        mountPath: /etc/config  volumes:    - name: config-volume      configMap:        # 提供包含要添加到容器中的文件的 ConfigMap 的名称        name: special-config  restartPolicy: Never
创建 Pod:

$ kubectl create -f https://kubernetes.io/examples/pods/pod-configmap-volume.yaml

Pod 运行时,命令 ls /etc/config/ 产生下面的输出:

SPECIAL_LEVEL
SPECIAL_TYPE

2.2、将 ConfigMap 数据添加到volume中的特定路径

使用 path 字段为特定的 ConfigMap 项目指定预期的文件路径。 在这里,ConfigMap 中键 SPECIAL_LEVEL 的内容将挂载在 config-volume 卷中 /etc/config/keys 文件中。

pods/pod-configmap-volume-specific-key.yaml示例代码:
apiVersion: v1kind: Podmetadata:  name: dapi-test-podspec:  containers:    - name: test-container      image: k8s.gcr.io/busybox      command: [ "/bin/sh","-c","cat /etc/config/keys" ]      volumeMounts:      - name: config-volume        mountPath: /etc/config  volumes:    - name: config-volume      configMap:        name: special-config        items:        - key: SPECIAL_LEVEL          path: keys  restartPolicy: Never
创建Pod:

$ kubectl create -f https://kubernetes.io/examples/pods/pod-configmap-volume-specific-key.yaml

当 Pod 运行时,命令 cat /etc/config/keys 产生以下输出:

very

三、ConfigMap 和 Pod

ConfigMap API 资源将配置数据存储为键值对。 数据可以在 Pod 中使用,也可以用来提供系统组件(如控制器)的配置。 ConfigMap 与 Secret 类似, 但是提供的是一种处理不含敏感信息的字符串的方法。 用户和系统组件都可以在 ConfigMap 中存储配置数据。

ConfigMap 的 data 字段包含配置数据。如下例所示,它可以简单 (如用 --from-literal 的单个属性定义)或复杂 (如用 --from-file 的配置文件或 JSON blob定义)。

apiVersion: v1kind: ConfigMapmetadata:  creationTimestamp: 2016-02-18T19:14:38Z  name: example-config  namespace: defaultdata:  # 使用 --from-literal 定义的简单属性  example.property.1: hello  example.property.2: world  # 使用 --from-file 定义复杂属性的例子  example.property.file: |-    property.1=value-1    property.2=value-2    property.3=value-3    

3.1、限制

在 Pod 规约中引用某个 ConfigMap 之前,必须先创建它(除非将 ConfigMap 标记为 “optional(可选)”)。如果引用的 ConfigMap 不存在,则 Pod 将不会启动。 同样,引用 ConfigMap 中不存在的主键也会令 Pod 无法启动。如果你使用 envFrom 来基于 ConfigMap 定义环境变量,那么无效的键将被忽略。 Pod 可以被启动,但无效名称将被记录在事件日志中(InvalidVariableNames)。 日志消息列出了每个被跳过的键。例如:

$ 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 位于确定的名字空间中。 每个 ConfigMap 只能被同一名字空间中的 Pod 引用.你不能将 ConfigMap 用于静态 Pod, 因为 Kubernetes 不支持这种用法。

总结

文章写到这里,我想大家已经ConfigMap 有了一定的了解,对于 ConfigMap 的讲解,到这里就结束了,大家快动手试试吧!!!


点击全文阅读


本文链接:http://zhangshiyu.com/post/43896.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1