You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Minikube集群中应用无法访问MySQL数据库问题求助

Kubernetes中Web应用无法连接MySQL数据库问题

我是Kubernetes新手,已在Minikube中部署Web应用与MySQL数据库,前端可正常访问,但无法连接数据库。

Java代码配置

ConnectionProvider.java

static String URL = "jdbc:mysql://${DB_HOST}:3306/jspdemoproject";
static String user = "${DB_USER}";
static String pass = "${DB_PASS}";

应用YAML配置(jspweb.yaml)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: jspweb
  labels:
    app: jspweb
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jspweb
  template:
    metadata:
      labels:
        app: jspweb
    spec:
      containers:
      - name: jspweb
        image: kubesk071/jspapp:k8s
        ports:
        - containerPort: 8080
        env:
        - name: DB_HOST
          valueFrom:
            configMapKeyRef:
              name: db-config
              key: db-host

        - name: DB_USER
          valueFrom:
            secretKeyRef:
              name: jspdb-secret
              key: username

        - name: DB_PASS
          valueFrom:
            secretKeyRef:
              name: jspdb-secret
              key: password

---
# service file for web

apiVersion: v1
kind: Service
metadata:
  name: jspweb-service
spec:
  type: NodePort
  selector:
    app: jspweb
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 8080
    nodePort: 30005

数据库YAML配置(jspdb-deploy.yaml)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: jspdb
  labels:
    app: jspdb
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jspdb
  template:
    metadata:
      labels:
        app: jspdb
    spec:
      containers:
      - name: jspdb
        image: kubesk071/jspdb:k8s
        ports:
        - containerPort: 3306
        env:
        - name: DB_USER
          valueFrom:
            secretKeyRef:
              name: jspdb-secret
              key: username

        - name: DB_PASS
          valueFrom:
            secretKeyRef:
              name: jspdb-secret
              key: password

---

# service file for db
apiVersion: v1
kind: Service
metadata:
  name: jspdb-service
spec:
  selector:
    app: jspdb
  ports:
  - protocol: TCP
    port: 3306
    targetPort: 3306

ConfigMap配置(jsp-configmap.yaml)

apiVersion: v1
kind: ConfigMap
metadata:
  name: db-config
data:
  db-host: jspdb-service

应用日志错误信息

Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.

kubectl get all输出

NAME                          READY   STATUS    RESTARTS   AGE
pod/jspdb-dd88566c-fxhlr      1/1     Running   0          4m10s
pod/jspweb-75c599d887-v7dvl   1/1     Running   0          3m55s

NAME                     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
service/jspdb-service    ClusterIP   10.96.19.46     <none>        3306/TCP         4m10s
service/jspweb-service   NodePort    10.111.42.254   <none>        8080:30005/TCP   3m55s
service/kubernetes       ClusterIP   10.96.0.1       <none>        443/TCP          7m46s

NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/jspdb    1/1     1            1           4m10s
deployment.apps/jspweb   1/1     1            1           3m55s

NAME                                DESIRED   CURRENT   READY   AGE
replicaset.apps/jspdb-dd88566c      1         1         1       4m10s
replicaset.apps/jspweb-75c599d887   1         1         1       3m55s

kubectl get pods -o wide输出

NAME                      READY   STATUS    RESTARTS   AGE     IP           NODE       NOMINATED NODE   READINESS GATES
jspdb-dd88566c-fxhlr      1/1     Running   0          6m14s   10.244.0.3   minikube   <none>           <none>
jspweb-75c599d887-v7dvl   1/1     Running   0          5m59s   10.244.0.4   minikube   <none>           <none>

额外排查尝试

已将DB_HOST改为jspdb-service.default.svc.cluster.local,问题仍未解决。应用Pod的环境变量输出如下:

