OpenShift Pod连接外部MySQL数据库失败问题求助
OpenShift 4 Pod无法连接外部MySQL服务器的问题
我正尝试在OpenShift 4(本地使用CRC测试)上创建一个通用Pod,以连接运行在集群外独立VM上的MySQL服务器,但部署后无法从Pod内部连接到该MySQL服务器。
部署配置
kind: "Service" apiVersion: "v1" metadata: name: "mysql" spec: ports: - name: "mysql" protocol: "TCP" port: 3306 targetPort: 3306 nodePort: 0 selector: {} --- kind: "Endpoints" apiVersion: "v1" metadata: name: "mysql" subsets: - addresses: - ip: "***ip of host with mysql database on it***" ports: - port: 3306 name: "mysql" --- apiVersion: v1 kind: DeploymentConfig metadata: name: "deployment" spec: template: metadata: labels: name: "mysql" spec: containers: - name: "test-mysql" image: "***image repo with docker image that has mysql package installed***" ports: - containerPort: 3306 protocol: "TCP" env: - name: "MYSQL_USER" value: "user" - name: "MYSQL_PASSWORD" value: "******" - name: "MYSQL_DATABASE" value: "mysql_db" - name: "MYSQL_HOST" value: "***ip of host with mysql database on it***" - name: "MYSQL_PORT" value: "3306"
测试步骤与错误
我使用的是预装了net-tools、openjdk等标准软件包的测试镜像,通过以下命令进入Pod:
$ oc rsh {{ deployed pod name }}
执行连接命令后无法成功:
$ mysql --host **hostname** --port 3306 -u user -p
得到的错误信息:
ERROR 2003 (HY000): Can't connect to MySQL server on '**hostname**:3306' (111)
补充测试情况:
- 尝试通过Service创建Route,用FQDN替代IP连接,仍然失败
- Pod内部ping该MySQL主机不通,但能正常ping通google.com、github.com等外部站点
- 集群外可以正常访问该MySQL主机
镜像Dockerfile参考
FROM ubi:8.0 RUN dnf install -y python3 \ wget \ java-1.8.0-openjdk \ https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm \ postgresql-devel WORKDIR /tmp RUN wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm && \ rpm -ivh mysql-community-release-el7-5.noarch.rpm && \ dnf update -y && \ dnf install mysql -y && \ wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.48.tar.gz && \ tar zxvf mysql-connector-java-5.1.48.tar.gz && \ mkdir -p /usr/share/java/ && \ cp mysql-connector-java-5.1.48/mysql-connector-java-5.1.48-bin.jar /usr/share/java/mysql-connector-java.jar RUN dnf install -y tcping \ iputils \ net-tools
排查与解决建议
网络连通性排查
- 检查CRC集群的NetworkPolicy:默认OpenShift可能限制Pod出站流量,确认是否有策略阻止访问MySQL主机的3306端口
- 检查MySQL主机防火墙:确保3306端口允许CRC集群节点的IP访问(Pod出站流量由节点IP转发)
- 确认网络路由:确保CRC虚拟网络与MySQL VM的网络处于同一网段或路由可达
MySQL配置检查
- 修改
bind-address:默认MySQL仅绑定127.0.0.1,需改为0.0.0.0或允许CRC集群IP段访问 - 验证用户权限:确保
user账号允许从Pod所在IP段或任意地址连接(如执行GRANT ALL ON mysql_db.* TO 'user'@'%' IDENTIFIED BY 'password';)
- 修改
Service/Endpoints优化
- 将DeploymentConfig中的
MYSQL_HOST改为Service名称mysql,Pod可通过Kubernetes内部DNS解析到外部MySQL IP,无需直接使用硬编码IP
- 将DeploymentConfig中的
精准测试连通性
- 在Pod内使用
tcping <mysql-ip> 3306测试端口连通性(ping可能被防火墙拦截,但端口可能开放) - 确认mysql客户端与外部MySQL服务器版本兼容
- 在Pod内使用
内容的提问来源于stack exchange,提问作者jotejo1006
相关产品推荐
相关产品推荐

