按照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无法启动,大概率是权限、挂载或启动命令的问题,按优先级排查:
- 先看Pod日志和事件:这是最直接的排查方式
- 查看MySQL启动日志:
kubectl logs <mysql-pod-name>,初始化失败时日志会明确提示(比如权限不足、密码未设置) - 查看Pod事件:
kubectl describe pod <mysql-pod-name>,排查是否有挂载失败、权限错误、资源不足的提示
- 查看MySQL启动日志:
- 检查PV宿主目录权限:MySQL容器内默认用
mysql用户(UID 999)运行,如果你手动创建的PV是宿主节点的目录,需要给该目录设置正确权限:# 在宿主节点上执行 chown -R 999:999 /path/to/your/pv/directory - 检查启动命令是否覆盖默认逻辑:你提到“添加命令后Pod不再崩溃”,如果加的是
sleep infinity这类占位命令,会直接跳过MySQL的启动流程!要确保命令是MySQL的启动指令,比如官方镜像的默认命令是mysqld,不要随意覆盖,除非你明确知道自己在做什么。 - 验证PVC绑定与挂载情况:
- 确认PVC状态:
kubectl get pvc,状态必须为Bound - 进入Pod检查挂载:
kubectl exec <mysql-pod-name> -- df -h,确认PV是否正确挂载到MySQL的数据目录(通常是/var/lib/mysql)
- 确认PVC状态:
- 检查环境变量配置:MySQL官方镜像需要必选环境变量,比如
MYSQL_ROOT_PASSWORD、MYSQL_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-address是0.0.0.0(而非127.0.0.1),否则只能在Pod内部访问,无法对外提供服务。你可以进入Pod检查my.cnf,或者在启动命令里追加--bind-address=0.0.0.0参数。 - 检查NetworkPolicy(如果启用):如果集群启用了NetworkPolicy,要确保允许GlassFish所在的Pod访问MySQL的3306端口。
最后提醒:你提供的YAML文件里,要重点检查volumes、volumeMounts的路径是否正确,StatefulSet的volumeClaimTemplates(如果使用StatefulSet)是否和PVC匹配,资源请求/限制是否足够(比如MySQL至少需要512M内存,内存不足会导致OOM崩溃)。
内容的提问来源于stack exchange,提问作者kubernoobus




