一、Volume 存储卷类型

类型 特点 生命周期 典型场景
emptyDir 临时空目录,Pod 内多容器共享 Pod 删除即清除 缓存、临时数据交换
hostPath 挂载宿主机目录 Pod 删除数据保留(节点级) 单节点测试、访问宿主机文件
NFS 挂载网络共享存储 Pod 删除数据保留 多 Pod 共享持久数据

关键参数

  • volumeMounts.mountPath:容器内挂载路径
  • volumeMounts.readOnly:是否只读(默认 false)
  • hostPath.path:宿主机目录路径
  • nfs.server / nfs.path:NFS 服务端地址和共享目录

二、PersistentVolume(PV)与 PersistentVolumeClaim(PVC)

架构关系

  • PV:集群级存储资源(由管理员创建)
  • PVC:命名空间级存储请求(由用户创建)
  • 绑定:PVC 根据 accessModes容量storageClassName 匹配 PV,一一绑定

关键属性

属性 说明
accessModes RWO(单节点读写)、ROX(多节点只读)、RWX(多节点读写)
volumeMode Filesystem(文件系统,默认) / Block(原始块设备)
persistentVolumeReclaimPolicy Retain(保留,默认)、Recycle(已弃用)、Delete(删除后端存储)
storageClassName 用于动态供给或分类匹配

常用操作

# 查看 PV/PVC
kubectl get pv
kubectl get pvc

# 删除 PVC 后,PV 状态变为 Released,需手动清理 claimRef 才能复用(Retain 策略下)
kubectl edit pv <pv-name>   # 删除 claimRef 字段

注意事项

  • 访问模式互斥:同一时刻只能以一种模式挂载(即使支持多种)。
  • 默认回收策略为 Retain,数据不会自动删除。
  • NFS 等常见存储支持 RWX,适合多 Pod 共享。

三、ConfigMap(非敏感配置)

创建方式

方式 命令示例
键值对 kubectl create configmap mysql --from-literal=password=redhat
单个文件 kubectl create configmap web1 --from-file=./index.html
目录 kubectl create configmap web2 --from-file=./web2

引用方式

  1. 环境变量(容器级)
env:
- name: MYSQL_ROOT_PASSWORD
  valueFrom:
    configMapKeyRef:
      name: mysql
      key: password
  1. Volume 挂载(Pod 级)
  • 挂载全部键:mountPath: /dir,每个键变为文件
  • 挂载特定键:使用 itemssubPath

动态更新

  • 以 Volume 方式挂载的 ConfigMap 内容会自动更新(kubelet 周期性同步),但需应用自行感知(如重载配置)。

容量限制

  • 单个 ConfigMap 上限 1 MiB,不适合存大文件。

四、Secret(敏感信息)

与 ConfigMap 区别

  • Secret 对数据做 Base64 编码(非加密),ConfigMap 明文。
  • Secret 适合密码、令牌、证书等敏感数据。

常用类型

类型 用途
generic(Opaque) 通用键值对
docker-registry 镜像仓库认证凭据
tls TLS 证书/私钥对

创建示例

# generic 键值对
kubectl create secret generic mysecret --from-literal=user=tom --from-literal=password=redhat

# docker-registry
kubectl create secret docker-registry regcred --docker-username=user --docker-password=pass --docker-email=email@example.com

# tls
kubectl create secret tls tls-secret --cert=path/to/cert.crt --key=path/to/key.key

引用方式(同 ConfigMap)

  • 环境变量:secretKeyRef
  • Volume 挂载:secret.secretName,支持 itemssubPath
  • 默认文件权限 644,可通过 defaultModemode 调整

动态更新

  • Volume 挂载的 Secret 内容也会自动更新,但需应用支持热加载。

五、综合案例参考(haproxy + nginx)

  • 使用 ConfigMap 保存 haproxy.cfg
  • 使用 ConfigMap 保存各 webapp 的静态页面
  • 通过 Volume 挂载到对应容器,实现配置与镜像分离

六、环境清理

kubectl delete ns <namespace>   # 删除实验命名空间,释放资源

总结:Volume 解决容器数据持久化与共享问题;PV/PVC 提供存储资源抽象与解耦;ConfigMap/Secret 实现配置与敏感信息的分离管理,是 Kubernetes 云原生应用配置的标准实践。

更多推荐