Kubernetes存储与配置
Kubernetes 中,与 Pod 生命周期解耦的外部资源有两类:持久化存储(PV/PVC)与应用配置(ConfigMap/Secret)。Pod、Service、Workload 等核心对象见主笔记。
PV 与 PVC
容器重建会丢失本地数据,持久化存储必须独立于 Pod 存在。PV(PersistentVolume,持久卷)是存储资源本身,由管理员提供(NFS、云盘等);PVC(PersistentVolumeClaim,持久卷声明)是应用对存储的申请,Pod 挂载 PVC 后由 Kubernetes 自动绑定满足条件的 PV——应用只需声明"要多大、什么访问模式",不关心存储来自哪里。StatefulSet 通过 PVC 为每个 Pod 提供独立持久化存储。
绑定流程如下:
为什么不直接让 Pod 用存储
PVC 把“存储需求”和“存储实现”解耦:应用只写 PVC,底层换云盘、换 NFS 都不用改应用;没有可用 PV 时 PVC 保持 Pending,不阻塞应用构建。
访问模式
访问模式决定 PV 能被多少节点/多少 Pod 同时使用,在 PV 和 PVC 里都要声明且必须一致:
| 模式 | 含义 | 典型场景 |
|---|---|---|
| ReadWriteOnce(RWO) | 单节点读写 | 块存储、数据库单实例 |
| ReadOnlyMany(ROX) | 多节点只读 | 共享只读配置、日志归档 |
| ReadWriteMany(RWX) | 多节点读写 | NFS 共享文件、集群应用 |
| ReadWriteOncePod(RWOP) | 单 Pod 读写 | 需要存储独占(1.22+) |
回收策略
PVC 删除后,PV 里的数据如何处理由回收策略决定:
| 策略 | 行为 | 适用 |
|---|---|---|
| Retain | 保留数据,等待管理员手动清理 | 生产默认,防误删 |
| Delete | 删除 PV 时连带删除后端存储 | 云盘等可自动回收的存储 |
| Recycle | 清理数据后重新可用(已废弃) | — |
StorageClass 动态供给
前面讲的是静态供给:管理员预先建好 PV,PVC 去匹配。StorageClass 把这一环节自动化:PVC 声明 storageClassName,系统按类中定义的存储插件(云盘、NFS 等)自动创建 PV,适合存储需求频繁变化的场景。kubectl get sc 可查看集群可用的存储类。
常用命令
# 查看 PV
kubectl get pv
# 描述 PV
kubectl describe pv pv-name
# 删除 PV
kubectl delete pv pv-name
# 查看 PVC
kubectl get pvc
# 描述 PVC
kubectl describe pvc pvc-name
# 删除 PVC
kubectl delete pvc pvc-name
# 查看 StorageClass
kubectl get sc配置管理
应用配置分两类:非敏感的放 ConfigMap,敏感的放 Secret。两者注入方式相同,区别只在内容是否需要保密。
ConfigMap
ConfigMap 保存非敏感配置(环境变量、配置文件),与 Secret 的注入方式相同,但内容不涉及机密。修改 ConfigMap 后已运行的 Pod 不会自动更新,需重启或滚动更新才生效。
Secret
Secret 保存密码、令牌、密钥等敏感信息,避免明文写进镜像或 YAML。内容仅做 base64 编码(编码不是加密),通过环境变量或挂载文件注入容器。
apiVersion: v1
kind: Secret
metadata:
name: webapp-secret
type: Opaque
data:
# echo -n "dbpassword" | base64
DB_PASSWORD: ZGJwYXNzd29yZA==ConfigMap 与 Secret 对比
| 对比项 | ConfigMap | Secret |
|---|---|---|
| 保存内容 | 非敏感配置(URL、开关、普通配置项) | 敏感信息(密码、令牌、密钥) |
| 编码 | 明文 | base64 编码(仅编码,非加密) |
| 默认保护 | 无 | RBAC 可细粒度控制访问 |
| 推荐用途 | 应用配置 | 凭据 |
Secret 使用示例
apiVersion: apps/v1
kind: Deployment
metadata:
name: webapp
spec:
template:
spec:
containers:
- name: webapp
image: webapp:v1
ports:
- containerPort: 80
envFrom:
- configMapRef:
name: webapp-config
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: webapp-secret
key: DB_PASSWORD敏感数据保护
生产环境中建议:
- 启用 Secret 加密存储
- 使用 RBAC 限制 Secret 访问
- 考虑使用 Vault 等外部密钥管理