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

无法通过MySQL Workbench连接Minikube中的MySQL服务求助

Minikube中MySQL无法通过Workbench连接问题

环境与配置详情

我正在使用Minikube,执行kubectl describe deployment mysql的输出如下:

Name:                   mysql
Namespace:              default
CreationTimestamp:      Sat, 12 Nov 2022 02:20:54 +0200
Labels:                 <none>
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               app=mysql
Replicas:               1 desired | 1 updated | 1 total | 1 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=mysql
  Containers:
   mysql:
    Image:      mysql
    Port:       3306/TCP
    Host Port:  0/TCP
    Environment:
      MYSQL_ROOT_PASSWORD:  <set to the key 'password' in secret 'mysql-pass'>  Optional: false
    Mounts:
      /docker-entrypoint-initdb.d from mysql-init (rw)
  Volumes:
   mysql-init:
    Type:      ConfigMap (a volume populated by a ConfigMap)
    Name:      mysql-init
    Optional:  false
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  <none>
NewReplicaSet:   mysql-77fd55bbd9 (1/1 replicas created)

Deployment和Service的YAML配置文件:

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - name: mysql
          image: mysql
          env:
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-pass
                  key: password
          ports:
            - containerPort: 3306
          volumeMounts:
            - name: mysql-init
              mountPath: /docker-entrypoint-initdb.d
      volumes:
        - name: mysql-init
          configMap:
            name: mysql-init
---
apiVersion: v1
kind: Service
metadata:
  name: mysql
  labels:
    name: mysql
spec:
  ports:
    - port: 3306
      targetPort: 3306
      protocol: TCP
  selector:
    app: mysql

问题现象

  • 集群内部通过命令kubectl run -it --rm --image=mysql:8.0 --restart=Never mysql-client -- mysql -h mysql -u skaffold -p创建客户端,输入密码后可正常连接MySQL服务。
  • 使用MySQL Workbench连接时,配置为主机localhost、端口3306、用户名skaffold,出现连接失败提示(无法连接到目标MySQL服务器)。

解决方案

方法1:临时端口转发(快速验证)

执行端口转发命令,将本地3306端口映射到集群内MySQL Service的3306端口:

kubectl port-forward service/mysql 3306:3306

保持该终端窗口处于运行状态,然后用Workbench连接localhost:3306,输入skaffold用户的密码即可。

方法2:修改Service为NodePort(永久生效)

  1. 编辑MySQL Service配置:
kubectl edit service mysql
  1. 将spec.type字段的值从默认的ClusterIP修改为NodePort,保存并退出编辑器。
  2. 获取Minikube节点的IP地址:
minikube ip
  1. 查看Service分配的NodePort端口:
kubectl get service mysql

在输出的PORT(S)列中,第二个端口即为NodePort(格式类似3306:30xxx/TCP)。
5. 在Workbench中,主机填写Minikube节点IP,端口填写上述NodePort,用户名skaffold,输入对应密码完成连接。

方法3:使用LoadBalancer+Minikube Tunnel(适合生产类场景)

  1. 将Service类型修改为LoadBalancer:
kubectl patch service mysql -p '{"spec":{"type":"LoadBalancer"}}'
  1. 启动Minikube Tunnel(需保持终端运行):
minikube tunnel
  1. 获取Service的外部IP:
kubectl get service mysql

查看EXTERNAL-IP列的地址。
4. 在Workbench中使用该外部IP和3306端口连接MySQL。

额外检查:MySQL用户权限

如果上述方法仍无法连接,可能是skaffold用户仅允许集群内部访问,需授权外部访问:

  1. 进入MySQL Pod:
kubectl exec -it $(kubectl get pods -l app=mysql -o jsonpath="{.items[0].metadata.name}") -- mysql -u root -p
  1. 执行授权SQL(替换your-password为skaffold用户的实际密码):
GRANT ALL PRIVILEGES ON *.* TO 'skaffold'@'%' IDENTIFIED BY 'your-password';
FLUSH PRIVILEGES;

内容的提问来源于stack exchange,提问作者Karim Abdel-Qader

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 09:50:45