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

开发 前端
有两种方式引用 ConfigMap 中的变量:通过 envFrom 引用 ConfigMap 中全部变量,通过 valueFrom 引用 ConfigMap 中指定变量。

​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 中可能会增加几百个这样的变量。

3. 参考

  • https://github.com/kubernetes/kubernetes/blob/eacbf87bfe105b1b24f6226640ea85c93462401e/pkg/kubelet/kubelet_pods.go#L575
  • https://github.com/kubernetes/kubernetes/blob/eacbf87bfe105b1b24f6226640ea85c93462401e/pkg/kubelet/envvars/envvars.go#L32:6

责任编辑:武晓燕 来源: 问其
相关推荐

2022-10-14 13:33:35

2012-08-14 09:38:29

WAN优化

2020-09-30 09:07:37

DevOps

2020-08-05 09:48:20

Docker容器工具

2022-12-23 09:41:14

优先级反转

2015-06-02 11:26:29

产品团队

2015-11-19 15:01:11

JAVA_HOMELinux

2010-01-12 15:46:54

Fedora JDK

2023-01-05 08:48:57

技术管理排优先级

2010-09-13 17:30:07

CSS优先级

2010-09-01 14:10:36

CSS优先级

2010-08-31 11:04:48

CSS优先级

2009-08-28 17:10:59

C#线程优先级

2015-07-10 09:05:33

ASP.NET路由优先级

2015-10-29 13:15:50

ASP.NETWebApi路由

2015-08-10 14:37:27

LinuxBash环境变量

2024-05-20 10:03:15

线程池优先级队列排序方法

2023-12-19 15:53:53

2024-12-10 08:27:28

2010-03-18 14:09:20

Java线程同步
点赞
收藏

51CTO技术栈公众号