如何在 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⽇志切割

    ⼀:切割 ⼆:清理 三:添加定时任务

    2023年5月9日
    1.8K00
  • anaconda: import numpy报错:ImportError: DLL load failed: 找不到指定的模块。

    解决方法1 这个问题可能是libiomp5md.dll造成的。如果你的C:\Windows\System32目录下存在libiomp5md.dll这个dll,而numpy自己也有一个libiomp5md.dl,在C:\Users\peter\AppData\Local\Continuum\anaconda3\Library\bin\libiomp5md.dl…

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

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

    2023年8月21日
    2.0K00
  • DedeCMS系统后台登陆并跳转回登陆界面的解决方法

    问题描述 在登陆界面输入账号密码后会有3-5秒的卡顿才会进入下面的页面,然后再卡顿3-5秒就跳回登陆界面。 解决方法 Windows系统 出现该问题的原因是网站web目录没有写入权限,因此只要将web目录增加写入权限即可 Linux系统 修改DATA和sessions的目录属性为可写,即(777) 清空sessions内除index.html以外的所有文件 …

    2022年8月22日
    1.8K00
  • 用 Nginx 禁止国外 IP 访问我的网站

    看了下 Nginx 的访问日志,发现每天有好多国外的 IP 地址来访问我的网站,并且访问的内容基本上都是恶意的。因此我决定禁止国外 IP 来访问我的网站。 想要实现这个功能有很多方法,下面我就来介绍基于 Nginx 的 ngx_http_geoip2 模块来禁止国外 IP 访问网站。 ①安装 geoip2 扩展依赖: ②下载 ngx_http_geoip2_…

    2023年4月24日
    1.6K00

发表回复

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

在线咨询: QQ交谈

邮件:712342017@qq.com

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

关注微信