Kubernetes 存储

为什么需要存储卷?

容器在部署的过程中一般有以下三种数据:

  • 启动时需要的初始数据,例如配置文件
  • 启动过程中产生的临时数据,该临时数据需要多个容器间共享.
  • 启动过程中产生的持久化数据,例如Mysql的data目录

数据卷概述

  • kubernetes中的Volume提供了在容器中挂载外部存储的能力
  • Pod需要设置卷来源(spec.volume)和挂载点(spec.containers.volumeMounts)两个信息后才可以使用相应的Volume
  • 常用的数据卷
    • 本地(hostPath,emptyDir)
    • 网络(NFS,Ceph,GlusterFS)
    • 公有云(AWS,EBS)
    • K8s资源(configmap,secret)

临时存储卷,节点存储卷,网络存储卷

临时存储卷emptyDir

emptyDiR卷: 是一个临时存储卷,与Pod生命周期绑定一起,如果Pod删除了,卷也会被删除.

应用场景:Pod容器中的数据共享

  • 边车(sidecar)
  • 初始容器 (initcontainer)

image-20220514121707120

节点存储卷hostPath

hostPath卷:挂载Node文件系统(Pod所在节点)上文件目录到Pod中的容器.

应用场景:Pod中容器需要访问宿主机文件

image-20220514121748982

网络存储卷:NFS

NFS卷:提供对NFS挂载支持,可以自动将NFS共享路径挂载到POD中

NFS:是一个主流的文件共享服务器

image-20220514125335246

image-20220514125353802

使用mount -t nfs 172.16.10.61:/NFS-storgae /data 测试连接情况。

image-20220514161247472

使用NFS存储的目标

  1. Pod将数据持久化到远程存储
  2. 可以实现Pod多副本共享数据

持久卷概述

  • PersistentVolume(PV):对存储资源创建和使用的抽象,使得存储作为集群中的资源管理
  • PersistentVolumeClaim(PVC):让用户不需要关心具体的Volume实现细节

PV与PVC使用流程

image-20220529125437751

PV生命周期

image-20220529165951225

image-20220529143515187

  • **PV与PVC的关系:**一对一
  • **PV与PVC怎么匹配的:**存储空间,访问模式,匹配上可以配对。
  • **容量匹配策略:**匹配最接近的PV容量,如果满足不了,pod将处于pending状态
  • **存储空间的字段是限制使用容量?😗*这个字段是用作匹配的,目前没有做限制

PV动态供给

image-20220529170248997

对于不支持内部制备器的存储类,可以使用又第三方提供的验证过的外部制备器

https://github.com/kubernetes-sigs/sig-storage-lib-external-provisioner

例如NFS外部制备器下载地址

https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner

image-20220530230504904

class.yaml用于创建存储类

image-20220531010013709

deployment.yaml用于创建外部制备器,(以POD的形式)

image-20220530234507037

rbac.yaml保持不变

image-20220531000422668

运行三个yaml文件

image-20220531000509093

此时可以通过kubectl get sc查看存储类

image-20220531000706117

创建deployment样例

image-20220531004200748

查看pv以及pvc,已经自动创建完成

image-20220531004233422

有状态应用部署: statefulSet工作负载控制器

无状态与有状态:

Deployment控制器的设计原则:管理的所有Pod一摸一样,提供同一个服务,也不考虑在那台Node运行,可以随意扩容和缩容,这种应用成为无状态应用,例如Web服务

在实际的场景中,这并不能满足所有应用,尤其是分布式应用,会部署多个实例,这些实例之间往往有依赖关系,例如主从关系、主备关系、这种应用称为“有状态”,例如MySQL主从、Etcd集群。

总而言之在K8S中

**无状态可以理解为:**不用考虑多副本时之间的关系,可以多容器同时存在

**有状态应用可以理解为:**部署不对等服务时,部署的应用。

例如部署一个MYSQL主从,可能要考虑这些问题:

  1. 主和从实例启动顺序
  2. 主和从实例数据目录必须唯一
  3. 从连接主实例需要指定IP或者主机名

image-20220602225132948

image-20220602225703476

image-20220603002228869

创建完成后查看一下pv,pvc,service,pod

image-20220603002507123

StatefulSet和Deployment区别:有身份的!

身份三要素:

  • 域名
  • 主机名
  • 存储(pvc)

应用程序配置文件存储 ConfigMap

image-20220603011748273

在这里插入图片描述

敏感数据存储: Secret

image-20220603222911570

image-20220603223356857

Logo

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

更多推荐