文章目录

  • 前言
  • 一、准备工作
    • 环境搭建
    • 编写yaml文件
      • 1.创建PV
      • 2.创建PVC
      • 3.创建mysql-pod
      • 4.创建SVC
    • 使用Navicat测试连接
    • 测试数据是否会丢失
      • 1.手动删除节点上的容器
      • 2.模拟宕机
    • 问题总结

前言

一、准备工作

环境搭建

  1. 集群环境:如果没有请参考文章使用kubeadm快速部署一个K8s集群
  2. nfs工具安装:在master和node节点中都安装nfs,并且启动
# 在mater中执行
[root@ecs-431f-0001 /]# yum -y install nfs-utils
[root@ecs-431f-0001 /]# systemctl enable rpcbind 启动rpc设置开机自启动
[root@ecs-431f-0001 /]# systemctl start nfs-server 启动nfs-server
[root@ecs-431f-0001 /]# systemctl enable nfs-server 设置开机自启动
# 在node节点192.168.0.109上执行,用于进行挂载mysql的数据
[root@ecs-431f-0002 /]# yum -y install nfs-utils
[root@ecs-431f-0002 /]# mkdir -p /nfsdata/mysql
[root@ecs-431f-0002 /]# echo “/nfsdata *(rw,sync,no_root_squash)“ >> /etc/exports
[root@ecs-431f-0002 /]# systemctl enable rpcbind 启动rpc设置开机自启动
[root@ecs-431f-0002 /]# systemctl start nfs-server 启动nfs-server
[root@ecs-431f-0002 /]# systemctl enable nfs-server 设置开机自启动
[root@ecs-431f-0002 /]# showmount -e 192.168.0.109
Export list for 192.168.0.109:
/nfsdata *

注:*表示内网所有机器都可访问并挂载目录,这里最好添加白名单限制,仅对K8S集群内节点开放

# 打开配置文件
vim /etc/exports# 未设置权限
/data/nfs *(rw,no_root_squash)# 添加挂载IP限制
/data/nfs 192.168.0.109/24(rw,async,no_root_squash)
  • 使挂载配置生效并验证
# 重新挂载并显示(无需重启服务)
exportfs -rv# 本机查看挂载情况
showmount -e# 在其它节点查看挂载情况
showmount -e 192.168.0.109
  • 验证nfs是否成功

1、在master中新建一个测试文件夹 mkdir /test,执行下面的命令

[root@ecs-431f-0001 /]# mount -t nfs 192.168.0.109:/nginxvolume /test
mount.nfs: mounting 192.168.0.109:/nginxvolume failed, reason given by server: No such file or directory

出现上面的错误,说明挂载没有成功,最好的方法就是重新启动一下。如下操作。

2、如果修改完配置文件之后需要重新启动一下nfcrpcbind

[root@ecs-431f-0002 nginxvolume]# sudo service nfs-server restart
Redirecting to /bin/systemctl restart nfs-server.service
[root@ecs-431f-0002 nginxvolume]# showmount -e 192.168.0.109
Export list for 192.168.0.109:
/nginxvolume *
/nfsdata     *

3、 重复1的操作,并在master机器中写入一个文件测试,在nfs的服务器镜进行查看。


说明nfs测试成功。
4、使用命令umount /test解除master的nfs挂载。但是会遇到一些问题umount.nfs4: /test: device is busy
通过fuser命令进行查看

[root@localhost /]# fuser -m -v /test/用户     进程号 权限   命令
[root@ecs-431f-0001 ~]# fuser -m -v /test/USER        PID ACCESS COMMAND
/test:               root     kernel mount /testroot       2996 ..c.. su
-v 表示 verbose 模式。进程以 ps 的方式显示,包括 PID、USER、COMMAND、ACCESS 字段-m 表示指定文件所在的文件系统或者块设备(处于 mount 状态)。所有访问该文件系统的进程都被列出。如上所示,有个进程占用了,将其kill掉,再重新取消挂载。[root@localhost /]# kill -9 2996
[root@localhost /]# umount /test/
[root@localhost /]#

这样卸载的方式有可能不能接触挂载,可以使用umont -l /test 直接取消挂载。

编写yaml文件

1.创建PV

vim mysql-pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:name: mypv1
spec:capacity:storage: 5GiaccessModes:- ReadWriteManypersistentVolumeReclaimPolicy: Retain   # 手动删除 storageClassName: nfsnfs:path: /nfsdata/mysqlserver: 192.168.0.109 #

