目录
1.4.2 部署nfs-client-provisioner
1.1 存储资源管理
在基于k8s容器云平台上,对存储资源的使用需求通常包括以下几方面:
1.应用配置文件、密钥的管理; 2.应用的数据持久化存储; 3.在不同的应用间共享数据存储;
k8s的Volume抽象概念就是针对这些问题提供的解决方案,k8s的volume类型非常丰富,从临时目录、宿主机目录、ConfigMap、Secret、共享存储(PV和PVC)。
k8s支持Volume类型包括以下几类:
1.临时空目录(随着Pod的销毁而销毁) emptyDir: 2.配置类(将配置文件以Volume的形式挂载到容器内) ConfigMap:将保存在ConfigMap资源对象中的配置文件信息挂载到容器内的某个目录下 Secret:将保存在Secret资源对象中的密码密钥等信息挂载到容器内的某个文件中。 downwardAPI:将downwardAPI的数据以环境变量或文件的形式注入容器中。 gitErpo:将某Git代码库挂载到容器内的某个目录下 3.本地存储类 hostpath:将宿主机的目录或文件挂载到容器内进行使用。 local:Kubernetes从v1.9版本引入,将本地存储以PV的形式提供给容器使用,并能够实现存储空间的管理。 4.共享存储 PV(Persistent Volume):将共享存储定义为一种“持久存储卷”,可以被多个容器应用共享使用。 PVC(Persistent Volume Claim):用户对存储资源的一次“申请”,PVC申请的对象是PV,一旦申请成功,应用就能够像使用本地目录一样使用共享存储了。
共享存储主要用于多个应用都能够使用存储资源,例如NFS存储、光纤存储Glusterfs共享文件系统等,在k8s系统中通过PV/StorageClass和PVC来完成定义,并通过volumeMount挂载到容器的目录或文件进行使用。
ConfigMap、Secret、emptyDir、hostPath等属于临时性存储,当pod被调度到某个节点上时,它们随pod的创建而创建,临时占用节点存储资源,当pod离开节点时,存储资源被交还给节点,pod一旦离开这个节点,存储就失效,不具备持久化存储数据的能力。与此相反,持久化存储拥有独立的生命周期,具备持久化存储能力,其后端一般是独立的存储系统如NFS、iSCSI、cephfs、glusterfs等。
pv与pvc
Kubernetes中的node代表计算资源,而PersistentVolume(PV)则代表存储资源,它是对各种诸如NFS、iSCSI、云存储等各种存储后端所提供存储块的统一抽象从而提供网络存储,通过它屏蔽低层实现细节。与普通volume不同,PV拥有完全独立的生命周期。 因为PV表示的是集群能力,它是一种集群资源,所以用户(通常是开发人员)不能直接使用PV,就像不能直接使用内存一样,需要先向系统申请,而 PVC 就是请求存储资源的。 Kubernetes通过PersistentVolumeClaim(PVC)代理用户行为,用户通过对PVC的操作实现对PV申请、使用、释放等操作,PVC是用户层面的资源。 PV 和 PVC 可以将 pod 和数据卷解耦,pod 不需要知道确切的文件系统或者支持它的持久化引擎。
Kubernetes的共享存储供应模式包括静态和动态两种模式
静态模式 静态PV由系统管理员负责创建、提供、维护,系统管理员为用户屏蔽真正提供存储的后端及其实现细节,普通用户作为消费者,只需通过PVC申请、使用此类资源。 动态模式: 集群管理员无须手工创建PV,而是通过对Storage Class的设置对后端存储进行描述,“storage class”可以理解成某种具体的后端存储,标记为某种“类型(Class)”,此时要求PVC对存储的类型进行声明,系统将自动完成PV的创建与PVC的绑定。如果用户的PVC中“storage class”的值为"",则表示不能为此PVC动态创建PV。
PV与PVC的绑定
用户创建包含容量、访问模式等信息的PVC,向系统请求存储资源。系统查找已存在PV或者监控新创建PV,如果与PVC匹配则将两者绑定。如果PVC创建动态PV,则系统将一直将两者绑定。PV与PVC的绑定是一一对应关系,不能重复绑定。如果系统一直没有为PVC找到匹配PV,则PVC无限期维持在"unbound"状态,直到系统找到匹配PV。实际绑定的PV容量可能大于PVC中申请的容量。
1.2 持久卷pv的类型
PV 持久卷是用插件的形式来实现的。Kubernetes 目前支持以下插件
- GCEPersistentDisk - AWSElasticBlockStore - AzureFile - AzureDisk - FC (Fibre Channel) - Flexvolume - Flocker - NFS - iSCSI - RBD (Ceph Block Device) - CephFS - Cinder (OpenStack block storage) - Glusterfs - VsphereVolume - Quobyte Volumes - HostPath (Single node testing only – local storage is not supported in any way and WILL NOT WORK in a multi-node cluster) - Portworx Volumes - ScaleIO Volumes - StorageOS
1.3 实验mysql基于NFS共享存储实现持久化存储
1.3.1 安装NFS
机器准备
k8s-master 制作nfs服务端作为共享文件系统[root@k8s-master ~]# yum install -y nfs-utils rpcbind [root@k8s-master ~]# mkdir /mnt/data #制作共享目录 [root@k8s-master ~]# vim /etc/exports /mnt/data 192.168.122.0/24(rw,no_root_squash) [root@k8s-master ~]# systemctl start rpcbind #启动服务 [root@k8s-master ~]# systemctl start nfs
# 使配置生效[root@k8s-master ~]# exportfs -r
# 检查配置是否生效[root@k8s-master ~]# exportfs
集群中的工作节点都需要安装客户端工具,主要作用是节点能够驱动 nfs 文件系统 只安装,不启动服务 # yum install -y nfs-utils # showmount -e master_ip # mount -t nfs master_ip:/mnt/data /mnt/data master节点 制作pv.yaml(一般这个动作由 kubernetes 管理员完成,也就是我们运维人员)[root@k8s-master ~]# mkdir /k8s/mysql -p [root@k8s-master ~]# cd /k8s/mysql/ [root@k8s-master mysql]# vim pv.yaml apiVersion: v1 kind: PersistentVolume #类型定义为pv metadata: name: my-pv #pv的名字 labels: #定义标签 type: nfs #类型为nfs spec: nfs: # 存储类型,需要与底层实际的存储一致,这里采用 nfs server: 192.168.122.24 # NFS 服务器的 IP path: "/mnt/data