使用 ConfigMap
学习目标
- 掌握在 Pod 中使用 ConfigMap 的方法
- 理解环境变量注入和卷挂载的区别
- 掌握配置热更新的实现
核心概念
使用方式概览
┌─────────────────────────────────────┐
│ Pod │
│ ┌─────────────────────────────┐ │
│ │ Container │ │
│ │ - 环境变量注入 │ │
│ │ - 卷挂载为文件 │ │
│ └─────────────────────────────┘ │
└─────────────────────────────────────┘
↑ 读取配置
┌─────────────────────────────────────┐
│ ConfigMap │
└─────────────────────────────────────┘
方式 1:环境变量注入
apiVersion: v1
kind: Pod
metadata:
name: my-app
spec:
containers:
- name: app
image: my-app:1.0
env:
# 单个环境变量
- name: DATABASE_HOST
valueFrom:
configMapKeyRef:
name: db-config
key: DATABASE_HOST
# 所有环境变量
envFrom:
- configMapRef:
name: app-config
方式 2:卷挂载
apiVersion: v1
kind: Pod
metadata:
name: my-app
spec:
containers:
- name: app
image: my-app:1.0
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: app-config
环境变量 vs 卷挂载
| 特性 | 环境变量 | 卷挂载 |
|---|---|---|
| 更新方式 | 需要重启 Pod | 自动更新 |
| 适用场景 | 简单配置项 | 配置文件 |
| 数据格式 | 键值对 | 文件内容 |
| 访问方式 | os.environ | 读取文件 |
环境变量引用
env:
# 方式 1:直接引用整个 ConfigMap
- name: ALL_CONFIG
valueFrom:
configMapKeyRef:
name: my-config
key: special.key
# 方式 2:引用单个键
- name: DATABASE_HOST
valueFrom:
configMapKeyRef:
name: db-config
key: DB_HOST
optional: true # 可选,ConfigMap 不存在时不报错
卷挂载选项
volumes:
- name: config-volume
configMap:
name: app-config
# 可选配置
optional: true # ConfigMap 不存在时不报错
items:
- key: config.properties
path: app.conf # 挂载后的文件名
defaultMode: 0644 # 文件权限
配置热更新
卷挂载的 ConfigMap 支持热更新:
1. 更新 ConfigMap
kubectl apply -f updated-config.yaml
2. 等待更新生效(通常 60-90 秒)
- kubelet 定期检查 ConfigMap 变化
- 更新挂载的文件
3. 应用读取新配置
- 应用需要支持配置重载
- 或者使用文件监控机制
部分键挂载
volumes:
- name: config-volume
configMap:
name: app-config
items:
- key: database.properties
path: database.conf
- key: cache.properties
path: cache.conf
实践练习
练习 1:环境变量注入
创建 ConfigMap:
apiVersion: v1
kind: ConfigMap
metadata:
name: db-config
data:
DB_HOST: mysql.example.com
DB_PORT: "3306"
DB_NAME: mydb
创建 Pod 使用 ConfigMap:
apiVersion: v1
kind: Pod
metadata:
name: app-with-config
spec:
containers:
- name: app
image: busybox
command: ["sh", "-c", "echo DB=$DATABASE_HOST:$DATABASE_PORT/$DB_NAME && sleep 3600"]
envFrom:
- configMapRef:
name: db-config
验证:
kubectl logs app-with-config
# 输出:DB=mysql.example.com:3306/mydb
练习 2:卷挂载
创建 ConfigMap:
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-config
data:
nginx.conf: |
server {
listen 80;
server_name localhost;
location / {
return 200 "Hello from Nginx!";
}
}
创建 Pod 使用 ConfigMap:
apiVersion: v1
kind: Pod
metadata:
name: nginx-with-config
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: nginx-config
mountPath: /etc/nginx/conf.d
volumes:
- name: nginx-config
configMap:
name: nginx-config
验证:
kubectl exec nginx-with-config -- cat /etc/nginx/conf.d/nginx.conf
练习 3:配置热更新
- 创建初始 ConfigMap
- 创建 Pod 使用卷挂载
- 更新 ConfigMap
- 观察 Pod 中的文件变化
# 创建初始配置
kubectl apply -f config.yaml
# 创建 Pod
kubectl apply -f pod.yaml
# 查看配置
kubectl exec my-app -- cat /etc/config/app.conf
# 更新配置
kubectl edit configmap my-config
# 等待 60-90 秒后再次查看
kubectl exec my-app -- cat /etc/config/app.conf
小结
| 要点 | 说明 |
|---|---|
| 环境变量注入 | 简单配置,需要重启生效 |
| 卷挂载 | 配置文件,支持热更新 |
| envFrom | 注入整个 ConfigMap |
| configMapKeyRef | 引用单个键 |
| 热更新 | 卷挂载自动更新,需要应用支持 |
练习编辑器
bash
Loading...