2.创建PVC

vim mysql-pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: mypvc1
spec:accessModes:- ReadWriteManyresources:requests:storage: 4GistorageClassName: nfs

查看pv和pvc的状态

[root@ecs-431f-0001 config]# kubectl get pv,pvc
NAME                     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM            STORAGECLASS   REASON   AGE
persistentvolume/mypv1   5Gi        RWX            Recycle          Bound    default/mypvc1   nfs                     52mNAME                           STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/mypvc1   Bound    mypv1    5Gi        RWX            nfs            51m

3.创建mysql-pod

vim mysql-deploy.yaml

apiVersion: apps/v1
kind: Deployment
metadata:name: mysql
spec:selector:matchLabels:app: mysqltemplate:metadata:labels:app: mysqlspec:containers:- name: mysqlimage: mysql:5.7env:           #配置变量,设置mysql的密码- name: MYSQL_ROOT_PASSWORDvalue: rootports:- containerPort: 3306volumeMounts:- name: mysql-persistent-storagemountPath: /var/lib/mysql                 #MySQL容器的数据都是存在这个目录的,要对这个目录做数据持久化volumes:- name: mysql-persistent-storagepersistentVolumeClaim:claimName: mypvc1           #指定pvc名称

4.创建SVC

apiVersion: v1
kind: Service
metadata:name: mysql
spec:selector:app: mysqltype: NodePortports:- port: 3306targetPort: 3306nodePort: 31921
[root@ecs-431f-0001 config]# kubectl get deployment
NAME                READY   UP-TO-DATE   AVAILABLE   AGE
mysql               1/1     1            1           52m
tomcat-deployment   2/2     2            2           11d
[root@ecs-431f-0001 config]# kubectl get  svc
NAME                    TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
kubernetes              ClusterIP   10.96.0.1        <none>        443/TCP          26d
mysql                   NodePort    10.96.177.243    <none>        3306:31921/TCP   3h3m
NAME                                 READY   STATUS    RESTARTS   AGE
mysql-774dc9f4d7-tc7bz               1/1     Running   0          53m

使用Navicat测试连接


创建数据库

在Linux中查看有无创建的数据库


数据已经同步

测试数据是否会丢失

1.手动删除节点上的容器

[root@ecs-431f-0001 ]# kubectl get pod -o wide 查看运行的节点
NAME                                 READY   STATUS    RESTARTS   AGE    IP            NODE            NOMINATED NODE   READINESS GATES
mysql-774dc9f4d7-tc7bz               1/1     Running   0          64m    10.244.2.9    ecs-431f-0002   <none>           <none>
[root@ecs-431f-0001]# kubectl get pod -o wide          #查看pod运行在哪个节点
NAME                                 READY   STATUS    RESTARTS   AGE    IP            NODE            NOMINATED NODE   READINESS GATES
mysql-774dc9f4d7-tc7bz               1/1     Running   0          64m    10.244.2.9    ecs-431f-0002   <none>           <none>
#运行在node1节点,现在去node01节点手动将其容器删除
[root@ecs-431f-0002]# docker ps       #查看MySQL容器的ID
[root@ecs-431f-0002]# docker rm -f 54db3e8727f0 #将MySQL的容器删除
#由于Deployment的保护策略,当删除容器后,它会根据pod的yaml文件生成一个新的容器,但新容器的ID号就变了
#回到master节点,登录到数据库,查看数据是否还存在
[root@ecs-431f-0001 config]# kubectl exec mysql-774dc9f4d7-tc7bz -it -- mysql -uroot -proot
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| tenant             |
+--------------------+
5 rows in set (0.00 sec)

2.模拟宕机

问题总结

因为pvc和pv实现的持久化存储是不可逆的,如果不小心删除了pv,此时pv还会有保护机制,就是一直处于Terminaling的状态,直到你把他所关联的pod也删除,该pv才会消失,但是也会遇到删除pod,但是pv一直删除不了的情况,这样我们可以强制给他删除。
只需要执行命令:xxx pv的名称

kubectl patch pv xxx -p '{"metadata":{"finalizers":null}}'

