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

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的错),可能是电脑太久没关机了。带不起来。注意要及时关机。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值