1. 环境变量在 Kubernetes Pod 中的作用
在 Kubernetes 中,环境变量是配置容器应用的重要方式之一。很多容器镜像(如官方的 PostgreSQL 镜像)都设计为通过环境变量来接收配置参数,例如 POSTGRES_PASSWORD
、PGDATA
等。这种方式使得我们无需重新构建镜像,就可以通过修改环境变量来调整容器的行为。
Kubernetes 提供了多种方式来设置环境变量,主要包括:
- 使用
env
字段直接定义 - 使用
envFrom
从ConfigMap
或Secret
中批量导入 - 容器镜像本身定义的默认环境变量
接下来我们将详细介绍这些方式的使用方法和优先级规则。
2. 设置环境变量的方式
2.1 使用 env
字段定义环境变量
env
字段用于直接在 Pod 的 YAML 文件中定义环境变量,格式为键值对列表。每个环境变量通过 name
和 value
指定。
例如,我们可以通过如下方式设置 PostgreSQL 的密码:
apiVersion: v1
kind: Pod
metadata:
name: postgres
spec:
containers:
- name: postgres
image: postgres
env:
- name: POSTGRES_PASSWORD
value: mysecretpassword
此外,env
还支持从 Secret
或 ConfigMap
中引用值,使用 valueFrom
字段:
env:
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: postgres-secret
key: PG_PASS
这种方式更安全,适用于敏感信息如密码、Token 等。
2.2 使用 envFrom
批量导入环境变量
当需要设置大量环境变量时,推荐使用 envFrom
字段,它可以将 ConfigMap
或 Secret
中的所有键值对作为环境变量注入到容器中。
例如,假设我们有一个名为 postgres-secret
的 Secret,内容如下:
apiVersion: v1
kind: Secret
metadata:
name: postgres-secret
type: Opaque
data:
PG_PASS: bXlzZWNyZXRwYXNzd29yZA==
我们可以这样引用它:
spec:
containers:
- name: postgres
image: postgres
envFrom:
- secretRef:
name: postgres-secret
这样,PG_PASS
就会以环境变量的形式注入到容器中,值为 mysecretpassword
。
⚠️ 注意:使用 envFrom
时,环境变量的名称会直接使用 ConfigMap
或 Secret
中的 key,不能自定义。
3. 环境变量优先级与覆盖机制
Kubernetes 中的环境变量来源有三种:
- 容器镜像默认环境变量
- Pod 定义中的
env
字段 - Pod 定义中的
envFrom
字段
这三者之间存在优先级关系,具体顺序如下:
✅ env
> envFrom
> 容器镜像默认变量
也就是说:
- 如果
env
中定义了某个变量,它会覆盖其他所有来源的同名变量。 - 如果
envFrom
中定义了某个变量,而env
中没有,则该变量生效。 - 如果都没有定义,使用容器镜像中的默认值(如果有的话)。
3.1 覆盖机制示例
可以在 env
列表中重复定义同一个变量名,后定义的值会覆盖前面的值:
env:
- name: POSTGRES_PASSWORD
value: oldpassword
- name: POSTGRES_PASSWORD
value: newpassword
最终生效的值是 newpassword
。
也可以混合使用 value
和 valueFrom
:
env:
- name: POSTGRES_PASSWORD
value: oldpassword
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: postgres-secret
key: PG_PASS
此时,POSTGRES_PASSWORD
的值会是 PG_PASS
对应的密钥内容。
❌ 踩坑提醒:很多人误以为通过 envFrom
中的 ConfigMap
或 Secret
可以覆盖 env
中的值,但其实不行,因为 env
的优先级更高。
4. 总结
环境变量是 Kubernetes 中配置容器应用的重要方式,主要通过以下方式设置:
方式 | 说明 | 优先级 |
---|---|---|
env |
显式定义单个变量,支持直接值或引用 | ✅ 最高 |
envFrom |
从 ConfigMap 或 Secret 中批量导入 | 中等 |
容器镜像默认变量 | 容器镜像中自带的环境变量 | ❌ 最低 |
合理使用这些机制,可以实现灵活、安全的配置管理。尤其在涉及敏感信息时,推荐使用 Secret
+ envFrom
或 valueFrom
的方式,避免明文暴露在 Pod 定义文件中。