k8s部署mysql单节点服务(使用pv)

谁借莪1个温暖的怀抱¢ 2022-09-04 04:50 455阅读 0赞

1、搭建nfs存储
2、创建PV
3、创建PVC
4、确认pv及pvc的状态
5、创建pod+svc(service)
6、进入MySQL数据库,添加测试数据
7、手动删除节点上的容器,验证数据库内的数据是否还存在
创建nfs服务在node2节点,可以看之前的博客

  1. [root@node2 mysql]# cat /etc/exports
  2. /mnt/data 192.168.56.0/24(rw,no_root_squash)
  3. [root@node2 ~]# systemctl enable --now nfs
  4. Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
  5. [root@node2 ~]# showmount -e 192.168.56.102
  6. Export list for 192.168.56.102:
  7. /mnt/data 192.168.56.0/24
  8. [root@node2 ~]# mkdir /mnt/data
  9. apiVersion: v1
  10. kind: Service
  11. metadata:
  12. name: mysql
  13. spec:
  14. ports:
  15. - port: 3306
  16. selector:
  17. app: mysql
  18. clusterIP: None
  19. ---
  20. apiVersion: apps/v1
  21. kind: StatefulSet
  22. metadata:
  23. name: mysql
  24. spec:
  25. replicas: 1
  26. selector:
  27. matchLabels:
  28. app: mysql
  29. serviceName: "mysql"
  30. template:
  31. metadata:
  32. labels:
  33. app: mysql
  34. spec:
  35. containers:
  36. - image: mysql:5.6
  37. name: mysql
  38. env:
  39. - name: "MYSQL_ROOT_PASSWORD"
  40. value: "canxixi"
  41. ports:
  42. - containerPort: 3306
  43. name: mysql
  44. volumeMounts:
  45. - name: mysql-persistent-storage
  46. mountPath: /var/lib/mysql
  47. volumes:
  48. - name: mysql-persistent-storage
  49. persistentVolumeClaim:
  50. claimName: mysql-pv-claim

部署MySQL服务
首先,我们在端口3306上为MySQL数据库部署服务,所有Pod均具有标签键app: mysql。

在3306端口上创建带有MySQL5.6镜像和密码(使用secret)的Pod。我们还将附加一个持久卷mysql-pv-claim,将在接下来的步骤中进行显示。

二、创建持久卷

  1. apiVersion: v1
  2. kind: PersistentVolume
  3. metadata:
  4. name: mysql-pv-volume
  5. labels:
  6. type: local
  7. spec:
  8. storageClassName: manual
  9. capacity:
  10. storage: 20Gi
  11. accessModes:
  12. - ReadWriteOnce
  13. nfs:
  14. path: /mnt/data
  15. server: 192.168.56.102

创建一个持久卷,我们将使用它来附加到容器,以确保Pod重启时的数据安全。该持久卷具有ReadWriteOne访问模式,拥有20GB的存储空间,存放路径是主机102的/ mnt/data,我们所有的数据都将保存在该路径中。
Kubectl create -f persistence_volume.yaml

三、创建持久卷声明

  1. apiVersion: v1
  2. kind: PersistentVolumeClaim
  3. metadata:
  4. name: mysql-pv-claim
  5. spec:
  6. storageClassName: manual
  7. accessModes:
  8. - ReadWriteOnce
  9. resources:
  10. requests:
  11. storage: 20Gi

该声明从上面创建的“持久卷”中声明20GB,并具有与上面的“持久卷”相同的访问模式。

创建以下资源:

Kubectl create -f pvClaim.yaml

四、测试

  1. [root@node1 mysql]# kubectl get pv
  2. NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
  3. mysql-pv-volume 20Gi RWO Retain Bound default/mysql-pv-claim manual 16h
  4. [root@node1 mysql]# kubectl get pvc
  5. NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
  6. mysql-pv-claim Bound mysql-pv-volume 20Gi RWO manual 16h
  7. [root@node1 mysql]# kubectl get pod
  8. NAME READY STATUS RESTARTS AGE
  9. mysql-0 1/1 Running 0 16h
  10. [root@node1 mysql]# kubectl get pod -o wide
  11. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
  12. mysql-0 1/1 Running 0 16h 10.244.104.26 node2 <none> <none>

#

  1. [root@node1 mysql]# kubectl exec -it mysql-0 /bin/bash
  2. kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
  3. root@mysql-0:/# mysql -uroot -pcanxixi
  4. Warning: Using a password on the command line interface can be insecure.
  5. Welcome to the MySQL monitor. Commands end with ; or \g.
  6. Your MySQL connection id is 1
  7. Server version: 5.6.51 MySQL Community Server (GPL)

成功进入数据库

  1. mysql> create database test;
  2. mysql> use test;
  3. mysql> create table my_id(id int(4));
  4. mysql> insert my_id values(9527);
  5. mysql> select * from my_id;
  6. +------+
  7. | id |
  8. +------+
  9. | 1111 |
  10. +------+

手动删除节点上的容器,验证数据库内的数据是否还存在

  1. [root@node01 ~]# kubectl delete pod mysql-0 #将MySQL的容器删除
  2. #由于Deployment的保护策略,当删除容器后,它会根据pod的yaml文件生成一个新的容器,但新容器的ID号就变了
  3. #回到master节点,登录到数据库,查看数据是否还存在
  4. [root@master lv]# kubectl exec -it mysql-0 -- mysql -uroot -pcanxixi
  5. mysql> select * from test.my_id; #数据还在,OK
  6. +------+
  7. | id |
  8. +------+
  9. | 1111 |
  10. +------+
  11. 1 row in set (0.01 sec)

添加nodeport访问

  1. ---
  2. # 内部访问的无头服务
  3. apiVersion: v1
  4. kind: Service
  5. metadata:
  6. name: mysql-service
  7. spec:
  8. selector:
  9. app: mysql
  10. ports:
  11. - name: mysql
  12. port: 3306
  13. clusterIP: None
  14. ---
  15. # 外部访问的服务
  16. apiVersion: v1
  17. kind: Service
  18. metadata:
  19. name: mysql-external-service
  20. spec:
  21. selector:
  22. app: mysql
  23. ports:
  24. - name: mysql
  25. protocol: TCP
  26. port: 3306
  27. targetPort: 3306
  28. nodePort: 30001
  29. type: NodePort

client端访问MySQL数据库
ruguo我们在创建pod的yaml文件中,将其svc的端口映射类型是nodeport,所以,我们是可以通过访问群集内的任意主机的31111端口(yaml文件中自定义的端口)来登录到数据库的。如下:

  1. [root@master lv]# mysql -uroot -pcanxixi -h 192.168.x.x -P 30001 MySQL [(none)]> select * from test.my_id; #查看数据
  2. +------+ | id |
  3. +------+ | 1111 |
  4. +------+ 1 row in set (0.01 sec)

注意!引起statefulset创建pod是mysql,会进行初始化,所以每次删除pod后要在node2节点/mnt/data里面删除数据。不然重新创建pod以为已经初始化了会报错!!

在这里插入图片描述
如果初始化失败(报的是/var/lib/mysql的错),可能是电脑太久没关机了。带不起来。注意要及时关机。

发表评论

表情:
评论列表 (有 0 条评论,455人围观)

还没有评论,来说两句吧...

相关阅读

    相关 k8s-PV和PVC使用

    上节课我们学习了 PV 的使用,但是在我们真正使用的时候是使用的 PVC,就类似于我们的服务是通过 Pod 来运行的,而不是 Node,只是 Pod 跑在 Node 上而已,所