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

Kubernetes中MySQL远程访问问题求助(附YAML配置)

排查Kubernetes中MySQL远程访问失败问题

在Kubernetes中部署MySQL Pod后,执行kubectl describe svc mysql确认了Service端点正常,但无法通过HeidiSQL远程连接MySQL以创建数据表,以下是部署所用的YAML配置:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - image: rafaelribeirosouza86/shopping:myql
        name: mysql
        imagePullPolicy: Always
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pv-claim
      imagePullSecrets:
      - name: regcred

---
apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
#  clusterIP: None
  ports:
  - port: 3306
  selector:
    app: mysql

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv-volume
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 20Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi

可能的问题及解决方法

1. Service类型限制外部访问

当前Service未指定type,默认是ClusterIP类型,仅允许Kubernetes集群内部访问,外部客户端无法直接连接。

解决方法:将Service改为NodePort或LoadBalancer类型:

  • 若使用NodePort,修改Service的spec部分:
spec:
  type: NodePort
  ports:
  - port: 3306
    nodePort: 30306 # 可选,指定固定端口(范围30000-32767)
  selector:
    app: mysql

之后可通过节点IP:30306访问MySQL。

  • 若在云环境中,可使用LoadBalancer类型,云平台会自动分配外部IP。

2. MySQL绑定地址限制

部分MySQL镜像默认仅绑定127.0.0.1,导致仅容器内部可访问,Service无法转发流量。

解决方法:在Deployment的容器中添加环境变量,让MySQL绑定0.0.0.0:

containers:
- image: rafaelribeirosouza86/shopping:myql
  name: mysql
  env:
  - name: MYSQL_ROOT_PASSWORD
    valueFrom:
      secretKeyRef:
        name: mysql-pass
        key: password
  - name: MYSQL_BIND_ADDRESS # 添加此环境变量
    value: "0.0.0.0"

若自定义镜像未支持该环境变量,需修改MySQL配置文件my.cnf,将bind-address设为0.0.0.0。

3. MySQL用户权限限制

MySQL的root用户默认仅允许localhost访问,需授权远程访问权限。

解决方法:

  1. 进入MySQL Pod:
kubectl exec -it <mysql-pod-name> -- mysql -uroot -p
  1. 执行授权命令(替换your-password为实际密码):
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'your-password';
FLUSH PRIVILEGES;

也可在Deployment中添加initContainer或自定义镜像,自动执行权限配置。

4. 网络防火墙/安全组限制

  • 若使用NodePort,需确保节点的对应端口(如30306)在防火墙、安全组中开放,允许外部客户端访问。
  • 若使用LoadBalancer,需确认负载均衡的3306端口已开放。

5. 集群内部连通性验证

先验证集群内部是否能正常访问MySQL,排除Service或Pod本身的问题:

  1. 启动临时测试Pod:
kubectl run -it --rm --image=mysql:8.0 mysql-client -- mysql -h mysql -uroot -p
  1. 输入密码后若能成功连接,说明集群内部正常,问题出在外部访问链路;若无法连接,需检查Pod是否正常运行、端点是否正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 07:45:51