环境变量
学习目标
- 掌握在 Pod 中设置环境变量的方法
- 理解不同环境变量来源的区别
- 掌握环境变量的最佳实践
核心概念
环境变量来源
┌─────────────────────────────────────┐
│ 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...