Kubernetes(k8s)1.30.7简单快速部署对外部开放的有状态服务MYSQL8(快速有效)

如何在Kubernetes集群中快速创建部署一个单节点的有状态(即将数据文件挂载到宿主机,防止重新部署mysql服务,数据文件丢失)的对外开放的MYSQL服务。

通过创建一个 Kubernetes Deployment 并使用 PersistentVolumeClaim 将其连接到已有的 PersistentVolume 来运行一个有状态的应用。

资源名称介绍:

  • Deployment主要用于无状态应用,但也可以通过与 PersistentVolumeClaim 配合支持有状态应用。

  • PersistentVolume 是集群管理员提供的存储资源,表示底层的实际存储(如 NFS、云盘、主机磁盘等),为应用提供持久化存储,可以手动创建或者动态配置。

  • PersistentVolumeClaim 是用户请求存储的方式,通过 PVC 可以声明需要的存储容量和访问模式,集群自动绑定到合适的 PV。

1.在所有可能运行mysql的node节点上创建/mnt/data文件夹

bash 复制代码
mkdir -p /mnt/data

2.运行 mysql-pv.yaml,创建PV和PVC资源。

bash 复制代码
kubectl apply -f mysql-pv.yaml
Kotlin 复制代码
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 ,**创建资源。

bash 复制代码
kubectl apply -f mysql-deployment.yaml
Kotlin 复制代码
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资源

bash 复制代码
 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 其他命令

bash 复制代码
# 查看所有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

相关推荐
NoSi EFUL3 小时前
MySQL中ON DUPLICATE KEY UPDATE的介绍与使用、批量更新、存在即更新不存在则插入
android·数据库·mysql
柴米油盐那点事儿4 小时前
python+mysql+bootstrap条件搜索分页
python·mysql·flask·bootstrap
Elastic 中国社区官方博客4 小时前
为 Elastic Cloud Serverless 和 Elasticsearch 引入统一的 API 密钥
大数据·运维·elasticsearch·搜索引擎·云原生·serverless
空中海4 小时前
Kubernetes 生产实践、可观测性与扩展入门
java·贪心算法·kubernetes
Devin~Y4 小时前
大厂Java面试实录:Spring Boot/Cloud、Kafka、Redis、K8s 与 Spring AI(RAG/Agent)三轮连环问
java·spring boot·redis·mysql·spring cloud·kafka·kubernetes
深色風信子5 小时前
Docker newapi
运维·docker·容器·newapi
旷世奇才李先生6 小时前
Spring Cloud Alibaba 2026实战:微服务治理全解析
微服务·云原生·架构
chenxu98b6 小时前
MySQL如何执行.sql 文件:详细教学指南
数据库·mysql
梦想的颜色6 小时前
mongoTemplate + Java 增删改查基础介绍
数据结构·数据库·mysql
GL_Rain8 小时前
快速搭建Halo博客 + 崩溃秒恢复方案(Docker极简部署)
运维·docker·容器