一、创建pv和pvc

        容器创建后,没有pv (PersistentVolume 持久卷)和pvc (PersistentVolumeClaim 持久卷生命)挂载存储相应数据,在删除容器后所有数据都会被清空回到初始状态。生产环境会因为数据丢失导致系统崩坏,服务不能启动等问题,因此需要先挂载pv和pvc。

   mysql-pv.yaml


apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv   # pv的名称
  namespace: zhongchuan141  #pv所属命名空间
spec:
  capacity:
    storage: 10Gi   #pv提供的存储容量 10G
  accessModes:
    - ReadWriteOnce  
  #访问模式:单节点访问 ReadWriteOnce  多节点只读 ReadOnlyMany 多节点读写 ReadWriteMany  
  persistentVolumeReclaimPolicy: Retain  
  #回收策略:保留 Retain 自动删除 Delete 自动格式化 Recycle
  storageClassName: mysql-storage  #存储类 用于区分存储卷及匹配相同类名的生命
  hostPath:
    path: /home/data/mysql/data  #挂载的本地目录
    type: DirectoryOrCreate  #目录类型:若不存在则会自动创建

 mysql-pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
  namespace: zhongchuan141
spec:
  accessModes:  #访问模式:单节点读写,要与pv兼容
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi  # 存储空间 10G
  storageClassName: mysql-storage  #匹配的存储类名称

使用 命令 kubectl apply -f  mysql-pv.yaml  和 kubectl apply -f  mysql-pvc.yaml 应用

二、 创建mysql数据库配置

        配置文件用于对MySQL数据库进行一些定制化配置,无配置时默认使用初始配置,容易导致sql语句报错。配置文件可通过vim手动创建或者将已有的配置文件直接应用

my.cnf 

[mysqld]
server-id=5
long_query_time=1
log_output=FILE
ssl=OFF
explicit_defaults_for_timestamp=ON
sql_mode=NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
lower_case_table_names=1
log_timestamps=SYSTEM
symbolic-links=0
max_connections=1000
max_connect_errors=1000

单个配置文件可采用创建configMap的方式实现,用携程yaml文件

kubectl create configmap mysql-config -n zhongchuan141 --from-file=my.cnf=./my.cnf

#格式 
#kubectl create configmap <cm名称> -n <命名空间> --from-file=<cm中的键名>=<本地文件目录>

三、创建deployment和service文件

deployment.yaml用于创建和管理pod,pod的增加、减少、资源调整都需要用pod

service.yaml用于暴露pod对外的端口

apiVersion: apps/v1
kind: Deployment
metadata:
  name: zhongchuan141-mysql #deployment的名称,用于标识这个部署
  namespace: zhongchuan141
spec:
  replicas: 1  #运行的容器资源
  selector:
    matchLabels:
      app: zhongchuan141-mysql  # 用于匹配Pod的标签,与pod模板中的labels对应
  template: #pod的模板
    metadata:
      labels:
        app: zhongchuan141-mysql #pod的标签,需要与deployment的selector匹配
    spec:
      containers:
        - name: zhongchuan141-mysql  #容器名称
          image: dockerhub.kubekey.local/tiangang/mysql:5.7.34 #镜像名称及版本
          ports:
            - containerPort: 3306 #容器内暴露的端口
          env: #环境变量
            - name: MYSQL_ROOT_PASSWORD
              value: "root123456"
          volumeMounts: #容器内挂载的卷
          - name: mysql-data  #mysql存储卷
            mountPath: /var/lib/mysql 
          - name: mysql-config #mysql配置卷
            mountPath: /etc/mysql/my.cnf
      volumes: #定义pod使用的卷(关联外部存储或配置)
      - name: mysql-data
        persistentVolumeClaim:
          claimName: mysql-pvc  
          #关联之前创建的mysql-pvc(pvc和pv会根据类或者资源情况自动匹配)
      - name: mysql-config
        configMap:
          name: mysql-config
          #关联之前创建的mysql-config (通过configMap注入my.cnf)

---

apiVersion: v1
kind: Service
metadata:
  name: zhongchuan141-mysql #Service名称,与deployment名称保持一致,便于管理
  namespace: zhongchuan141  #与deployment相同的命名空间
spec:
  type: NodePort  
  #服务类型
  selector:
    app: zhongchuan141-mysql  #关联标签为app:xxx的pod,即deployment中创建的pod
  ports:
    - port: 3306 #Service自身的端口,集群内其他服务访问时使用此端口
      targetPort: 3306  #映射到pod的端口,需要与pod和containerPort一致
      nodePort: 30278  #节点暴露的固定端口 (范围时30000~32767)

service的类型

  • ClusterIP(默认类型)
  • 定义:为 Service 分配一个集群内部唯一的虚拟 IP(ClusterIP),仅能在集群内部访问。
  • 特点
    • 不暴露到集群外部,仅集群内的 Pod、容器或其他 Service 可访问。
    • 自动分配 IP(也可通过spec.clusterIP手动指定,需确保未被占用)。
  • 适用场景:仅需集群内部通信的服务(如后端 API、数据库等,不对外暴露)。

  • NodePort

  • 定义:在ClusterIP基础上,为 Service 在集群的每个节点上开放一个静态端口(NodePort),外部可通过 “节点 IP:NodePort” 访问服务。
  • 特点
    • 同时具备 ClusterIP 的内部访问能力(集群内仍可用 ClusterIP:port 访问)。
    • NodePort 端口范围固定(30000-32767,由 K8s 默认限制,避免与节点其他端口冲突)。
    • 无论 Pod 调度到哪个节点,所有节点都会开放该端口(访问任意节点的 NodePort 均可转发到目标 Pod)。
  • 适用场景:测试环境中需要简单暴露服务到集群外部(如临时让外部客户端访问)。

  •   LoadBalancer
  • 定义:结合云服务提供商(如 AWS、GCP、阿里云等)的负载均衡器,自动创建一个外部负载均衡器,并将流量转发到 Service。
  • 特点
    • 依赖云厂商的负载均衡器支持(自建 K8s 集群可能不生效)。
    • 云厂商会分配一个外部 IP(或域名),外部可通过该 IP 直接访问服务。
    • 底层基于NodePortClusterIP实现(自动创建 NodePort 和 ClusterIP)。
  • 适用场景:生产环境中需要稳定的外部访问入口(如公网可访问的 Web 服务)。

四、相关命令

kubectl apply -f mysql-141.yaml 应用yaml文件

kubectl get pods -n zhongchuan141 查看对应命名空间下的pod

kubectl get svc -n zhongchuan141 查看service暴露的端口

kubectl cp /本地路径/数据.sql <容器名>:/tmp/数据.sql

kubectl exec -it -n zhongchuan141 zhongchuan141-mysql-687f67c6b8-2dcc6 bash 导入数据

效果:

更多推荐