6.持久化存储
pv: persistent volume 全局的资源 pv,node
pvc: persistent volume claim 局部的资源(namespace)pod,rc,svc
6.1:安装nfs服务端(192.168.111.11)
yum install nfs-utils.x86_64 -y
mkdir /data
vim /etc/exports
/data 192.168.111.0/24(rw,async,no_root_squash,no_all_squash)
systemctl start rpcbind
systemctl start nfs
6.2:在node节点安装nfs客户端
yum install nfs-utils.x86_64 -y
showmount -e 192.168.111.11
6.3:创建pv和pvc
上传yaml配置文件,创建pv
vi mysql_pv.yaml
aapiVersion: v1
kind: PersistentVolume
metadata:
name: tomcat-mysql
labels:
type: nfs001
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Recycle
nfs:
path: "/data/tomcat-mysql"
server: 192.168.111.11
readOnly: false
创建pvc
vi mysql_pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: tomcat-mysql
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
6.4:创建mysql-rc,pod模板里使用volume
#vim mysql-rc.yml
apiVersion: v1
kind: ReplicationController
metadata:
name: mysql
spec:
replicas: 1
selector:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: 192.168.111.11:5000/mysql:5.7
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: '123456'
volumeMounts: #容器里挂载的数据库目录
- name: mysql
mountPath: /var/lib/mysql
volumes: #宿主机的挂载目录
- name: mysql
persistentVolumeClaim:
claimName: tomcat-mysql
前提要在/data目下创建一个目录/tomcat-mysql,根据上面的rc进行创建,要不然无法进行挂载;
mkdir /data/tomcat-mysql/
6.5: 验证持久化
验证方法1:删除mysql的pod,数据库不丢
kubectl delete pod mysql-2wqlb
验证方法2:查看nfs服务端,是否有mysql的数据文件
6.6: 分布式存储glusterfs
主机名 | ip地址 | 环境 |
---|---|---|
glusterfs01 | 192.168.111.14 | centos7.6,内存512M,增加两块硬盘10G,host解析 |
glusterfs02 | 192.168.111.15 | centos7.6,内存512M,增加两块硬盘10G,host解析 |
glusterfs03 | 192.168.111.16 | centos7.6,内存512M,增加两块硬盘10G,host解析 |
- a: 什么是glusterfs
Glusterfs是一个开源分布式文件系统,具有强大的横向扩展能力,可支持数PB存储容量和数千客户端,通过网络互联成一个并行的网络文件系统。具有可扩展性、高性能、高可用性等特点。 - b: 安装glusterfs
#所有节点:
yum install centos-release-gluster -y
yum install install glusterfs-server -y
systemctl start glusterd.service
systemctl enable glusterd.service
mkdir -p /gfs/test1
mkdir -p /gfs/test2
将所有主机添加得两块盘进行挂载
fdisk -l可以看到/sdc和sdb两块盘
将两块盘格式化
mkfs.xfs /dev/sdb
mkfs.xfs /dev/sdc
blkid查看两块盘得uuid
将uuid信息添加配置文件/etc/fstab
进行磁盘挂载mount -a
- c: 添加存储资源池
#master节点:
gluster pool list
gluster peer probe glusterfs01
gluster peer probe glusterfs02
gluster pool list
#解释:
#pool:资源池
#peer:节点
#volume: 卷(被外界挂载的,只有卷处于start状态,才可以被挂载;分布式复制卷)
#brick: 存储单元(一个存储单元就是一块硬盘)
查看添加gluster节点
- d: glusterfs卷管理
在gluster01节点上操作
创建分布式复制卷
gluster volume create quyunlong replica 2 glusterfs01:/gfs/test1 glusterfs01:/gfs/test2 glusterfs02:/gfs/test1 glusterfs02:/gfs/test2 force
#创建2个复制卷,至少2个,一般都是创建3个复制卷,就是当前状态写入数据的时候会写入两份;如果要是三台主机:则允许一台主机坏掉,数据还是完成;写入数据时会尽可能均匀分布;
启动卷
gluster volume start quyunlong
查看卷
gluster volume info quyunlong
在gluster03节点上操作
挂载卷
mount -t glusterfs 192.168.111.14:/quyunlong /mnt
由于是复制卷,所以减少一般的空间,即20G
测试一下,是否真的会复制两份文件;随便在03上将etc下的文件复制到mnt路径下
在01的节点上查找文件,发现存在两个文件
将glusterfs03添加到glusterfs01的分布式复制卷中
gluster volume add-brick quyunlong glusterfs03:/gfs/test1 glusterfs03:/gfs/test2 force
在查看/gfs/test1目录不存在文件
在glusterfs01上重新调度一下即可
gluster volume rebalance quyunlong start
在查看glusterfs03上已经存在文件了
-
e: 分布式复制卷讲解
-
f: 分布式复制卷扩容
扩容前查看容量:
df -h
扩容命令:
gluster volume add-brick quyunlong glusterfs03:/gfs/test1 glusterfs03:/gfs/test2 force
扩容后查看容量:
df -h
6.7 k8s 对接glusterfs存储
注意:1.所有节点都要做host解析 2.node节点需要安装gluster客户端
- a:创建endpoint
vi glusterfs-Endpoints.yaml
aapiVersion: v1
kind: Endpoints
metadata:
name: glusterfs #ep和svc是通过名字关联
namespace: default
subsets:
- addresses:
- ip: 192.168.111.14
- ip: 192.168.111.15
- ip: 192.168.111.16
ports:
- port: 49152
protocol: TCP
- b: 创建service
vi glusterfs-svc.yaml
aapiVersion: v1
kind: Service
metadata:
name: glusterfs #ep和svc是通过名字关联
namespace: default
spec:
ports:
- port: 49152
protocol: TCP
targetPort: 49152 #目标端口,客户端节点的端口
sessionAffinity: None
type: ClusterIP
查看状态,创建成功,并且已经关联
- c: 创建gluster类型pv,就是卷进行挂载
vi gluster_pv.yaml
aapiVersion: v1
kind: PersistentVolume
metadata:
name: gluster
labels:
type: glusterfs
spec:
capacity:
storage: 50Gi
accessModes:
- ReadWriteMany
glusterfs:
endpoints: "glusterfs"
path: "quyunlong"
readOnly: false
- d: 创建pvc
注意:如果要是不知道怎么去编辑yml配置文件则可以使用命令去查看帮助写
kubectl explain pvc.spec.selector.matchLabels
explain:表示解释
pvc:表示对应的什么文件,如:pv、pvc、rs、rc、pod等等
vim gluster_pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: gluster
spec:
selector:
matchLabels:
type: glusterfs
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
匹配上的pv和pvc
- e:在pod中使用gluster
创建mysql-rc.yml
vim mysql-rc.yml
apiVersion: v1
kind: ReplicationController
metadata:
name: mysql
spec:
replicas: 1
selector:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
volumes: #宿主机的挂载目录,设置了gluster
- name: mysql
persistentVolumeClaim:
claimName: gluster
containers:
- name: mysql
image: 192.168.111.11:5000/mysql:5.7
volumeMounts: #容器的挂载目录
- name: mysql
mountPath: /var/lib/mysql
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: '123456'
创建mysql_svc.yml
vim mysql-svc.yml
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
targetPort: 3306
selector:
app: mysql
创建tomcat_rc.yml文件
vim tomcat-rc.yml
apiVersion: v1
kind: ReplicationController
metadata:
name: myweb
spec:
replicas: 1
selector:
app: myweb
template:
metadata:
labels:
app: myweb
spec:
containers:
- name: myweb
image: 192.168.111.11:5000/tomcat-app:v2
ports:
- containerPort: 8080
env:
- name: MYSQL_SERVICE_HOST
value: 'mysql'
- name: MYSQL_SERVICE_PORT
value: '3306'
创建tomcat_svc.yml文件
vim tomcat-svc.yml
apiVersion: v1
kind: Service
metadata:
name: myweb
spec:
type: NodePort
ports:
- port: 8080
nodePort: 30008
selector:
app: myweb
查看状态创建成功
浏览器访问正常http://192.168.111.13:30008/
查看glusterfs03数据库存储文件已经存在挂载目录/mnt
查看其他glusterfs02节点已经是存储了两份数据