PATH=/usr/local/tomcat/bin:/opt/java/openjdk/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=jspweb-75c599d887-7ww9f
DB_HOST=jspdb-service.default.svc.cluster.local
DB_USER=root
DB_PASS=12345678
KUBERNETES_PORT=tcp://10.96.0.1:443
JSPWEB_SERVICE_SERVICE_HOST=10.102.147.146
JSPWEB_SERVICE_PORT=tcp://10.102.147.146:8080
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PROTO=tcp
JSPDB_SERVICE_PORT_3306_TCP_PORT=3306
KUBERNETES_SERVICE_PORT=443
JSPDB_SERVICE_PORT_3306_TCP_ADDR=10.104.105.191
JSPWEB_SERVICE_PORT_8080_TCP_PORT=8080
JSPDB_SERVICE_PORT_3306_TCP_PROTO=tcp
JSPWEB_SERVICE_PORT_8080_TCP=tcp://10.102.147.146:8080
JSPWEB_SERVICE_PORT_8080_TCP_ADDR=10.102.147.146
JSPDB_SERVICE_SERVICE_HOST=10.104.105.191
JSPDB_SERVICE_SERVICE_PORT=3306
JSPDB_SERVICE_PORT=tcp://10.104.105.191:3306
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
JAVA_HOME=/opt/java/openjdk
LANG=en_US.UTF-8
LANGUAGE=en_US:en
LC_ALL=en_US.UTF-8
JAVA_VERSION=jdk-11.0.21+9
CATALINA_HOME=/usr/local/tomcat
TOMCAT_NATIVE_LIBDIR=/usr/local/tomcat/native-jni-lib
LD_LIBRARY_PATH=/usr/local/tomcat/native-jni-lib
GPG_KEYS=48F8E69F6390C9F25CFEDCD268248959359E722B A9C5DF4D22E99998D9875A5110C01C5A2F6059E7 DCFD35E0BF8CA7344752DE8B6FB21E8933C60243
TOMCAT_MAJOR=9
TOMCAT_VERSION=9.0.84
TOMCAT_SHA512=85a42ab5e7e4cb1923888e96a78a0f277a870d06e76147a95457878c124001c9a317eade4ad69c249a460ffe2cbefe894022b84389cdf33038bc456e3699c8e3
HOME=/root

已确认数据库Pod中的库和表已创建,但应用Pod无法访问数据库。


排查与解决方案

1. 修正Java代码的环境变量读取逻辑

原生Java不会自动解析${DB_HOST}这类占位符,需手动读取环境变量:

static String DB_HOST = System.getenv("DB_HOST");
static String DB_USER = System.getenv("DB_USER");
static String DB_PASS = System.getenv("DB_PASS");
static String URL = "jdbc:mysql://" + DB_HOST + ":3306/jspdemoproject";

2. 允许MySQL接受外部连接

如果使用官方MySQL镜像,在数据库Deployment中添加环境变量,允许所有主机连接:

env:
- name: MYSQL_ROOT_HOST
  value: "%"
- name: DB_USER
  valueFrom:
    secretKeyRef:
      name: jspdb-secret
      key: username
# 保留其他原有环境变量

若使用自定义镜像,需修改MySQL配置文件,将bind_address设为0.0.0.0。

3. 验证网络连通性

进入应用Pod,测试与数据库Service的连通性:

# 测试ping
kubectl exec -it jspweb-75c599d887-v7dvl -- ping jspdb-service
# 测试端口是否开放
kubectl exec -it jspweb-75c599d887-v7dvl -- nc -zv jspdb-service 3306

若端口不通,检查数据库Pod的3306端口是否正常监听;若ping不通,确认Minikube的网络插件运行正常。

4. 检查MySQL用户权限

进入数据库Pod,确认用户允许从应用子网连接:

kubectl exec -it jspdb-dd88566c-fxhlr -- mysql -u root -p

执行SQL:

-- 查看用户权限
SELECT host, user FROM mysql.user;
-- 若root的host为localhost,修改为允许所有主机
ALTER USER 'root'@'%' IDENTIFIED BY '12345678';
FLUSH PRIVILEGES;

5. 补充JDBC URL参数

MySQL 8.0+需指定时区,否则可能连接失败:

static String URL = "jdbc:mysql://" + DB_HOST + ":3306/jspdemoproject?useSSL=false&serverTimezone=UTC";

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 15:22:04