实验环境
master:192.168.100.10
node :192.168.100.20
然后安装好k8s以及docker
本人已经做好了Harbor私有仓库,所以以下镜像前均带IP地址。
1、因为是用NFS来作为持续数据化,所以首先搭建NFS。
master:
yum install -y nfs*
mkdir -p /nfsdata/mysql #这个目录用来当我们NFS的共享目录来使用
vim /etc/exports
/nfsdata *(rw,sync,no_root_squash)
exportfs -r
systemctl restart nfs && systemctl enable nfs
show
node:
[root@node ~]# showmount -e 192.168.100.10
Export list for 192.168.100.10:
/nfsdata *
#至此,前提的NFS服务搭建完成
2、编写PV资源文件
vim mysql-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv
spec:
accessModes: #给PV设置模式
- ReadWriteOnce #RWO模式是只能以读写的方式挂载到单个节点
capacity: #容量,相当于存储
storage: 1Gi #给1G
persistentVolumeReclaimPolicy: Retain #持久卷声明策略,Retain策略不清理保留数据。即删除pvc或者pv后,在插件上的数据(nfs服务端)不会被删除。这种方式是最常用的,可以避免误删pvc或者pv而造成数据的丢失
storageClassName: nfs #存储类,选择nfs
nfs:
path: /nfsdata/mysql
server: 192.168.100.10 #挂到/nfsdata/mysql这个目录上
#配置详解:
Retain: 这个策略说白了就是不清理, 保留 Volume(需要手动清理)
ReadWriteOnce(RWO): 是最基本的方式,可读可写,但只支持被单个 Pod 挂载。
ReadOnlyMany(ROX): 可以以只读的方式被多个 Pod 挂载。
ReadWriteMany(RWX): 这种存储可以以读写的方式被多个 Pod 共享
3、编写PVC资源文件
vim mysql-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi #此处选择的存储必须和PV里面选择的存储一样,不然可能会导致不能bound,欢迎讨论这个配置。
storageClassName: nfs #此处是指向pv,并进行关联。
4、编写Deployment以及SVC资源文件,集成到一块。
vim mysql-deployment_svc.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql-dep
spec:
selector:
matchLabels:
app: mysql #做一个选择标签,
template:
metadata:
labels:
app: mysql #此处标签与上面一样,目的是要让spec.selector.matchLabels值和spec.template.metadata.lables值完全匹配
template:
spec:
containers:
- name: mysql
image: 192.168.100.10/library/mysql:5.6
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: 000000 #设置数据库密码为000000
volumeMounts: #数据要存放的卷目录
- name: mysql-data-storage
mountPath: /var/lib/mysql #让容器挂载到这个目录,实现数据文件都存放在此目录当中,让这个目录数据持久化。
volumes: #在pod上选择共享存储卷
- name: mysql-data-storage
persistentVolumeClaim:
claimName: mysql-pvc #指定pvc的名称
#############################################################################
################## 以下开始创建 svc ##########################################
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
type: NodePort #暴露端口
ports:
- port: 3306 #我自己开房的端口
targetPort: 3306 #开放的后端端口
nodePort: 32543 #暴露出去的端口,相当于一个端口映射,访问这个端口的时候,转到3306
selector:
app: mysql
5、测试是否数据持久化
kubectl apply -f mysql-pv.yaml
kubectl apply -f mysql-pvc.yaml
kubectl apply -f mysql-deployment_svc.yaml #首先启动起来
kubectl exec -it mysql-<podID> -- mysql -uroot -p000000
mysql> create database hello;
mysql> use hello;
mysql> create table test(id int(4));
mysql>insert test values(1314);
mysql>select * from test;
+------+
| id |
+------+
| 1314 |
+------+
1 row in set (0.00 sec)
然后去查看下mysql 在哪个节点上:
kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mysql-58dfd956ff-d472f 1/1 Running 0 9m38s 10.244.1.15 node <none> <none>
发现在node上,这个时候去node
[root@node ~]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d706dbae5d50 44241dbd4d38 "docker-entrypoint.s…" 9 minutes ago Up 9 minutes k8s_mysql_mysql-58dfd956ff-d472f_default_50ac5310-6cc5-49c1-8dc0-7f4d9e23d60c_0
[root@node ~]# docker rm -f d706
d706
然后这个时候再去看看数据还在不在。
kubectl exec -it mysql-<podID> -- mysql -uroot -p000000
mysql> select * from gch.myid
-> ;
+------+
| id |
+------+
| 1314 |
+------+
1 row in set (0.00 sec)
还在,试验成功!
-----来自河南经贸19级计算机工程学院的一名普通学生,通过博客来分享自己日常收获到的新知识,会持续坚持,感谢大家的阅读,希望可以帮到你!
PS:理解不到位之处多谢包涵!
转载的希望可以放上本文章的链接,谢谢!