1. 环境变量在 Kubernetes Pod 中的作用

在 Kubernetes 中,环境变量是配置容器应用的重要方式之一。很多容器镜像(如官方的 PostgreSQL 镜像)都设计为通过环境变量来接收配置参数,例如 POSTGRES_PASSWORDPGDATA 等。这种方式使得我们无需重新构建镜像,就可以通过修改环境变量来调整容器的行为。

Kubernetes 提供了多种方式来设置环境变量,主要包括:

  • 使用 env 字段直接定义
  • 使用 envFromConfigMapSecret 中批量导入
  • 容器镜像本身定义的默认环境变量

接下来我们将详细介绍这些方式的使用方法和优先级规则。

2. 设置环境变量的方式

2.1 使用 env 字段定义环境变量

env 字段用于直接在 Pod 的 YAML 文件中定义环境变量,格式为键值对列表。每个环境变量通过 namevalue 指定。

例如,我们可以通过如下方式设置 PostgreSQL 的密码:

apiVersion: v1
kind: Pod
metadata:
  name: postgres
spec:
  containers:
  - name: postgres
    image: postgres
    env:
    - name: POSTGRES_PASSWORD
      value: mysecretpassword

此外,env 还支持从 SecretConfigMap 中引用值,使用 valueFrom 字段:

env:
- name: POSTGRES_PASSWORD
  valueFrom:
    secretKeyRef:
      name: postgres-secret
      key: PG_PASS

这种方式更安全,适用于敏感信息如密码、Token 等。

2.2 使用 envFrom 批量导入环境变量

当需要设置大量环境变量时,推荐使用 envFrom 字段,它可以将 ConfigMapSecret 中的所有键值对作为环境变量注入到容器中。

例如,假设我们有一个名为 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 时,环境变量的名称会直接使用 ConfigMapSecret 中的 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

也可以混合使用 valuevalueFrom

env:
- name: POSTGRES_PASSWORD
  value: oldpassword
- name: POSTGRES_PASSWORD
  valueFrom:
    secretKeyRef:
      name: postgres-secret
      key: PG_PASS

此时,POSTGRES_PASSWORD 的值会是 PG_PASS 对应的密钥内容。

❌ 踩坑提醒:很多人误以为通过 envFrom 中的 ConfigMapSecret 可以覆盖 env 中的值,但其实不行,因为 env 的优先级更高。

4. 总结

环境变量是 Kubernetes 中配置容器应用的重要方式,主要通过以下方式设置:

方式 说明 优先级
env 显式定义单个变量,支持直接值或引用 ✅ 最高
envFrom 从 ConfigMap 或 Secret 中批量导入 中等
容器镜像默认变量 容器镜像中自带的环境变量 ❌ 最低

合理使用这些机制,可以实现灵活、安全的配置管理。尤其在涉及敏感信息时,推荐使用 Secret + envFromvalueFrom 的方式,避免明文暴露在 Pod 定义文件中。


原始标题:Environment Variables in Kubernetes Pod