本地储存(emptyDir和 hostPath)

  • emptyDir
    • 是host上的一个空目录
    • 生存周期与pod一致
    • 适合 Pod 中的容器需要临时共享存储空间的场景
  • hostPath
    • 挂载host上指定目录
    • 生存周期与host一致

持久化储存(PV, PVC和StorageClass)

  • PVC 描述的,是 Pod 想要使用的持久化存储的属性,比如存储的大小、读写权限等
  • PV 描述的,则是一个具体的 Volume 的属性,比如 Volume 的类型、挂载目录、远程存储服务器地址等
    • PVcluster level的,只能被同一个namespace下的PVC使用
  • PV和 PVC的关系
    • PV和PVC解耦的储存的实现和使用,类似于 “接口”和“实现” 的思想
    • 用户只要通过PVC声明需要的储存size和**access mode(rw, ro)**即可,它会自动与集群中已经存在的PV去匹配
    • 储存的实现细节交给管理员通过PV或者StorageClass配置
      • 避免了因为向开发者暴露过多的存储系统细节而带来的隐患
      • 也意味着出现事故时可以更容易定位问题和明确责任
  • 不应该把一个宿主机上的目录当作 PV 使用
    • 本地目录的存储行为完全不可控,它所在的磁盘随时都可能被应用写满,甚至造成整个宿主机宕机
  • 静态分配:预分配一些储存并绑定给PV
    • 缺点在于难以预测用户真实需求,造成资源浪费
  • 动态分配:不预分配PV,而声明StorageClass
    • StorageClass是一个包含PV创建信息的储存模板, 用于自动创建 PV
    • 包含的内容
      • PV的属性,比如储存类型,大小等
      • 创建PV使用到的储存插件
    • PVC指定使用的储存模板,k8s自动生成所需的PV并绑定到PVC

kubernetes 储存

配置(configMap和secret)

  • 管理一些可变配置信息
    • 应用的配置文件、环境变量、命令行参数
  • 让可变配置和容器镜像进行解耦,保证了容器的可移植性
  • configMap必须在pod前创建
  • volume形式挂载到pod的配置支持动态更新,而通过环境变量挂载的不支持
    • 数据放在etcd中,kubelet 组件在定时维护这些 Volume
    • 更新可能会有一定的延时
  • Secret 的用法几乎与 ConfigMap完全相同
  • 用户名、密码等数据是以Secret对象的方式交给 Kubernetes 保存
    • 数据必须是经过 Base64 转码的,以免出现明文密码
    • 仅仅是经过了转码,而并没有被加密,在真正的生产环境中,需要开启 Secret 的加密插件

相关文章: