配置与存储
配置不要烤进镜像里改一次打一次包。K8s 用 ConfigMap / Secret 外置配置,用 Volume / PVC 挂文件或持久盘。
ConfigMap
存非敏感配置(环境、nginx 片段、功能开关等)。
apiVersion: v1
kind: ConfigMap
metadata:
name: web-config
data:
APP_ENV: "staging"
extra.properties: |
feature.x=true
挂进 Pod 的两种常见方式:
| 方式 | 场景 |
|---|---|
env / envFrom | 环境变量 |
volumeMounts | 配成文件目录 |
# 片段:Deployment 的 container
envFrom:
- configMapRef:
name: web-config
volumeMounts:
- name: cfg
mountPath: /etc/config
volumes:
- name: cfg
configMap:
name: web-config
改 ConfigMap 不一定立刻反映进已启动进程:取决于是 env(通常要滚动重启)还是挂载文件(kubelet 会异步更新,应用还须支持热加载)。
Secret
存敏感数据(密码、token、证书)。API 里常见 data(Base64)或 stringData(明文,提交时转换)。
apiVersion: v1
kind: Secret
metadata:
name: web-secret
type: Opaque
stringData:
DB_PASSWORD: "s3cr3t"
挂载方式与 ConfigMap 类似(secretRef / secret volume)。
注意: 默认 Secret 只是 Base64,不是强加密;权限靠 RBAC 与集群配置。不要把生产密钥提交进公共仓库;用密封机制 / 外部密钥系统(团队规范为准)。
| ConfigMap | Secret | |
|---|---|---|
| 用途 | 非敏感配置 | 敏感配置 |
| 默认编码 | 明文 data | Base64(勿当加密) |
| 同样可 | env / 文件挂载 | env / 文件挂载 |
Volume 直觉
| 类型 | 一句话 |
|---|---|
| emptyDir | Pod 级临时目录,删 Pod 就没 |
| configMap / secret / downwardAPI | 把集群对象投射成文件 |
| persistentVolumeClaim | 声明「我要一块持久盘」 |
PVC / PV(够用版)
- PVC:应用声明需要的容量与访问模式
- PV / StorageClass:集群侧供给真实存储(云盘、NFS…)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: web-data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 10Gi
storageClassName: standard # 名称以集群为准
Deployment 挂 PVC 时注意:ReadWriteOnce 盘通常不宜多副本同时写;有状态服务更常见 StatefulSet + volumeClaimTemplates。
要点
- 配置外置:ConfigMap / Secret,勿把密钥写进镜像层
- 改配置后确认是否需要滚动重启
- Secret ≠ 加密;管好仓库与 RBAC
- 持久数据走 PVC;先搞清访问模式与副本数是否匹配
面试速记
- ConfigMap vs Secret? 都是配置对象;Secret 面向敏感数据,默认仍只是编码+权限控制。
- 环境变量挂载改了为何不生效? env 在容器启动时注入,一般要重建 Pod。
- PV 和 PVC? PVC 是申请;PV/StorageClass 是供给。
- 有状态怎么挂盘? 常用 StatefulSet + 每副本独立 PVC。
- emptyDir 丢不丢? Pod 删除即丢;只适合缓存/临时文件。