Minikube集群中应用无法访问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

