1、搭建nfs存储
2、创建PV
3、创建PVC
4、确认pv及pvc的状态
5、创建pod+svc(service)
6、进入MySQL数据库,添加测试数据
7、手动删除节点上的容器,验证数据库内的数据是否还存在
创建nfs服务在node2节点,可以看之前的博客
[root@node2 mysql]# cat /etc/exports
/mnt/data 192.168.56.0/24(rw,no_root_squash)
[root@node2 ~]# systemctl enable --now nfs
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
[root@node2 ~]# showmount -e 192.168.56.102
Export list for 192.168.56.102:
/mnt/data 192.168.56.0/24
[root@node2 ~]# mkdir /mnt/data
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
selector:
app: mysql
clusterIP: None
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
replicas: 1
selector:
matchLabels:
app: mysql
serviceName: "mysql"
template:
metadata:
labels:
app: mysql
spec:
containers:
- image: mysql:5.6
name: mysql
env:
- name: "MYSQL_ROOT_PASSWORD"
value: "canxixi"
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim
部署MySQL服务
首先,我们在端口3306上为MySQL数据库部署服务,所有Pod均具有标签键app: mysql。
在3306端口上创建带有MySQL5.6镜像和密码(使用secret)的Pod。我们还将附加一个持久卷mysql-pv-claim,将在接下来的步骤中进行显示。
二、创建持久卷
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv-volume
labels:
type: local
spec:
storageClassName: manual
capacity:
storage: 20Gi
accessModes:
- ReadWriteOnce
nfs:
path: /mnt/data
server: 192.168.56.102
创建一个持久卷,我们将使用它来附加到容器,以确保Pod重启时的数据安全。该持久卷具有ReadWriteOne访问模式,拥有20GB的存储空间,存放路径是主机102的/ mnt/data,我们所有的数据都将保存在该路径中。
Kubectl create -f persistence_volume.yaml
三、创建持久卷声明
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim
spec:
storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
该声明从上面创建的“持久卷”中声明20GB,并具有与上面的“持久卷”相同的访问模式。
创建以下资源:
Kubectl create -f pvClaim.yaml
四、测试
[root@node1 mysql]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
mysql-pv-volume 20Gi RWO Retain Bound default/mysql-pv-claim manual 16h
[root@node1 mysql]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
mysql-pv-claim Bound mysql-pv-volume 20Gi RWO manual 16h
[root@node1 mysql]# kubectl get pod
NAME READY STATUS RESTARTS AGE
mysql-0 1/1 Running 0 16h
[root@node1 mysql]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mysql-0 1/1 Running 0 16h 10.244.104.26 node2 <none> <none>
[root@node1 mysql]# kubectl exec -it mysql-0 /bin/bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@mysql-0:/# mysql -uroot -pcanxixi
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.51 MySQL Community Server (GPL)
成功进入数据库
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;
+------+
| id |
+------+
| 1111 |
+------+
手动删除节点上的容器,验证数据库内的数据是否还存在
[root@node01 ~]# kubectl delete pod mysql-0 #将MySQL的容器删除
#由于Deployment的保护策略,当删除容器后,它会根据pod的yaml文件生成一个新的容器,但新容器的ID号就变了
#回到master节点,登录到数据库,查看数据是否还存在
[root@master lv]# kubectl exec -it mysql-0 -- mysql -uroot -pcanxixi
mysql> select * from test.my_id; #数据还在,OK
+------+
| id |
+------+
| 1111 |
+------+
1 row in set (0.01 sec)
添加nodeport访问
---
# 内部访问的无头服务
apiVersion: v1
kind: Service
metadata:
name: mysql-service
spec:
selector:
app: mysql
ports:
- name: mysql
port: 3306
clusterIP: None
---
# 外部访问的服务
apiVersion: v1
kind: Service
metadata:
name: mysql-external-service
spec:
selector:
app: mysql
ports:
- name: mysql
protocol: TCP
port: 3306
targetPort: 3306
nodePort: 30001
type: NodePort
client端访问MySQL数据库
ruguo我们在创建pod的yaml文件中,将其svc的端口映射类型是nodeport,所以,我们是可以通过访问群集内的任意主机的31111端口(yaml文件中自定义的端口)来登录到数据库的。如下:
[root@master lv]# mysql -uroot -pcanxixi -h 192.168.x.x -P 30001 MySQL [(none)]> select * from test.my_id; #查看数据
+------+ | id |
+------+ | 1111 |
+------+ 1 row in set (0.01 sec)
注意!引起statefulset创建pod是mysql,会进行初始化,所以每次删除pod后要在node2节点/mnt/data里面删除数据。不然重新创建pod以为已经初始化了会报错!!
如果初始化失败(报的是/var/lib/mysql的错),可能是电脑太久没关机了。带不起来。注意要及时关机。