云计算
K8s数据持久性
Kubernetes存储容量:
我们知道容器中的数据默认是非持久化的,容器被破坏后数据会丢失,所以docker提供了一个卷机制来持久化存储数据。同样,k8s提供了更强大的卷机制和丰富的插件,解决了容器数据持久化和容器间数据共享的问题。
音量:
我们常说:集装箱和Pod都是短命的。
意味着它们的生命周期可能很短,会被频繁地破坏和创造。当容器被销毁时,存储在容器内文件系统中的数据将被清除。为了持久化容器中的数据,可以使用k8s卷。
卷的生命周期独立于容器。Pod中的容器可能会被销毁和重建,但卷将被保留。
k8s支持的卷类型包括emptydir、hostpath、persistentVolumeClaim、gcePersistentDisk、awsElasticBlockStore、nfs、iscsi、gitRepo、secret等。如需完整的清单和详细的文件,请参考http://docs.kubernetes.org.cn/429.html.
本文主要练习以下几种卷型:
1、EmptyDir(临时存储):
EmptyDir是最基本的卷类型。顾名思义,emptyDir卷是主机上的一个空目录。也就是说,主机上没有指定的目录或文件,直接从pod内部映射到主机。(类似于docker中Docker管理器卷的挂载方法)
我们通过以下示例练习emptydir:
[root @ master YAML]# vim empty dir . YAML
apiVersion: v1
种类:豆荚
元数据:
名称:读写
规格:
容器:
-姓名:写
图片:busybox
卷装载:#定义数据持久性
-mountPath: /write #定义挂载目录,即pod内的目录。
名称:共享卷
参数:
- /bin/sh
--丙
-echo hello volumes/write/hello;睡眠3000;
-name: read #定义pod中的第二个容器。
图片:busybox
卷安装:
- mountPath: /read
名称:共享卷
参数:
- /bin/sh
--丙
-猫/读/你好;睡30000;
体积:
-名称:共享卷
EmptyDir: {} #定义一个数据持久性类型empytdir。
我们模拟两个容器在一个容器中运行。两个容器共享一个卷,一个负责写数据,另一个负责读数据。
//运行pod并检查:
[root @ master YAML]# ku bectl apply-f empty dir . YAML
pod/读写已创建
[root @ master YAML]# ku bectl get pod-o wide
命名就绪状态重新启动老化IP节点提名节点就绪门
读写2/2运行0 14s 10.244.2.2节点02无
//让我们分别看看两个容器中装载的内容:
[root @ master YAML]# ku bectl exec-it读写-c read cat /read/hello
你好卷
[root @ master YAML]# ku bectl exec-it读写-c写cat /write/hello
你好卷
参数解释:
-c:用于指定容器,是container=的缩写,可以通过help查看。
因为emptyDir是Docker主机文件系统中的一个目录,所以它的作用相当于执行docker run -v /write和docker run -v /read。我们在节点02。
通过网站上的docker inspect查看容器的详细配置信息,我们发现两个容器都挂载了相同的目录:
挂载:[
{
类型:绑定,
source:/var/lib/kube let/pods/756 B4 f4a-917 a-414d-a7ee-523 eecf 05465/volumes/kubernetes . io ~ empty-dir/share-volume,
目的地:/read,
模式:
乌尔曼:没错,
传播:rprivate
},
{
类型:绑定,
source:/var/lib/kube let/pods/756 B4 f4a-917 a-414d-a7ee-523 eecf 05465/volumes/kubernetes . io ~ empty-dir/share-volume,
目的地:/write,
模式:
乌尔曼:没错,
传播:rprivate
},
这里的“/var/lib/kube let/pods/756 B4 f4a-917 a-414d-a7ee-523 eecf 05465/volumes/kubernetes . io ~ empty-dir/share-volume”是emptydir挂载到dockerhost上的真实路径。
所以我们可以输入路径来检查:
[root @ node 02 ~]# CD/var/lib/kube let/pods/756 B4 f4a-917 a-414d-a7ee-523 eecf 05465/volumes/kubernetes . io ~ empty-dir/share-volume/
[root @ node 02 share-volume]# cat hello
你好卷
总结emptydir:
同一个pod中的不同容器共享同一个持久目录。当pod节点被删除时,卷的内容也将被删除,但是如果只有容器被销毁而pod仍在,则卷不会受到影响。也就是说,emptydir的数据持久化的生命周期与使用的pod是一致的。一般用作临时存储,以及长期任务中间进程中检查点的临时存储目录,多容器共享目录。
2、主机路径:
1)将主机上的现有目录或文件装入容器。
2)这种持久化的方法在很多场景下并不使用,因为虚拟化技术的核心是隔离主机,但这种方式增加了pod和节点之间的耦合。
3)一般这种方法会用于k8s集群本身的数据持久化和docker本身的数据持久化。
比如kube-apiserver和kube-controller-manager就是这样的应用。
我们使用“kubectl edit-nkube-system Pod kube-API server-master”命令来检查kube-apiserver Pod的配置。以下是该卷的相关部分:
卷安装:
- mountPath: /etc/ssl/certs
名称:ca证书
只读:真
- mountPath: /etc/pki
名称:etc-pki
只读:真
- mountPath: /etc/kubernetes/pki
名称:k8s-certs
只读:真
体积:
-主机路径:
路径:/etc/ssl/certs
类型:目录或创建
名称:ca证书
-主机路径:
路径:/etc/pki
类型:目录或创建
名称:etc-pki
-主机路径:
路径:/etc/kubernetes/pki
类型:目录或创建
名称:k8s-certs
这里定义了三个HostPath卷,分别是k8s-certs、ca-certs和etc- pki,分别对应主机目录/etc/kubernetes/pki、/etc/ssl/certs和/etc/pki。
如果Pod被销毁,对应于主机路径的目录也将被保留。由此看来,hostPath的持久性比emptyDir更强。但是,一旦主机崩溃,将无法访问主机路径。
3、pv pvc
PersistentVolume(pv):统一数据持久目录是指由集群管理员配置和提供的存储系统上的空间。它是底层共享存储的抽象,将共享存储作为用户可以申请的资源,从而实现“存储消耗”机制。
PersistentVolumeClaim(pvC):对PV持久空间的声明,声明。指定所需的最小容量需求和访问模式,然后用户向kubernetes api服务器提交持久卷声明列表,kubernetes会找到匹配的持久卷,并将其绑定到持久卷声明。
NFS恒量
通过NFS练习PV和PVC。
1)我们在主节点上部署nfs服务:
[root@master ~]# yum -y安装nfs-utils
[root@master ~]# mkdir /nfsdata
[root @ master ~]# vim/etc/exports #写入nfs配置文件
/nfsdata 172.16.1.0/24(rw,sync,no_root_squash)
[root@master ~]# systemctl启用rpcbind
[root@master ~]# systemctl启动rpcbind
[root@master ~]# systemctl启用nfs服务器
[root@master ~]# systemctl启动nfs服务器
[root@master ~]# showmount -e #检查挂载是否成功。
主文件的导出列表:
/nfsdata 172.16.1.0/24
2)创建pv:
[root @ master YAML]# vim NFS-PV . YAML
apiVersion: v1
种类:持久卷
元数据:
名称:nfs-pv
规格:
容量:
存储:1Gi
访问模式:
-读写一次
persistentVolumeReclaimPolicy策略:回收
存储类名:nfs
nfs:
Path: /nfsdata #指定nfs共享目录。
Server: 172.16.1.30 #指定nfs服务器的ip地址。
//使用以下命令运行pv:
[root @ master YAML]# ku bectl apply-f NFS-PV . YAML
持久卷/nfs-pv已创建
字段说明:
容量:指定pv的容量。目前,容量仅支持空间设置,IOPS和吞吐量应在未来指定。
访问模式:访问模式,有以下几种模式:
ReadWriteOnce:以读写方式挂载到单个节点,在命令行中缩写为RWO。
ReadOnlyMany:以只读方式挂载到多个节点,在命令行中缩写为ROX。
ReadWriteMany:以读写方式挂载到多个节点,命令行缩写为RWX。
persistentvolumereclain policy:PV空间释放时的回收策略,有以下策略:
回收:清除pv中的数据,然后自动回收。(自动回收策略受pvc的保护机制保护。删除pv后,只要pvc还在,数据就还在。)
保留:保持静止,由管理员手动收集。
删除:删除云存储资源,仅部分云存储系统支持,如AWS、EBS、GCE PD、Azure Disk、Cinder等。
注意:这里的回收策略是指删除pv后是否删除存储的源文件。
存储类名称:PV和pvc之间关联的基础。
//验证pv是否可用:
[root@master yaml]# kubectl get pv
名称容量访问模式回收策略状态声明存储类别原因年龄
Nfs-pv 1Gi(容量1GB) RWO(读写)Recycle(自动回收)可用(可用,确保在此状态下可以使用)Nfs(基于nfs) 18m(时间)。
3)创建一个pvc:
[root @ master YAML]# vim NFS-PVC . YAML
apiVersion: v1
kind: PersistentVolumeClaim
元数据:
名称:nfs-pvc
规格:
访问模式:
-ReadWriteOnce #pv和pvc必须具有相同的访问模式。
资源:#在此字段下的“请求”子字段中定义要申请的资源。
请求:
存储:1Gi
存储类名:nfs
运行pvc:
[root @ master YAML]# ku bectl apply-f NFS-PVC . YAML
persistentvolumeclaim/nfs-pvc已创建
//验证pvc是否可用:
[root@master yaml]# kubectl获取pvc
名称状态卷容量访问模式存储类别年龄
nfs-pvc绑定的nfs-pv 1Gi RWO nfs 3m53s
[root@master yaml]# kubectl get pv
名称容量访问模式回收策略状态声明存储类别原因年龄
nfs-pv 1Gi RWO回收范围默认值/nfs-pvc nfs 29m
确定此时pv和pvc的状态是绑定的,也就是绑定成功。
光伏空间的利用。
接下来,我们来练习mysql的pv使用:
1)创建一个Mysql pod:
[root @ master YAML]# vim MYSQL-pod . YAML
apiVersion:扩展/v1beta1
种类:部署
元数据:
名称:mysql
规格:
模板:
元数据:
标签:
应用程序:mysql
规格:
容器:
-名称:mysql
图片:mysql:5.7
Env: #定义一个变量,该变量将容器中的mysqlroot密码映射到本地。
-名称:MYSQL ROOT密码
值:123.com #密码是123.com。
端口:
-集装箱港口:3306
卷装载:#定义数据持久性
-名称:mysql-pv-storage
MountPath: /var/lib/mysql #这个目录是默认的mysql数据持久化目录。
卷:#卷字段是上述解释之一。
-name: mysql-pv-storage #注意名称要和上面一样。
PersistentVolumeClaim: #指定pvc。请注意,下面声明的pvc应该与之前创建的pvc同名。
声明名称:nfs-pvc
-
ApiVersion: v1 #创建一个服务资源对象。
种类:服务
元数据:
名称:mysql
规格:
类型:节点端口
端口:
-端口:3306
目标港口:3306
节点端口:30000
选择器:
应用程序:mysql
使用以下命令运行pod:
[root @ YAML大师]# ku bectl apply-f MySQL-pod。YAML
deployment.extensions/mysql创造了
服务/mysql已创建
//查看豆荚是否正常运行:
[root @ YAML大师]# ku bectl get pod-o wide MySQL-68d 65 B9 DD 9-hf2bf
命名就绪状态重新启动老化互联网协议(Internet Protocol)节点提名节点就绪门
mysql-68d65b9dd9-hf2bf 1/1运行0 9m34s 10.244.1.3节点01无无
2)登录关系型数据库数据库,进行写入数据:
[root @ YAML大师]# ku bectl exec-it MySQL-68d 65 B9 DD 9-hf2bf-MySQL-u root-p123。com
键入\\\ '帮助\ \ \ '或\\\'\\\\h\\\ '获取帮助。键入\\\'\\\\c\\\ '清除当前的输入语句。
关系型数据库
关系型数据库创建数据库卷_数据库#创建库
查询正常,1行受影响(0.01秒)
关系型数据库使用卷_数据库#进入库中
数据库已更改
关系型数据库创建表我的id( #创建表
- id int主键,
- name varchar(25)
- );
查询正常,0行受影响(0.04秒)
关系型数据库插入到我的id值(1,\\ '张三\ \ \ ');#往表中写入数据
查询正常,1行受影响(0.01秒)
mysql select * from my _ id#查看数据
- -
| id |姓名|
- -
| 1 |张三|张
- -
集合中的一行(0.00秒)
3)进行验证:
(1)手动删除豆荚,验证数据库内数据是否还会存在
[root@master ~]# kubectl删除pod mysql-68d65b9dd9-hf2bf
pod mysql-68d65b9dd9-hf2bf已删除
[root @ master ~]# ku bectl get pod-o wide
命名就绪状态重新启动老化互联网协议(Internet Protocol)节点提名节点就绪门
mysql-68d65b9dd9-bf9v8 1/1运行0 26s 10.244.1.4节点01无无
删除豆荚后,kubernetes会生成新的豆荚,我们登录关系型数据库查看
数据是否还会存在。
[root @ master ~]# ku bectl exec-it MySQL-68d 65 B9 DD 9-bf9v 8-MySQL-u root-p123。com
键入\\\ '帮助\ \ \ '或\\\'\\\\h\\\ '获取帮助。键入\\\'\\\\c\\\ '清除当前的输入语句。
MySQL select * from volumes _ db。我的id;
- -
| id |姓名|
- -
| 1 |张三|张
- -
集合中的一行(0.01秒)
可以看到数据依旧会存在。
2)模拟豆荚运行所在节点宕机,在新生成的豆荚内,数据是否恢复正常。
从上面查看豆荚的信息中,我们知道豆荚是运行在节点01上,所以我们将集群中的节点01主机关机。
##[root@node01 ~]# systemctl关机
过一段时间后,kubernetes会将豆荚迁移至集群中节点02主机上:
[root @ master ~]# ku bectl获取节点#得知节点01节点已经宕机
名称状态角色年龄版本
主机就绪主机39d v1.15.0
节点01未就绪无39d v1.15.0
节点02就绪无39d v1.15.0
[root @ master ~]# ku bectl get pod-o wide
命名就绪状态重新启动老化互联网协议(Internet Protocol)节点提名节点就绪门
mysql-68d65b9dd9-bf9v8 1/1终止0 15米节点0 1无无
mysql-68d65b9dd9-mvxdg 1/1运行0 83s 10 244 2 . 3节点02无
可以看到豆荚已经迁移到了节点02上。
最后我们登录mysql,验证数据是否恢复:
[root @ master ~]# ku bectl exec-it MySQL-68d 65 B9 DD 9-mvxdg-MySQL-u root-p123。com
键入\\\ '帮助\ \ \ '或\\\'\\\\h\\\ '获取帮助。键入\\\'\\\\c\\\ '清除当前的输入语句。
MySQL select * from volumes _ db。我的id;
- -
| id |姓名|
- -
| 1 |张三|张
- -
集合中的一行(0.09秒)
可以得知在豆荚迁移之后,mysql服务正常运行,且数据也并没有丢失。
页面浏览量(页面视图)和聚氯乙烯实现了关系型数据库数据的持久化,分离了管理员和普通用户的职责,更适合生产环境。
更多关于云服务器,域名注册,虚拟主机的问题,请访问西部数码代理商官网:www.chenqinet.cn