MySQL的持久化部署(k8s与NFS)

血红的双手。 提交于 2020-02-16 01:29:11

Mysql部署

关于持久化部署mysql数据库

mysql数据库如果简单地部署在k8s集群上,当pods重启时,数据可能会造成丢失,经过查找资料,发现通过PV和PVC可以进行一个持久化的部署。

PV、PVC

  • PersistentVolume(持久卷) 和 PersistentVolumeClaim(持久卷申请)

  • PersistentVolume (PV) 是外部存储系统中的一块存储空间,由管理员创建和维护。与 Volume 一样,PV 具有持久性,生命周期独立于 Pod。

  • PersistentVolumeClaim (PVC) 是对 PV 的申请 (Claim)。PVC 通常由普通用户创建和维护。需要为 Pod 分配存储资源时,用户可以创建一个 PVC,指明存储资源的容量大小和访问模式(比如只读)等信息,Kubernetes 会查找并提供满足条件的 PV

1.什么是持久化?

本人找了好多文章都没有找到满意的答案,最后是从孙卫琴写的《精通Hibernate:Java对象持久化技术详解》中,看到如下的解释,感觉还是比较完整的。摘抄如下:

狭义的理解: “持久化”仅仅指把域对象永久保存到数据库中;广义的理解,“持久化”包括和数据库相关的各种操作。

●     保存:把域对象永久保存到数据库。

●     更新:更新数据库中域对象的状态。

●     删除:从数据库中删除一个域对象。

●     加载:根据特定的OID,把一个域对象从数据库加载到内存。

●     查询:根据特定的查询条件,把符合查询条件的一个或多个域对象从数据库加载内在存中。

2.为什么要持久化?

持久化技术封装了数据访问细节,为大部分业务逻辑提供面向对象的API。

● 通过持久化技术可以减少访问数据库数据次数,增加应用程序执行速度;

● 代码重用性高,能够完成大部分数据库操作;

● 松散耦合,使持久化不依赖于底层数据库和上层业务逻辑实现,更换数据库时只需修改配置文件而不用修改代码。
原文链接:https://blog.csdn.net/sunyadongwanghbjm/article/details/1765073

考虑采用NFS结合PV PVC实现持久化存储

配置nfs

k8s-master nfs-server

k8s-node1 k8s-node2 nfs-client

所有节点安装nfs

yum install -y nfs-common nfs-utils 

在master节点创建共享目录

[root@k8s-master k8s]# mkdir nfsdata

授权共享目录

[root@k8s-master k8s]# chmod 666 nfsdata

编辑exports文件

[root@k8s-master k8s]# vi /etc/exports

输入如下内容

/root/k8s/nfsdata *(rw,no_root_squash,no_all_squash,sync)

启动rpc和nfs(注意顺序)

[root@k8s-master k8s]# systemctl start rpcbind
[root@k8s-master k8s]# systemctl start nfs

查看 某个节点上的 NFS服务器

showmount -e

创建PV

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv
spec:
  accessModes:
    - ReadWriteOnce     #指定访问模式
  capacity:
    storage: 1Gi    #存储容量 1G
  persistentVolumeReclaimPolicy: Retain   #回收策略 Retain 管理员手工回收 Recycle  
  #清除 PV 的数据  Delete  删除Storage Provider上的对应存储资源
  storageClassName: nfs   #指定PV 的class为nfs
  nfs:
    path: /root/k8s/nfsdata/mysql    #PV在 NFS服务器上对应的目录
    server: 172.31.164.123      #要连接的主机地址

创建后执行即可

kubectl apply -f mysql-pv.yml

创建 PVC

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: mysql-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: nfs

创建后执行即可

kubectl apply -f mysql-pvc.yml

部署 Mysql

这里 mysql的service采用NodePort方式部署,外部可以访问

apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  type: NodePort
  ports:
  - protocol: TCP
    nodePort: 30306
    port: 3306
    targetPort: 3306
  selector:
    app: mysql
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - image: mysql:5.6
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: password
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql       #挂载目录
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pvc

创建后执行即可

kubectl apply -f mysql.yml

在主节点进入mysql数据库命令如下 10.1.70.69是mysql的服务在集群中的内部IP地址

kubectl run -it --rm --image=mysql:5.6 --restart=Never mysql-client -- mysql -h 10.1.70.69 -ppassword

此时的mysql 数据库部署在 node2节点上,外部连接时,地址为 {node2节点IP}:30306 数据库密码为 password

删除 mysql pv pvc

要删除 mysql的pod,首先要删除其deployment,然后再删除pod
要删除pv,首先要删除其pod,然后删除pvc,最后删除pv

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!