K8s之MySQL实现数据持久化
这个是一个只写配置及验证的博文:
实现过程:
1. 搭建nfs存储
2. 创建PV
3. 确认PVC
4. 确认PV与PVC的状态
5. 创建pod+svc (service)
6. 进入MySQL数据库,添加测试数据
7. 手动删除节点上的容器,验证数据库内的数据是否还在
8. 模拟MySQL容器所在的节点宕机,验证数据是否会丢失
9. clinet端访问MySQL数据库
k8s集群环境如下:
master: 192.168.33.157
node: 192.68.33.244
1、搭建nfs存储
master节点搭建nfs存储,node节点安装nfs服务
[root@master ~]# yum -y install nfs-utils rpcbind
[root@master ~]# systemctl start rpcbind && systemctl enable rpcbind && systemctl status rpcbind
[root@master lv]# mkdir -p /nfsdata/mysql
[root@master ~]# vim /etc/exports
/nfsdata *(rw,sync,no_root_squash)
[root@master ~]# systemctl start nfs-server && systemctl enable nfs-server && systemctl status nfs-server
[root@master ~]# showmount -e
Export list for master:
/nfsdata *
2、创建PV
[root@master lv]# vim mysql-pv.yaml #编写pv的yaml文件
kind: PersistentVolume
apiVersion: v1
metadata:
name: mysql-pv
spec:
accessModes:
- ReadWriteOnce #访问模式定义为只能以读写的方式挂载到单个节点
capacity:
storage: 1Gi
persistentVolumeReclaimPolicy: Retain
storageClassName: nfs
nfs:
path: /nfsdata/mysql
server: 192.168.20.6
[root@master lv]# kubectl apply -f mysql-pv.yaml #执行yaml文件
3、创建PVC
[root@master lv]# vim mysql-pvc.yaml #编写pvc的yaml文件
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: mysql-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: nfs #这里指定关联的PV名称
[root@master lv]# kubectl apply -f mysql-pvc.yaml #执行yaml文件
4、确认pv及pvc的状态
至此,PV和PVC的状态类应该都是Bound
[root@master lv]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
mysql-pv 1Gi RWO Retain Bound default/mysql-pvc nfs 5m8s
[root@master lv]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
mysql-pvc Bound mysql-pv 1Gi RWO nfs 60s
5、创建pod+svc (service)
这个pod是提供的MySQL服务,并将其映射到宿主机,可以做和clinet端通信。
[root@master lv]# vim mysql-pod.yaml #编写pod的yaml文件 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.7
env: #以下是设置MySQL数据库的密码
- name: MYSQL_ROOT_PASSWORD
value: 123.com
ports:
- containerPort: 3306
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql #MySQL容器的数据都是存在这个目录的,要对这个目录做数据持久化
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pvc #指定pvc的名称 --- #以下是创建svc的yaml文件
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
type: NodePort
ports:
- port: 3306
targetPort: 3306
nodePort: 31111
selector:
app: mysql
selector:
app: mysql
[root@master lv]# kubectl apply -f mysql-pod.yaml #执行yaml文件
[root@master lv]# kubectl get pod #确定pod运行正常
NAME READY STATUS RESTARTS AGE
mysql-6d898f8bcb-lhqxb 1/1 Running 0 51s
6、进入MySQL数据库,添加测试数据
[root@master lv]# kubectl exec -it mysql-6d898f8bcb-lhqxb -- mysql -uroot -p123.com
mysql> create database test;
mysql> use test;
mysql> create table my_id(id int(4));
mysql> insert my_id values(9527);
mysql> select * from my_id; #确认有数据存在
7、手动删除节点上的容器,验证数据库内的数据是否还存在
[root@master lv]# kubectl get pod -o wide #查看pod运行在哪个节点
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
mysql-6d898f8bcb-cz8gr 1/1 Running 0 10m 10.244.1.3 node01
#我这是运行在node01节点,现在去node01节点手动将其容器删除
[root@node01 ~]# docker ps #查看MySQL容器的ID
[root@node01 ~]# docker rm -f 1a524e001732 #将MySQL的容器删除
#由于Deployment的保护策略,当删除容器后,它会根据pod的yaml文件生成一个新的容器,但新容器的ID号就变了
#回到master节点,登录到数据库,查看数据是否还存在
[root@master lv]# kubectl exec -it mysql-6d898f8bcb-cz8gr -- mysql -uroot -p123.com
mysql> select * from test.my_id; #数据还在,OK
+------+
| id |
+------+
| 1996 |
+------+
1 row in set (0.01 sec)
至此,即可整明,当使用PV来做持久化的话,容器的新陈代谢并不会造成丢失数据的。
8、模拟MySQL容器所在的节点宕机,验证数据是否会丢失
[root@master lv]# kubectl get pod -o wide #查看容器所在节点,我这里还是在node01
#然后我这里将node01关机,然后动态查看pod的状态
[root@master lv]# kubectl get pod -o wide -w #动态查看pod的状态
#大概node01关机五分钟左右,可以看到pod就被转移到node02上运行了。
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mysql-6d898f8bcb-cz8gr 1/1 Running 0 20m 10.244.1.3 node01 <none> <none> mysql-6d898f8bcb-cz8gr 1/1 Running 0 20m 10.244.1.3 node01 <none> <none>
mysql-6d898f8bcb-cz8gr 1/1 Terminating 0 25m 10.244.1.3 node01 <none> <none>
mysql-6d898f8bcb-gp4t5 0/1 Pending 0 0s <none> <none> <none> <none>
mysql-6d898f8bcb-gp4t5 0/1 Pending 0 0s <none> node02 <none> <none>
mysql-6d898f8bcb-gp4t5 0/1 ContainerCreating 0 0s <none> node02 <none> <none>
mysql-6d898f8bcb-gp4t5 1/1 Running 0 1s 10.244.2.4 node02 <none> <none>
9、client端访问MySQL数据库
因为我们在创建pod的yaml文件中,将其svc的端口映射类型是nodeport,所以,我们是可以通过访问集群内的任意主机的31111端口(yaml文件中自定义的端口)来登陆到数据库。
[root@master lv]# mysql -uroot -p123.com -h 192.168.33.244 -P 31111
MySQL [(none)]> select * from test.my_id; #查看数据
+------+
| id |
+------+
| 1996 |
+------+
1 row in set (0.01 sec
K8s之MySQL实现数据持久化的更多相关文章
- seata服务端和客户端配置(使用nacos进行注册发现,使用mysql进行数据持久化),以及过程中可能会出现的问题与解决方案
seata服务端和客户端配置(使用nacos进行注册发现,使用mysql进行数据持久化),以及过程中可能会出现的问题与解决方案 说明: 之所以只用nacos进行了注册与发现,因为seata使用naco ...
- dcoker 安装mysql和数据持久化
# mysql 镜像下载 docker pull mysql ( 版本自己选择) # run 服务 docker run --name mysql.5.5 -p 3306:3306 -e MYSQ ...
- 『现学现忘』Docker基础 — 31、实现MySQL同步数据
目录 1.搜索镜像 2.拉取镜像 3.查看镜像 4.启动镜像 5.操作容器 (1)在MySQL中创建数据库 (2)外部连接Dokcer容器中的MySQL服务 (3)查看挂载情况 (4)测试MySQL服 ...
- Docker | 数据持久化与数据共享
数据持久化(安装MySQL) 参考另一篇Docker安装mysql: https://www.cnblogs.com/all-smile/p/16778376.html MySQL的数据持久化问题 # ...
- k8s部署mysql数据持久化
在这里我部署mysql的目的是为了后面将上一篇博客docker打包的el-admin镜像部署到k8s上,所以本文主要是部署mysql并实现持久化. 1.将我们的应用都部署到 el-admin 这个命名 ...
- Named Volume 在 MySQL 数据持久化上的基本应用
原文作者:春哥 初识春哥时,春哥是美术设计大咖.后不久,创业并致力于游戏开发,已有3年.从Unity3D到IOS(Swift)开发,从前端开发到后端以及容器技术,从设计开发测试到产品经理以及CEO,已 ...
- docker mysql 数据持久化到本地、设置不区别表名大小写-清风柳絮-51CTO博客
原文:docker mysql 数据持久化到本地.设置不区别表名大小写-清风柳絮-51CTO博客 Docker MySQL 把数据存储在本地目录,很简单,只需要映射本地目录到容器即可 1.加上-v参数 ...
- Docker数据持久化及实战(Nginx+Spring Boot项目+MySQL)
Docker数据持久化: Volume: (1)创建mysql数据库的container docker run -d --name mysql01 -e MYSQL_ROOT_PASSWORD= my ...
- docker中MySQL镜像数据,日志,配置持久化
Docker的MySQL8镜像, 实行数据持久化 version: '3.1' services: mysql-itoken-service-admin: restart: always image: ...
- K8S系列第九篇(持久化存储,emptyDir、hostPath、PV/PVC)
更多k8s内容,请关注威信公众好:新猿技术生态圈 一.数据持久化 Pod是由容器组成的,而容器宕机或停止之后,数据就随之丢了,那么这也就意味着我们在做Kubernetes集群的时候就不得不考虑存储的问 ...
随机推荐
- Python + unittest + ddt + HTMLTestRunner + log + excel + mysql + 企业微信通知, 接口自动化框架V2.0,支持多业务处理,仅需维护 excel 用例,无需要编写代码
Python + unittest + ddt + HTMLTestRunner + log + excel + mysql + 企业微信通知 + Jenkins 实现的接口自动化框架. 项目介绍 接 ...
- 【git】基于JGit通过ssh-url拉取指定commit-id的代码
实现 1️⃣ pom依赖: <dependency> <groupId>org.eclipse.jgit</groupId> <artifactId>o ...
- modulemap的使用方法
modulemap的作用 modulemap 文件是用来解决 C,Object-C,C++ 代码在 Swift 项目中集成的问题的. 在 Swift 项目中,如果需要使用 C,Object-C 或 ...
- [SCOI2005] 栅栏【题解】
简要题意 木材店老板给出一个整数 \(m\) 和 \(m\) 个木板的长度.老板给出的木板可以随意无损耗切割. 约翰给出一个整数 \(n\) 和所需要的 \(n\) 个木板的长度. 求约翰能得到最多木 ...
- PerfView 洞察C#托管堆内存 "黑洞现象"
一:背景 1. 讲故事 首先声明的是这个 黑洞 是我定义的术语,它是用来表示 内存吞噬 的一种现象,何为 内存吞噬,我们来看一张图. 从上面的 卦象图 来看,GCHeap 的 Allocated=85 ...
- AI识别检验报告 -PaddleNLP UIE-X 在医疗领域的实战
目录 UIE-X在医疗领域的实战 1.项目背景 2.案例简介 3.环境准备 数据转换 5.模型微调 6.模型评估 7.Taskflow一键部署 UIE-X在医疗领域的实战 PaddleNLP全新发布U ...
- 深入Scikit-learn:掌握Python最强大的机器学习库
本篇博客详细介绍了Python机器学习库Scikit-learn的使用方法和主要特性.内容涵盖了如何安装和配置Scikit-learn,Scikit-learn的主要特性,如何进行数据预处理,如何使用 ...
- SQLServer 数据库 Money 和 Float 类型运算的奇怪显现
SQLServer 数据库 Money和 Float类型运算的奇怪显现 1.1 背景 1.2 场景描述 1.3 原因及解决办法 1.1 背景 最近在做一个优化的项目 1.2 场景描述 DECLARE ...
- ubuntu 安装sublime
Install the GPG key: wget -qO - https://download.sublimetext.com/sublimehq-pub.gpg | sudo apt-key ad ...
- 青少年CTF平台-Web-PingME
题目描述 题目难度一颗星,五十分. 解题记录 进入题目中,发现这是一个ping功能 我们用连字符||进行分割两个语句,保证同时运行且输出. Payload为127.0.0.1 || ls 发现有fla ...