K8s之MySQL实现数据持久化

这个是一个只写配置及验证的博文。。。。。。

博文大纲:
1、搭建nfs存储
2、创建PV
3、创建PVC
4、确认pv及pvc的状态
5、创建pod+svc(service)
6、进入MySQL数据库,添加测试数据
7、手动删除节点上的容器,验证数据库内的数据是否还存在
8、模拟MySQL容器所在的节点宕机,验证数据是否会丢失
9、client端访问MySQL数据库

k8s集群环境如下:

  • master节点IP:192.168.20.6
  • node01节点IP:192.168.20.7
  • node02节点IP:192.168.20.8

k8s集群的搭建可以参考博文:K8s(Kubernetes)简介及安装部署

1、搭建nfs存储

为了方便操作,我直接在master上搭建nfs存储。

[[email protected] ~]# yum -y install nfs-utils
[[email protected] ~]# systemctl enable rpcbind
[[email protected] lv]# mkdir -p /nfsdata/mysql
[[email protected] ~]# vim /etc/exports
/nfsdata *(rw,sync,no_root_squash)
[[email protected] ~]# systemctl start nfs-server
[[email protected] ~]# systemctl enable nfs-server
[[email protected] ~]# showmount -e
Export list for master:
/nfsdata *

2、创建PV

