如何在 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:80,ADMIN_WEB_PC_TEST_PORT=tcp://10.233.45.183:80,ADMIN_WEB_PC_TEST_PORT_80_TCP_ADDR=10.233.45.183,ADMIN_WEB_PC_TEST_PORT_80_TCP_PORT=80,ADMIN_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

相关推荐

  • 解决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日
    2.1K00
  • 如何修改WordPress底部版权信息?

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

    2024年1月29日
    3.0K00
  • PHP编译安装时常见错误及解决办法

    1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. *27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. …

    2023年4月28日
    1.9K00
  • IIS怎么设置应用程序池自动回收

    1、打开 IIS 管理控制台,双击“应用程序池”文件夹。 2、右击适当的应用程序池,然后单击“高级设置”。出现应用程序池的属性对话框。 3、默认回收是有一个固定时间间隔的,但是太长了 4、点击特定时间后面的三个点 5、然后点击添加按钮,接着在Value里面设置时间点,如下图所示 6、最后可以设置多个时间点,如下图所示

    2022年8月9日
    3.2K00
  • OpenSSL自签证书生成

    一 背景 我们的mqtt broker服务,使用了SSL自签证书,可以提高mqtt连接安全性。 二 生成自签证书 在Centos7下生成,有效时长:100年

    2023年3月9日
    1.6K00

发表回复

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

在线咨询: QQ交谈

邮件:712342017@qq.com

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

关注微信