如何在 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

相关推荐

  • 网站期末架构

    用户向 发起访问请求 负载均衡器(Nginx 七层负载均衡区分移动端和PC端,LVS四层负载均衡可以处理高并发请求)将请求进行分发 Tomcat等web服务器根据请求内容,进行任务分发 如果请求内容需要快速响应,则将请求发送到MenCache、Redits等缓存数据库,然后将修改内容更新到SQL数据库集群 如果是普通的读写请求,则进行读写分离操作,读取和写入…

    2022年6月18日
    1.5K00
  • ThinkPHP 出现“您浏览的页面暂时发生了异常!请稍后再试~”的解决方法

    ThinkPHP3.0 第一次运行入口文件,之后在修改Action只要是有数据库操作,就会出现“您浏览的页面暂时发生了错误!请稍后再试~”的系统提示错误。 解决办法是: 把项目里自动生成的runtime文件夹下~runtime.php文件删掉,再刷新浏览器页面就会正常显示数据库提取的信息

    2024年2月28日
    2.6K00
  • Linux 宝塔部署 ASP.NET Core 应用

    第一步,发步应用 我这是一个API 应用和 MVC 应用 设置,服务器上要运行的端口 API 端口5000 MVC 端口5001 打包文件夹,发步 1、桌面新建俩个文件夹 2、右键项目发步,选中iis 目标位置选择刚刚桌面上创建的API文件夹 MVC 同理,这里不做演示 第二步、安装LInux ASP.NET Core 运行时环境 1、连接服务器 2、执行以…

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

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

    2023年4月26日
    2.1K00
  • Nginx 代理 MySQL 连接,并限制可访问IP

    1.前言 我们的生产环境基本上都部署在云服务器上,例如应用服务器、MySQL服务器等。如果MySQL服务器直接暴露在公网,就会存在很大的风险,为了保证数据安全,MySQL服务器的端口是不对外开放的。 好巧不巧,线上业务遇到bug了,开发的小伙伴需要远程连接MySQL来查看数据,那应该怎么办呢? 我们可以通过Nginx代理(“跳板机”)来进行连接。 2.Ngi…

    2023年8月21日
    1.9K00

发表回复

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

在线咨询: QQ交谈

邮件:712342017@qq.com

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

关注微信