存储设计理念

kubernetes将存储资源抽象为存储卷(Volume),Volume独立于pod与pod具有相同生命周期的对象。

volume来源

  1. 以volume形式挂载到容器的对象包括:

    • ConfigMap

    • Secret

    • Downward API:将pod、容器的元数据信息以文件形式挂载到容器中使用

    • Projected Volume:用于解决将多个资源挂载同一个目录的问题

      volumes:
      - name: all-in-one
        projected:
          sources:
          - secret:
            name: mysecret
            items:
              - key: username
                path: group/username
          - downwardAPI:
            items:
              - path: "labels"
                fieldRef:
                  fieldPath: metadata.labels
          - configMap:
            name: mycm
            items:
              - key: config
                path: group/config
                
      # 参考教程https://kuberxy.github.io/2020/10/02/%E6%B7%B1%E5%85%A5%E8%A7%A3%E6%9E%90Pod%E5%AF%B9%E8%B1%A13%EF%BC%9AProjected%20Volume/#%E4%B8%89%E3%80%81Downward-API
      
      # https://www.cnblogs.com/Tao9/p/11954758.html
      
    • ServiceAccountToken:ServiceAccount的Token数据

  2. 宿主机本地存储类型

    • emptyDir(临时存储卷):由pause容器创建的临时空间,生命周期与pod相同;可以通过medium=Memory设置为使用内存
    • hostPath(节点存储卷):挂载宿主机上的文件和目录,可以用于持久化数据(风险是会随pod调度变换主机),可以用于访问宿主机的docker引擎、监控系统
  3. 持久存储PV和网络存储

参考教程

pause容器的PID是1。而在kubernetes中容器的PID=1的进程即为容器本身的业务进程。

Kubernetes 中所谓的 pause 容器有时候也称为 infra 容器,它与用户容器”捆绑“运行在同一个 Pod 中,最大的作用是维护 Pod 网络协议栈(当然,也包括其他工作,下文会介绍)。

PV PVC StorageClass

PV是k8s中对存储资源抽象,是容器可以使用的资源。为了动态根据用户需求创建PV,系统管理员会先定义好创建PV的模板StorageClass,用户在使用时只需要引用对应的模板并写出所用存储大小、读写权限等即可,这些信息记录在PVC中。存储插件控制器会根据StorageClass和PVC中其他信息自动创建。

image-20220703134138457

Storage Class

本质是自动化根据PVC创建PV并绑定,配置的参数包括:

  • provisioner存储提供者
  • Reclaim Policy:资源回收策略,包括Delete(默认,回收后删除)和Retain(回收后保留 )
  • Allow Volume Expansion:是否运行扩容,需要Volume底层支持该功能
  • Volume Binding Mode:绑定模式,Immediate(默认)和 WaitForFirstConsumer(当消费pvc的pod创建后才会创建pv并绑定)

PV状态的流转

PV在创建开始后,处于pending,直到创建完成状态变为available。当PVC和PV绑定后,状态变为bound。当绑定的PVC删除,则变为released。released后的PV无法进行再次和PVC绑定。

image-20220703144256039

Volume Plugins

PV、PVC这种存储管理机制,需要将存储管理的代码放到k8s代码库中,与k8s一起发布管理,是In-Tree模式,这种模式与k8s紧耦合。另外一种扩展k8s存储方式是基于CSI标准,代码独立存在的方式,称为Out-of-Tree。

存储快照

存储快照的设计其实是仿照pvc & pv 体系的设计思想。当用户需要存储快照的功能时,可以通过VolumeSnapshot对象声明,并指定相应的VolumeSnapshotClass对象,之后由集群中的相关组件动态生成存储快照以及存储快照对应的对象VolumeSnapshotContent。

pshot对象声明,并指定相应的VolumeSnapshotClass对象,之后由集群中的相关组件动态生成存储快照以及存储快照对应的对象VolumeSnapshotContent。**

PVC 对象将其的 dataSource 字段指定为 VolumeSnapshot 对象,这样就可以恢复数据。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