Kubernetes数据存储管理

环境

设备名称 软件环境(镜像) 硬件环境
主机 Kubernetes 1.13.2桌面版 CPU:2核 内存:4G 磁盘:20G

原理

Pod中的数据默认并没有进行持久化,它们会随着Pod的销毁而一同被消灭。Pod并不总是稳定可靠的,它有可能会被频繁销毁并重建,用户并不希望重要的数据(例如MySQL中的数据)跟着Pod一同被销毁,这就需要引入一种持久的存储系统。Kubernetes提供了两种储存介质,它们是Volume和Persistent Volume(持久卷,简称PV)。简单来说,Volume中的数据不能被持久化,Pod销毁,数据消失;而Persistent Volume中的数据则独立于Pod,即使Pod销毁,数据依然可以永久保存。

一、Volume概述
默认情况下容器的数据都是非持久化的,在容器消亡以后数据也跟着丢失,所以Docker提供了Volume机制以便将数据持久化存储。类似的,Kubernetes提供了更强大的Volume机制和丰富的插件,解决了容器数据持久化和容器间共享数据的问题。与Docker不同,Kubernetes Volume的生命周期与Pod绑定。容器挂掉后Kubelet再次重启容器时,Volume的数据依然还在,而Pod删除时,Volume才会清理。数据是否丢失取决于具体的Volume类型,比如emptyDir的数据会丢失,而PV的数据则不会丢。常用的Volume类型有如下几种:

emptyDir:和Docker中的的匿名Volume比较类似,当指定使用emptyDir作为储存的时候,它会和Pod一起被初始化,并且随着Pod的销毁而销毁。因此,emptyDir比较适合于容器间的临时数据交换。
hostPath:通常是Host主机中的一个目录,数据持久性比emptyDir好,即使Pod被销毁,数据依然存在。hostPath适合需要从文件系统读取配置的Pod,例如Kubernetes的一些核心组件;用于监控的Pod如cAdvisor等。
NFS:网络文件系统,当Pod销毁,只是单纯卸载NFS的挂载点,并不会把数据删除,因此同样可用于数据持久化。
emptyDir和hostPath通常由Host主机提供储存设备,属于内部储存设备,因此Pod对它们有一定的依赖性,而nfs是一种网络文件系统,属于外部储存设备,可以跨网络访问,因此它的依赖性相对来说更小,移植性更好。
二、Persistent Volume概述
为了简化对存储调度,Kubernetes对存储的供应和使用做了抽象,以API形式提供给管理员和用户使用。要完成这一任务,引入了两个新的API资源:Persistent Volume和Persistent Volume Claim(持久卷申请,以下简称PVC)。