[[email protected] 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
[[email protected] lv]# kubectl apply -f mysql-pv.yaml  #执行yaml文件

3、创建PVC

[[email protected] 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名称
[[email protected] lv]# kubectl apply -f mysql-pvc.yaml       #执行yaml文件

4、确认pv及pvc的状态

至此,PV和PVC的状态类应该都是Bound。

[[email protected] 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
[[email protected] 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服务,并将其映射到宿主机,可以做和client端通信。

这里我将pod和svc的yaml文件写在同一个文件中。

[[email protected] 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
[[email protected] lv]# kubectl apply -f mysql-pod.yaml     #执行yaml文件
[[email protected] lv]# kubectl get pod        #确定pod运行正常
NAME                     READY   STATUS    RESTARTS   AGE
mysql-6d898f8bcb-lhqxb   1/1     Running   0          51s

6、进入MySQL数据库,添加测试数据

[[email protected] 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、手动删除节点上的容器,验证数据库内的数据是否还存在

[[email protected] 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节点手动将其容器删除
[[email protected] ~]# docker ps       #查看MySQL容器的ID
[[email protected] ~]# docker rm -f 1a524e001732    #将MySQL的容器删除
#由于Deployment的保护策略,当删除容器后,它会根据pod的yaml文件生成一个新的容器,但新容器的ID号就变了
#回到master节点,登录到数据库,查看数据是否还存在
[[email protected] 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容器所在的节点宕机,验证数据是否会丢失

[[email protected] lv]# kubectl get pod -o wide   #查看容器所在节点,我这里还是在node01
#然后我这里将node01关机,然后动态查看pod的状态
[[email protected] 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文件中自定义的端口)来登录到数据库的。如下:

[[email protected] lv]# mysql -uroot -p123.com -h 192.168.20.8 -P 31111
MySQL [(none)]> select * from test.my_id;    #查看数据
+------+
| id   |
+------+
| 1996 |
+------+
1 row in set (0.01 sec)

———————— 本文至此结束,感谢阅读 ————————

原文地址:https://blog.51cto.com/14154700/2450932

时间: 2024-08-28 13:03:17

K8s之MySQL实现数据持久化的相关文章

dcoker 安装mysql和数据持久化

# mysql 镜像下载 docker pull mysql ( 版本自己选择) # run 服务 docker run --name mysql.5.5 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql -- name 容器名字 -p 端口映射 -e root 密码设置 -d 后台运行 # 可能遇到的问题 一.不能使用nivacate 连接问题 必须关闭防火墙 1.连接容器 docker exec -it 3d1a00bbf39e /bin

k8s数据持久化

k8s数据持久化 Docker容器是有生命周期的,因此数据卷可以实现数据持久化 数据卷主要解决的问题: 数据持久性:当我们写入数据时,文件都是暂时性的存在,当容器崩溃后,host就会将这个容器杀死,然后重新从镜像创建容器,数据就会丢失 数据共享:在同一个Pod中运行容器,会存在共享文件的需求 存储类(Storage class)是k8s资源类型的一种,它是有管理员为管理PV更加方便创建的一个逻辑组,可以按照存储系统的性能高低,或者综合服务质量,备份策略等分类.不过k8s本身不知道类别到底是什么,

k8s数据持久化之statefulset的数据持久化,并自动创建PV与PVC

一:Statefulset StatefulSet是为了解决有状态服务的问题,对应的Deployment和ReplicaSet是为了无状态服务而设计,其应用场景包括:1.稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现2.稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于Headless Service(即没有Cluster IP的Service)来实现3.有序部署,有序扩展,即Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依

docker mysql 数据持久化到本地、设置不区别表名大小写

Docker MySQL 把数据存储在本地目录,很简单,只需要映射本地目录到容器即可 1.加上-v参数 $ docker run -d -e MYSQL_ROOT_PASSWORD=admin --name mysql -v /data/mysql/data:/var/lib/mysql -p 3306:3306 mysql 还可以指定配置文件 docker run -d -e MYSQL_ROOT_PASSWORD=admin --name mysql -v /data/mysql/my.cn

k8s实践(七):存储卷和数据持久化(Volumes and Persistent Storage)

环境说明: 主机名 操作系统版本 ip docker version kubelet version 配置 备注 master Centos 7.6.1810 172.27.9.131 Docker 18.09.6 V1.14.2 2C2G master主机 node01 Centos 7.6.1810 172.27.9.135 Docker 18.09.6 V1.14.2 2C2G node节点 node02 Centos 7.6.1810 172.27.9.136 Docker 18.09.

K8s实现数据持久化

前言 在一切虚拟化解决方案中,数据的持久化都是需要我们非常关心的问题,docker如此,K8s也不例外.在k8s中,有一个数据卷的概念. k8s数据卷主要解决了以下两方面问题: 数据持久性:通常情况下,容器运行起来后,写入到其文件系统的文件时暂时性的.当容器崩溃后,kebelet将这个容器kill掉,然后生成一个新的容器,此时,新运行的容器将没有原来容器内的文件,因为容器是重新从镜像创建的. 数据共享:同一个pod中运行的容器之间,经常会存在共享文件/文件夹的需求. 在k8s中,Volume(数

K8s数据持久化之自动创建PV

在前两篇实现k8s的数据持久化的流程为:搭建nfs底层存储===>创建PV====>创建PVC===>创建pod.最终pod中的container实现数据的持久化. 上述流程中,看似没什么问题,但细想一下,PVC在向PV申请存储空间的时候,是根据指定的pv名称.访问模式.容量大小来决定具体向哪个PV来申请空间的,如果PV的容量为20G,定义的访问模式是WRO(只允许以读写的方式挂载到单个节点),而PVC申请的存储空间为10G,那么一旦这个PVC是向上面的PV申请的空间,也就是说,那个PV

k8s存储数据持久化,emptyDir,hostPath,基于Nfs服务的PV,PVC

在docker和K8S中都存在容器是有生命周期的,因此数据卷可以实现数据持久化. 数据卷解决的主要问题: 1.数据持久性:当我们写入数据时,文件都是暂时性的存在,当容器崩溃后,host就会将这个容器杀死,然后重新从镜像创建容器,数据就会丢失. 2.数据共享:在同一个Pod中运行容器,会存在共享文件的需求. 数据卷的类型: 1.emptyDiremptyDir数据卷类似于docker数据持久化的docker manager volume,该数据卷初分配时,是一个空目录,同一个Pod中的容器可以对该

k8s数据持久化之Secret

一.Secret资源对象:解决了密码.token.密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者Pod Spec中.Secret可以以Volume或者环境变量的方式使用.用来保存一些敏感信息,比如数据库的用户名密码或者密钥.Secret有三种类型:1.Service Account:用来访问Kubernetes API,由Kubernetes自动创建,并且会自动挂载到Pod的/run/secrets/kubernetes.io/serviceaccount目录中.2.Opaque