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

相关推荐

  • 如何修改WordPress底部版权信息?

    wordpress安装之后,有不少默认设置需要我们修改,wordpress网站底部版权信息就是其中之一,在网站最下面页脚那个位置,会有一段英文声明,如下所示。 © 2019 My WordPress Proudly powered by WordPress 如果你使用的不是wordpress默认主题,底部版权信息会根据wordpress主题的不同,被开发者写…

    2024年1月29日
    2.0K00
  • 解决Composer Installing dependencies from lock file

    1、问题描述 2、原因 这是因为不匹配composer.json要求的版本。提示我的PHP 7版本太高,不符合composer.json需要的版本,但是在PHP 7下应该也是可以运行的,composer可以设置忽略版本匹配。 3、解决方案 composer install –ignore-platform-reqs 或者 composer update -…

    2023年2月14日
    1.5K00
  • nginx安全:配置allow/deny控制ip访问

    一,nginx中allow/deny指令的用途 1, Nginx的deny和allow指令是由ngx_http_access_module模块提供, Nginx安装默认内置了该模块 2, nginx访问控制模块: 想禁止哪个ip访问就加上deny IP, 想允许哪个ip访问就加上allow IP, 想禁止或者允许所有,则allow all或者deny all…

    2023年3月1日
    1.3K00
  • kibana报错:Unable to revive connection: http://localhost:9200/解决办法

    kibana报错:Unable to revive connection: http://localhost:9200/ 第一种情况(新手):先把elasticsearch.bat打开,再打开kibana.bat,原因主要是不打开elasticsearch自然生成不了地址,kibana自然也就找不到地址。如果不行请采用第二种或第三种。 第二种方法:通过doc…

    2023年8月23日
    1.7K00
  • Nginx配置及命令详解

    Nginx命令行 nginx -s 对应参数 信号 含义 stop TERM 强制关闭整个服务 null INT 强制关闭整个服务 quit QUIT 优雅地关闭整个服务 reopen USR1 重新打开日志记录 reload HUP 重新读取配置文件,并且优雅地退出老的worker nginx.conf重要的指令块 核心功能都在于http{}指令块里,ht…

    2022年6月17日
    1.6K00

发表回复

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

在线咨询: QQ交谈

邮件:712342017@qq.com

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

关注微信