如何在Kubernetes集群中快速创建部署一个单节点的有状态(即将数据文件挂载到宿主机,防止重新部署mysql服务,数据文件丢失)的对外开放的MYSQL服务。
通过创建一个 Kubernetes Deployment 并使用 PersistentVolumeClaim 将其连接到已有的 PersistentVolume 来运行一个有状态的应用。
资源名称介绍:
-
Deployment主要用于无状态应用,但也可以通过与 PersistentVolumeClaim 配合支持有状态应用。
-
PersistentVolume 是集群管理员提供的存储资源,表示底层的实际存储(如 NFS、云盘、主机磁盘等),为应用提供持久化存储,可以手动创建或者动态配置。
-
PersistentVolumeClaim 是用户请求存储的方式,通过 PVC 可以声明需要的存储容量和访问模式,集群自动绑定到合适的 PV。
1.在所有可能运行mysql的node节点上创建/mnt/data文件夹
mkdir -p /mnt/data
2.运行 mysql-pv.yaml ,创建PV和PVC资源。
kubectl apply -f mysql-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv-volume
labels:
type: local
spec:
storageClassName: manual
capacity:
storage: 20Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/data" // 需要挂载到的宿主机上存储路径(运行时删除这些注释)
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim
spec:
storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
3.运行 mysql-deployment.yaml ,创建资源。
kubectl apply -f mysql-deployment.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
type: NodePort
ports:
- port: 3306
targetPort: 3306
nodePort: 30006
selector:
app: mysql
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
spec:
selector:
matchLabels:
app: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: mysql
spec:
containers:
- image: mysql:8.4.3 //换成自己需要的版本
name: mysql
env:
# 在实际中使用 secret
- name: MYSQL_ROOT_PASSWORD
value: 123456
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql // 在容器内部数据存储的路径,将它挂载到mysql-persistent-storage卷对应的实际宿主机物理存储位置上,即上面的/mnt/data
volumes: //指定了需要使用的持久卷
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim
4.查看部署效果
4.1 查看pod资源
kubectl get pods -A -o wide
4.2 状态正常
查看service资源
4.3 测试查看外部宿主机是否挂载数据
在node2上/mnt/data找到挂载的数据
4.4 可以使用navicate远程连接mysql数据库,创建数据库,测试是否成功。
本处使用nodePort形式,将pod的3306端口映射到宿主机的30006端口,所以可以直接连接 集群任意节点IP:30006 形式访问mysql。
4.5 其他命令
# 查看所有pod k8s资源的查看范式,查看pv,pvc等,将pods替换为相应的名称即可
kubectl get pods -A -o wide
# 查看所有service
kubectl get svc -A -o wide
# 删除相应资源
kubectl delete -f mysql-deployment.yaml
kubectl delete -f mysql-pv.yaml
# 查看具体某一pod的信息 pod后接具体pod的name -n 接命名空间 部署时没设置默认为default
kubectl describe pod mysql-5f8999867-vpht9 -n default
# 查看pod的日志信息 logs后接具体pod的name 在默认命名空间的pod无需使用-n 否则需要使用
kubectl logs mysql-5f8999867-vpht9
5.参考文献
1.运行一个单实例有状态应用 | Kubernetes