You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

按照Kubernetes官方指南部署MySQL Pod遇多问题求助

MySQL部署问题排查&GlassFish通信指南

我帮你一步步拆解你遇到的三个核心问题:动态PV启用失败、手动PV/PVC后Pod异常,以及和GlassFish的通信配置,每个部分给你具体的排查步骤:

一、Ubuntu 16.04无法启用动态PV的排查

Ubuntu 16.04上Kubernetes版本普遍偏旧(比如默认源里的1.10.x系列),动态PV的支持需要几个关键组件配合,你可以按以下步骤检查:

  • 确认Kubernetes版本兼容性:运行kubectl version查看Server版本,低于1.8的版本对动态PV支持有限,建议升级到1.12+(如果系统允许的话)。
  • 检查StorageClass配置:动态PV依赖StorageClass+对应的Provisioner,你需要先创建一个合法的StorageClass对象,比如本地存储的示例:
    kind: StorageClass
    apiVersion: storage.k8s.io/v1
    metadata:
      name: local-storage
    provisioner: kubernetes.io/no-provisioner
    volumeBindingMode: WaitForFirstConsumer
    
  • 验证Provisioner运行状态:如果使用第三方Provisioner(比如nfs-client、local-path-provisioner),要确认对应的Pod/DaemonSet处于Running状态:kubectl get pods -n kube-system,筛选带provisioner关键词的Pod。
  • 检查kube-apiserver启动参数:确保kube-apiserver的启动参数里没有禁用动态PV,比如没有--disable-dynamic-provisioning(旧版本可能存在该参数,新版本默认启用)。

二、手动PV/PVC后Pod异常的排查

手动创建PV/PVC后Pod崩溃、MySQL无法启动,大概率是权限、挂载或启动命令的问题,按优先级排查:

  1. 先看Pod日志和事件:这是最直接的排查方式
    • 查看MySQL启动日志:kubectl logs <mysql-pod-name>,初始化失败时日志会明确提示(比如权限不足、密码未设置)
    • 查看Pod事件:kubectl describe pod <mysql-pod-name>,排查是否有挂载失败、权限错误、资源不足的提示
  2. 检查PV宿主目录权限:MySQL容器内默认用mysql用户(UID 999)运行,如果你手动创建的PV是宿主节点的目录,需要给该目录设置正确权限:
    # 在宿主节点上执行
    chown -R 999:999 /path/to/your/pv/directory
    
  3. 检查启动命令是否覆盖默认逻辑:你提到“添加命令后Pod不再崩溃”,如果加的是sleep infinity这类占位命令,会直接跳过MySQL的启动流程!要确保命令是MySQL的启动指令,比如官方镜像的默认命令是mysqld,不要随意覆盖,除非你明确知道自己在做什么。
  4. 验证PVC绑定与挂载情况
    • 确认PVC状态:kubectl get pvc,状态必须为Bound
    • 进入Pod检查挂载:kubectl exec <mysql-pod-name> -- df -h,确认PV是否正确挂载到MySQL的数据目录(通常是/var/lib/mysql
  5. 检查环境变量配置:MySQL官方镜像需要必选环境变量,比如MYSQL_ROOT_PASSWORDMYSQL_DATABASE,如果缺失会导致初始化失败,Pod反复重启。

三、MySQL与GlassFish Pod通信的配置

要让两个Pod互通,核心是用Kubernetes Service做服务发现,步骤如下:

  • 给MySQL创建ClusterIP Service:这是K8s内部服务访问的标准方式,示例YAML:
    apiVersion: v1
    kind: Service
    metadata:
      name: mysql-service
    spec:
      selector:
        app: mysql # 要和你的MySQL Pod的label匹配
      ports:
        - protocol: TCP
          port: 3306
          targetPort: 3306
    
  • GlassFish侧配置访问地址:在GlassFish的应用配置里,把数据库连接地址改成mysql-service.<namespace>.svc.cluster.local(如果两个Pod在同一个Namespace,直接用mysql-service:3306即可)
  • 确认MySQL绑定地址:确保MySQL配置里的bind-address0.0.0.0(而非127.0.0.1),否则只能在Pod内部访问,无法对外提供服务。你可以进入Pod检查my.cnf,或者在启动命令里追加--bind-address=0.0.0.0参数。
  • 检查NetworkPolicy(如果启用):如果集群启用了NetworkPolicy,要确保允许GlassFish所在的Pod访问MySQL的3306端口。

最后提醒:你提供的YAML文件里,要重点检查volumesvolumeMounts的路径是否正确,StatefulSet的volumeClaimTemplates(如果使用StatefulSet)是否和PVC匹配,资源请求/限制是否足够(比如MySQL至少需要512M内存,内存不足会导致OOM崩溃)。

内容的提问来源于stack exchange,提问作者kubernoobus

火山引擎 最新活动