mysql在k8s集群中的搭建并且实现持久化存储相关推荐

  1. rancher2.x设置邮件通知,使用163邮箱来接收k8s集群中的报警信息以及来自rancher的通知信息

    之前搭建了几个k8s集群然后使用了rancher来管理多个k8s集群,之前选择使用rancher主要是考虑从rancher应用商店中安装部署各种服务比较方便.但是,在我部署安装efk服务的时候(我自己 ...

  2. 终于解决 k8s 集群中部署 nodelocaldns 的问题

    终于解决 k8s 集群中部署 nodelocaldns 的问题 参考文章: (1)终于解决 k8s 集群中部署 nodelocaldns 的问题 (2)https://www.cnblogs.com/ ...

  3. K8S集群中Pod挂载Storageclass存储卷异常排查思路

    K8S集群中Pod挂载Storageclass存储卷异常排查思路 故障描述: Jenkins是在K8S集群中部署的,Jenkins使用的各种资源以及全部创建了,但是Jenkins的Pod依旧无法启动, ...

  4. K8S集群中Pod资源处于CrashLoopBackOff状态排查思路

    K8S集群中Pod资源处于CrashLoopBackOff状态排查思路 文章目录 K8S集群中Pod资源处于CrashLoopBackOff状态排查思路 1.Pod资源处于CrashLoopBackO ...

  5. K8S集群中Pod与Pod之间网络故障排查思路

    K8S集群中Pod与Pod之间网络故障排查思路 文章目录 K8S集群中Pod与Pod之间网络故障排查思路 1.Pod与Pod之间通信故障 2.Pod与Pod之间网络通信故障排查思路 1.Pod与Pod ...

  6. K8S集群中Pod资源常见的异常状态以及排查思路

    K8S集群中Pod资源常见的异常状态以及排查思路 1.Pod资源的结构 Pod资源中会有一个基础容器Pause容器,每一个Pod资源下都会有一个Pause容器,Pause容器负责创建一个虚拟网络和存储 ...

  7. K8S集群中Pod资源数据丢包排查思路

    K8S集群中Pod资源数据丢包排查思路 Pod资源可能会由于网络原因产生丢包的现象. 当Pod资源存在丢包的现象时,会出现下面的报错: Connect to 100.111.156.74 port 5 ...

  8. K8S集群中Pod资源处于Terminating或Unknown状态排查思路

    K8S集群中Pod资源处于Terminating或Unknown状态排查思路 文章目录 K8S集群中Pod资源处于Terminating或Unknown状态排查思路 1.Pod资源处于Terminat ...

  9. K8S集群中Node节点资源不足导致Pod无法运行的故障排查思路

    K8S集群中Node节点资源不足导致Pod无法运行的故障排查思路 文章目录 K8S集群中Node节点资源不足导致Pod无法运行的故障排查思路 1.Node节点资源不足可能会产生的故障 2.Node节点 ...

最新文章

  1. 使用c++filt查看trafficserver堆栈调用信息
  2. 收集服务器配置资源信息
  3. qlikview连接mysql_QlikView通过ODBC连接IBMDB2
  4. 阿里云峰会 | AI搜题加速在线教育行业场景创新
  5. Java学习小程序(2)输出三个数中的最大值
  6. windows无法安装到这个磁盘。选中的磁盘采用GPT分区形式
  7. CSS 实现必填项前/后添加红色星号
  8. rabbitmq添加user及vhost
  9. 微软面试4、在二元树中找出和为某一值的所有路径
  10. 分类算法学习(一)——KNN算法的原理及简单实现
  11. android报警声音
  12. 毕业论文 - 写作问题总结 和 tips
  13. 金融反欺诈的底层逻辑
  14. PHP开发基础(一)
  15. python绘制线段_使用matplotlib绘制线段线
  16. 图标(Icon)和图标按钮(IconButton)
  17. DPU网络开发SDK——DPDK(二)
  18. L1 批判思维 - 独立思考- 破除思维误区 1.1为什么我们很难独立思考
  19. 2020年腾讯实习生算法笔试题目(感触良多)
  20. 如果有天我们变陌生了,那么我就重新认识你(晚安心语)

热门文章

  1. 全世界都被拍扁!你应如何理性对待扁平化设计
  2. 制造业数字化转型的五大法则!
  3. Valgrind:Memcheck参数详解
  4. qPCR技术发展史及最新进展
  5. FJNU2018低程A 逃跑路线(Lucas + 中国剩余定理 + LGV定理)题解
  6. 循环赛日程表(非递归)
  7. [附源码]Java计算机毕业设计SSM蛋糕店会员系统
  8. word表格跨页空白去除,表格联系
  9. 微型计算机系统配置记录表,微型计算机系统的结构与配置.doc
  10. 青春无敌 吴莫愁《诛仙3》花絮曝光