47·配置管理进阶

环境变量

kubernetesenvironmentconfiguration

环境变量

学习目标

  1. 掌握在 Pod 中设置环境变量的方法
  2. 理解不同环境变量来源的区别
  3. 掌握环境变量的最佳实践

核心概念

环境变量来源

┌─────────────────────────────────────┐
│           Pod                       │
│  ┌─────────────────────────────┐   │
│  │  Container                   │   │
│  │  环境变量来源:              │   │
│  │  1. 直接定义                 │   │
│  │  2. ConfigMap                │   │
│  │  3. Secret                   │   │
│  │  4. Pod 元数据               │   │
│  │  5. 容器资源                 │   │
│  └─────────────────────────────┘   │
└─────────────────────────────────────┘

方式 1:直接定义

apiVersion: v1
kind: Pod
metadata:
  name: my-app
spec:
  containers:
  - name: app
    image: my-app:1.0
    env:
    - name: APP_ENV
      value: production
    - name: LOG_LEVEL
      value: info

方式 2:从 ConfigMap 引用

env:
# 引用单个键
- name: DATABASE_HOST
  valueFrom:
    configMapKeyRef:
      name: db-config
      key: DB_HOST

# 引用整个 ConfigMap
envFrom:
- configMapRef:
    name: app-config

方式 3:从 Secret 引用

env:
# 引用单个键
- name: DATABASE_PASSWORD
  valueFrom:
    secretKeyRef:
      name: db-secret
      key: password

# 引用整个 Secret
envFrom:
- secretRef:
    name: db-secret

方式 4:Pod 元数据

env:
# Pod 名称
- name: POD_NAME
  valueFrom:
    fieldRef:
      fieldPath: metadata.name

# Pod 命名空间
- name: POD_NAMESPACE
  valueFrom:
    fieldRef:
      fieldPath: metadata.namespace

# Pod IP
- name: POD_IP
  valueFrom:
    fieldRef:
      fieldPath: status.podIP

# 节点名称
- name: NODE_NAME
  valueFrom:
    fieldRef:
      fieldPath: spec.nodeName

方式 5:容器资源

env:
# 容器 CPU 限制
- name: CPU_LIMIT
  valueFrom:
    resourceFieldRef:
      containerName: app
      resource: limits.cpu

# 容器内存限制
- name: MEMORY_LIMIT
  valueFrom:
    resourceFieldRef:
      containerName: app
      resource: limits.memory

环境变量引用语法

env:
# 方式 1:直接引用值
- name: APP_ENV
  value: "production"

# 方式 2:引用 ConfigMap 键
- name: DB_HOST
  valueFrom:
    configMapKeyRef:
      name: db-config
      key: DB_HOST
      optional: true  # 可选

# 方式 3:引用 Secret 键
- name: DB_PASSWORD
  valueFrom:
    secretKeyRef:
      name: db-secret
      key: password
      optional: true  # 可选

# 方式 4:引用字段
- name: POD_NAME
  valueFrom:
    fieldRef:
      fieldPath: metadata.name

环境变量使用场景

场景 1:应用配置
- APP_ENV: production
- LOG_LEVEL: info
- DEBUG: false

场景 2:数据库连接
- DB_HOST: mysql.example.com
- DB_PORT: "3306"
- DB_NAME: mydb

场景 3:服务发现
- REDIS_URL: redis://redis:6379
- KAFKA_BROKERS: kafka:9092

场景 4:Pod 信息
- POD_NAME: my-app-xxx
- POD_NAMESPACE: default
- NODE_NAME: node-1

环境变量最佳实践

1. 命名规范
   - 使用大写字母和下划线
   - 避免特殊字符
   - 使用有意义的名称

2. 敏感数据
   - 使用 Secret 存储
   - 避免在日志中打印

3. 配置分离
   - 非敏感数据使用 ConfigMap
   - 敏感数据使用 Secret

4. 默认值
   - 设置合理的默认值
   - 使用 optional: true

5. 文档化
   - 记录所有环境变量
   - 说明用途和格式

实践练习

练习 1:直接定义环境变量

创建 Pod:

apiVersion: v1
kind: Pod
metadata:
  name: env-demo
spec:
  containers:
  - name: app
    image: busybox
    command: ["sh", "-c", "env | sort && sleep 3600"]
    env:
    - name: APP_ENV
      value: production
    - name: LOG_LEVEL
      value: info
    - name: DEBUG
      value: "false"

验证:

kubectl logs env-demo | grep -E "APP_ENV|LOG_LEVEL|DEBUG"

练习 2:从 ConfigMap 引用

创建 ConfigMap:

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  APP_NAME: my-app
  APP_VERSION: "1.0.0"
  LOG_LEVEL: debug

创建 Pod:

apiVersion: v1
kind: Pod
metadata:
  name: env-from-configmap
spec:
  containers:
  - name: app
    image: busybox
    command: ["sh", "-c", "echo APP=$APP_NAME VER=$APP_VERSION LOG=$LOG_LEVEL && sleep 3600"]
    envFrom:
    - configMapRef:
        name: app-config

验证:

kubectl logs env-from-configmap
# 输出:APP=my-app VER=1.0.0 LOG=debug

练习 3:从 Secret 引用

创建 Secret:

apiVersion: v1
kind: Secret
metadata:
  name: db-secret
type: Opaque
data:
  username: YWRtaW4=
  password: TXlQQHNzdzByZA==

创建 Pod:

apiVersion: v1
kind: Pod
metadata:
  name: env-from-secret
spec:
  containers:
  - name: app
    image: busybox
    command: ["sh", "-c", "echo User=$DB_USER Pass=$DB_PASS && sleep 3600"]
    env:
    - name: DB_USER
      valueFrom:
        secretKeyRef:
          name: db-secret
          key: username
    - name: DB_PASS
      valueFrom:
        secretKeyRef:
          name: db-secret
          key: password

验证:

kubectl logs env-from-secret
# 输出:User=admin Pass=MyP@ssw0rd

练习 4:Pod 元数据

创建 Pod:

apiVersion: v1
kind: Pod
metadata:
  name: env-pod-meta
spec:
  containers:
  - name: app
    image: busybox
    command: ["sh", "-c", "echo Name=$POD_NAME NS=$POD_NAMESPACE IP=$POD_IP && sleep 3600"]
    env:
    - name: POD_NAME
      valueFrom:
        fieldRef:
          fieldPath: metadata.name
    - name: POD_NAMESPACE
      valueFrom:
        fieldRef:
          fieldPath: metadata.namespace
    - name: POD_IP
      valueFrom:
        fieldRef:
          fieldPath: status.podIP

验证:

kubectl logs env-pod-meta
# 输出:Name=env-pod-meta NS=default IP=10.244.x.x

小结

要点说明
直接定义value 字段
ConfigMap 引用configMapKeyRef / configMapRef
Secret 引用secretKeyRef / secretRef
Pod 元数据fieldRef
容器资源resourceFieldRef
最佳实践命名规范、敏感数据分离、文档化

练习编辑器

bash
Loading...

继续学习

完成本课后,建议继续学习下一课「卷挂载」 以巩固所学知识。