PV是集群中的一块网络存储,跟Node一样,也是集群的资源。PV跟Volume(卷)类似,不过会有独立于Pod的生命周期。由系统管理员配置创建的一个数据卷(即PV类型),它代表了某一类存储插件实现。
PVC是用户的一个请求,跟Pod类似。Pod消费Node的资源,PVC消费PV的资源。Pod能够申请特定的资源(CPU和内存);PVC能够申请特定的尺寸和访问模式(例如可以加载一个读写,以及多个只读实例),而无须感知后端的存储实现。
1、PV和PVC的生命周期
PV是集群的资源,PVC是对这一资源的请求,也是对资源的所有权的检验。PV和PVC之间的互动遵循如下的生命周期。
供应
集群管理员会创建一系列的PV。这些PV包含了为集群用户提供的真实存储资源。他们可利用Kubernetes API来消费。
绑定
用户创建一个包含了容量和访问模式的持久卷申请。Master会监听PVC的产生,并尝试根据请求内容查找匹配的PV,并把PV和PVC进行绑定。用户能够获取满足需要的资源,并且在使用过程中可能超出请求数量。
如果找不到合适的卷,这一申请就会持续处于非绑定状态,一直到出现合适的PV。例如一个集群准备了很多的50G大小的持久卷,(虽然总量足够)也是无法响应100G的申请的,除非把100G的PV加入集群。
使用
Pod把申请作为卷来使用。集群会通过PVC查找绑定的PV,并Mount给Pod。对于支持多种访问方式的卷,用户在使用PVC作为卷的时候,可以指定需要的访问方式。一旦用户拥有了一个已经绑定的PVC,被绑定的PV就归该用户所有了。用户的Pods能够通过在Pod的卷中包含的PVC来访问他们占有的PV。
释放
当用户完成对卷的使用时,就可以利用API删除PVC对象了,而且他还可以重新申请。删除PVC后,对应的卷被视为“被释放”,但是这时还不能给其他的PVC使用。之前的PVC数据还保存在卷中,要根据策略来进行后续处理。
回收
PV的回收策略向集群阐述了在PVC释放卷的时候,应如何进行后续工作。目前可以采用三种策略:保留,回收或者删除。保留策略允许重新申请这一资源。在持久卷能够支持的情况下,删除策略会同时删除持久卷以及AWS EBS/GCE PD或者Cinder卷中的存储内容。如果插件能够支持,回收策略会执行基础的擦除操作(rm -rf /thevolume/*),这一卷就能被重新申请了。
PV的生命周期如下图所示:
在这里插入图片描述
(1)首先是Provision,即创建PV,这里创建PV有两种方式,静态和动态。所谓静态,是管理员手动创建一堆PV,组成一个PV池,供PVC来绑定。动态方式是通过一个叫Storage Class的对象由存储系统根据PVC的要求自动创建。
(2)一个PV创建完后状态会变成Available,等待被PVC绑定。
(3)一旦被PVC邦定,PV的状态会变成Bound,就可以被定义了相应PVC的Pod使用。
(4)Pod使用完后会释放PV,PV的状态变成Released。
(5)变成Released的PV会根据定义的回收策略做相应的回收工作。有三种回收策略,Retain、Delete和Recycle。Retain就是保留现场,Kubernetes什么也不做,等待用户手动去处理PV里的数据,处理完后,再手动删除PV。Delete策略,Kubernetes会自动删除该PV及里面的数据。Recycle方式,Kubernetes会将PV里的数据删除,然后把PV的状态变成Available,又可以被新的PVC绑定使用。

2、PV的yaml文件
每个PV包含一个spec以及status,用于描述该卷的规格和状态。

apiVersion: v1
kind: PersistentVolume
metadata:
name: pv0003
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
nfs:
path: /tmp
server: 172.17.0.2
PV的访问模式有三种:

ReadWriteOnce:是最基本的方式,可读可写,但只支持被单个Pod挂载。
ReadOnlyMany:可以以只读的方式被多个Pod挂载。
ReadWriteMany:这种存储可以以读写的方式被多个Pod共享。
不是每一种存储都支持这三种方式,像共享方式,目前支持的还比较少,比较常用的是NFS。在PVC绑定PV时通常根据两个条件来绑定,一个是存储的大小,另一个就是访问模式。
3、PVC的yaml文件
每个PVC包含一个spec以及status,用以表达其规格和状态。

kind: PersistentVolumeClaimapiVersion: v1metadata:
name: myclaimspec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 8Gi
PVC使用跟PV一致的访问模式。

步骤

一、实验环境检查
步骤1 以root用户登录主机,执行命令ifconfig ens3查看主机的IP地址,如下所示。
在这里插入图片描述
步骤2 执行命令source start.sh启动Kubernets。
二、配置NFS服务
步骤1 执行apt-get install nfs-kernel-server安装NFS服务。
步骤2 执行mkdir -p /data/volumes/mysql-pv命令,创建PV在NFS服务器上对应的目录。
步骤3 执行chmod -R 777 /data/* 命令添加权限。
步骤4 执行vim /etc/exports命令配置NFS服务,输入如下内容。

/data/volumes/mysql-pv *(rw,no_root_squash,sync)
在这里插入图片描述

rw:读/写权限,只读权限的参数为ro;
sync:数据同步写入内存和硬盘,也可以使用async,此时数据会先暂存于内存中,而不立即写入硬盘。
no_root_squash:NFS服务器共享目录用户的属性,如果用户是root,那么对于这个共享目录来说就具有root的权限。
步骤5 执行service nfs-kernel-server restart命令重启NFS服务。

三、创建PV和PVC
步骤1 执行vi mysql-pv.yaml命令创建PV的配置文件,内容如下所示。

apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv
spec:
capacity:
storage: 1Gi
accessModes:

  • ReadWriteOnce
    nfs:
    path: /data/volumes/mysql-pv
    server: 192.168.1.6
    步骤2 执行kubectl apply -f mysql-pv.yaml命令,创建PV,如下所示。
    在这里插入图片描述

步骤3 执行kubectl get pv命令,查看PV状态。

在这里插入图片描述

步骤4 执行vi mysql-pvc.yaml命令创建PVC的配置文件,内容如下所示。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
spec:
accessModes:

  • ReadWriteOnce
    resources:
    requests:
    storage: 1Gi
    步骤5 执行kubectl apply -f mysql-pvc.yaml命令创建PVC,如下所示。
    在这里插入图片描述

步骤6 执行kubectl get pvc命令,查看PVC状态。
在这里插入图片描述

四、部署MySQL
步骤1 执行vi mysql.yaml命令创建MySQL的配置文件,内容如下所示。

apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:

  • port: 3306
    selector:
    app: mysql

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: mysql
spec:
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.6
imagePullPolicy: IfNotPresent
env:
- name: MYSQL_ROOT_PASSWORD
value: password
ports:
- name: mysql
containerPort: 3306
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pvc
步骤2 执行kubectl apply -f mysql.yaml命令创建MySQL,如下所示。
在这里插入图片描述

步骤3 执行kubectl get pod -o wide命令,查看Pod的状态,如下所示。
在这里插入图片描述

步骤4执行如下命令,通过客户端访问Service mysql,如下所示。
kubectl run -it --rm --image=mysql:5.6 --restart=Never mysql-client – mysql -h mysql -ppassword
在这里插入图片描述

步骤5 在mysql库中创建一个表myid,然后在表里新增几条数据。
在这里插入图片描述

  • 22
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值