如何在 Kubernetes Pod 中快速注入环境变量及优先级问题

1. Kubernetes Pod 引用环境变量的几种方式

1.1 直接 Key/Value

可以直接设置 Value 值,也可以将当前 Pod 的信息作为 Value 值。apiVersion: v1
kind: Pod
metadata:
  name: envar-demo
  labels:
    purpose: demonstrate-envars
spec:
  containers:
  - name: envar-demo-container
    image: gcr.io/google-samples/node-hello:1.0
    env:
    - name: DEMO_GREETING
      value: "Hello from the environment"
    - name: DEMO_FAREWELL
      value: "Such a sweet sorrow"
    - name: MY_NODE_NAME
      valueFrom:
        fieldRef:
          fieldPath: spec.nodeName
    - name: MY_POD_NAME
      valueFrom:
        fieldRef:
          fieldPath: metadata.name

1.2 从 Secret 引用

有两种方式引用 Secret 中的变量:

  • 通过 envFrom 引用 Secret 中全部变量
  • 通过 valueFrom 引用 Secret 中指定变量
apiVersion: v1
kind: Pod
metadata:
  name: secret-env-pod
spec:
  containers:
  - name: mycontainer
    image: redis
    envFrom:
      - secretRef:
          name: secret-config
    env:
      - name: SECRET_USERNAME
        valueFrom:
          secretKeyRef:
            name: secret-config
            key: username
      - name: SECRET_PASSWORD
        valueFrom:
          secretKeyRef:
            name: secret-config
            key: password

1.3 从 ConfigMap 引用

有两种方式引用 ConfigMap 中的变量:

  • 通过 envFrom 引用 ConfigMap 中全部变量
  • 通过 valueFrom 引用 ConfigMap 中指定变量
apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: k8s.gcr.io/busybox
      envFrom:
        - configMapRef:
            name: configmap-config
      env:
        - name: SPECIAL_LEVEL_KEY
          valueFrom:
            configMapKeyRef:
              name: special-config
              key: special.how
        - name: LOG_LEVEL
          valueFrom:
            configMapKeyRef:
              name: env-config
              key: log_level

2. 变量引用的优先级

从源码中可以看到的实现逻辑是,会初始化一个 Map 存放环境变量,然后按照如下步骤进行处理:

  1. 按顺序遍历 envFrom 引用的 ConfigMap 和 Secret 的 Key/Value
  2. 按顺序遍历 env 中的设置的 Key/Value
  3. 由于 Pod 默认开启了 EnableServiceLinks,最后还需要将 Service 相关变量注入

优先级是,Service 变量 > Env > EnvFrom,其中 EnvFrom 的优先级是后面覆盖前面。

这里单独说下,注入到环境变量中的 Service 相关变量:

  • 注入的范围。所在命名空间的所有 Service
  • 注入的内容。同一命名空间下,所有的服务地址、端口、协议。
  • 注入的格式。大写字母加下划线的格式,例如 ADMIN_WEB_PC_TEST_PORT_80_TCP=tcp://10.233.45.183:80ADMIN_WEB_PC_TEST_PORT=tcp://10.233.45.183:80ADMIN_WEB_PC_TEST_PORT_80_TCP_ADDR=10.233.45.183ADMIN_WEB_PC_TEST_PORT_80_TCP_PORT=80ADMIN_WEB_PC_TEST_PORT_80_TCP_PROTO=tcp 。如果同一个命名空间下,部署大量服务,每个 Pod 中可能会增加几百个这样的变量。

文章来源:https://www.cnaaa.net,转载请注明出处:https://www.cnaaa.net/archives/9523

(0)
郭靖的头像郭靖
上一篇 2023年8月11日 下午4:42
下一篇 2023年8月14日 下午5:25

相关推荐

  • Discuz! Database Error的解决办法

    原因一:数据库表太大 比如mysql数据库的表内容太大,超过10G就有可能会影响discuz论坛的运行。 这种情况可以通过对数据库分表的方法来解决。 原因二:数据库配置错误 有时候可能是主机搬家、数据库搬家等,造成数据库信息填写错误,或旧数据库信息没有及时更新等,比如数据库用户名、密码、数据库表填写错误等。 可以修正一下相关数据库信息即可,可以找到confi…

    2023年2月21日
    80900
  • Rabbitmq数据备份与还原

    一、场景 现在有服务器A和服务器B ,由于业务需要,要求把服务器A上mq的数据迁移到服务器B上,rabbitmq的数据包括元数据(RabbitMQ用户、vhost、队列、交换和绑定)和消息数据,而消息数据存储在单独的消息存储库中。 A:192.168.2.58 B:192.168.1.60 二、元数据备份和还原 1、操作 在服务B上搭建rabbitmq服务,…

    2022年11月15日
    1.2K00
  • 宝塔部署java项目

    进入宝塔官方网站 url地址 https://www.bt.cn/download/linux.html 下滑看到安装命令(我这边使用的是centos7.8)复制相应脚本命令 Centos安装脚本 输入复制的命令 等待安装宝塔面板,粘贴点击回车即可 中间会输入一次确认是否安装 输入 y 回车 安装需要一小段时间,最后当出现有宝塔面板地址和账号密码的时候证明安…

    2023年4月3日
    74500
  • FlashFXP上传失败,数据套接字错误 (10054): 连接被对等方重置问题处理

    问题如图所以 解决方案: FlashFXP选项选择参数选择 勾选图中红框选项,成功解决问题。

    2023年4月26日
    1.1K00
  • IIS配置Url重写实现http自动跳转https的重定向方法

    需要准备的工具和环境: 操作流程 配置URL分为全局和非全局,下图,可以看到URL重写组件内容。 选择某一个站点中的URL重写,我们称之为单独的非全局。直接选择IIS的可以配置全局,所以这里要依靠你自己的判断和选择。 打开Url重写工具 在右侧点击添加,然后选择空白规则,然后进行规则的配置。 规则命令如下 这个也是网上一大堆教程最神的地方,很多东西都是缺失的…

    2023年2月21日
    1.0K00

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

在线咨询: QQ交谈

邮件:712342017@qq.com

工作时间:周一至周五,8:30-17:30,节假日休息

关注微信