Skip to main content

配置与存储

配置不要烤进镜像里改一次打一次包。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 与集群配置。不要把生产密钥提交进公共仓库;用密封机制 / 外部密钥系统(团队规范为准)。

ConfigMapSecret
用途非敏感配置敏感配置
默认编码明文 dataBase64(勿当加密)
同样可env / 文件挂载env / 文件挂载

Volume 直觉

类型一句话
emptyDirPod 级临时目录,删 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。

要点

  1. 配置外置:ConfigMap / Secret,勿把密钥写进镜像层
  2. 改配置后确认是否需要滚动重启
  3. Secret ≠ 加密;管好仓库与 RBAC
  4. 持久数据走 PVC;先搞清访问模式与副本数是否匹配

面试速记

  1. ConfigMap vs Secret? 都是配置对象;Secret 面向敏感数据,默认仍只是编码+权限控制。
  2. 环境变量挂载改了为何不生效? env 在容器启动时注入,一般要重建 Pod。
  3. PV 和 PVC? PVC 是申请;PV/StorageClass 是供给。
  4. 有状态怎么挂盘? 常用 StatefulSet + 每副本独立 PVC。
  5. emptyDir 丢不丢? Pod 删除即丢;只适合缓存/临时文件。