You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在不暴露宿主机端口的情况下访问Rancher管理的K8s容器内MySQL?

Hey,针对你的场景,我有几个非常实用的临时访问方案,都是在Kubernetes+Rancher环境下验证过的,完美匹配你不想固定节点、避免端口冲突又要临时外部访问的需求:

方案1:临时端口转发(kubectl port-forward)—— 最推荐的轻量方式

这是Kubernetes官方提供的临时访问Pod内部端口的方法,完全不需要修改任何集群资源,用完就停,不会留下任何痕迹,刚好符合你「临时动态暴露」的核心需求。

操作步骤:

  1. 找到目标MySQL Pod
    • 命令行方式:kubectl get pods -n <你的命名空间>,找到对应微服务的MySQL Pod(比如名称类似mysql-myapp-7f9d6c5b89-2xqzk)。
    • Rancher UI方式:进入对应命名空间的「Pod」列表,直接找到目标MySQL Pod。
  2. 启动端口转发
    执行命令:kubectl port-forward <mysql-pod-name> 3306:3306 -n <你的命名空间>
    这条命令会把你本地机器的3306端口,直接转发到目标MySQL Pod内部的3306端口。
  3. 用MySQL Workbench连接
    在Workbench里新建连接,主机填localhost,端口填3306,输入MySQL的用户名和密码,就能直接访问Pod里的数据库了。
  4. 清理
    用完之后直接按Ctrl+C停止端口转发,一切恢复原样,没有任何残留。

补充:如果你更习惯可视化操作,在Rancher UI的目标Pod详情页,找到「端口转发」按钮,输入本地端口(3306)和容器端口(3306),点击启动就能完成转发,完全不用敲命令。

方案2:临时创建NodePort服务——适合多机器访问场景

如果需要多个外部同事同时访问,或者需要转发的时间较长,可以临时创建一个NodePort类型的Service,用完就删,不会影响原有集群的端口规划。

操作步骤:

  1. 创建临时NodePort服务
    • 命令行方式:kubectl expose pod <mysql-pod-name> --type=NodePort --port=3306 --name=temp-mysql-myapp -n <你的命名空间>
    • Rancher UI方式:进入对应命名空间,点击「服务」->「创建」,选择「NodePort」类型,关联目标MySQL Pod,端口填3306,给服务起个临时名字(比如temp-mysql-myapp)。
  2. 获取暴露的节点端口
    执行命令:kubectl get svc temp-mysql-myapp -n <你的命名空间>,输出的PORT(S)列会显示类似3306:30123/TCP,这里的30123就是集群节点上暴露的临时端口。
  3. 用MySQL Workbench连接
    主机填集群中任意一个节点的IP,端口填刚才的30123,输入MySQL账号密码即可访问。
  4. 清理
    用完后删除临时服务:kubectl delete svc temp-mysql-myapp -n <你的命名空间>,或者在Rancher UI里直接删除这个服务,避免端口占用。
方案3:SSH隧道转发——适合无法直接访问K8s API的场景

如果你的外部机器无法直接连接Kubernetes API服务器(比如没有kubectl权限、网络隔离),可以通过SSH隧道先连接到集群节点,再转发到MySQL Pod。

操作步骤:

  1. SSH登录集群节点
    执行命令:ssh <节点用户名>@<节点公网/内网IP>
  2. 在节点上启动Pod端口转发
    在节点的终端里执行:kubectl port-forward <mysql-pod-name> 3306:3306 -n <你的命名空间>(需要节点上有kubectl权限,一般集群节点都会配置)。
  3. 本地建立SSH隧道
    打开本地新终端,执行:ssh -L 3306:localhost:3306 <节点用户名>@<节点IP>,这条命令会把本地3306端口转发到节点的3306端口。
  4. 用MySQL Workbench连接
    同样连接localhost:3306即可,和方案1的体验完全一致。
关键注意事项
  • 所有方案都不需要固定MySQL Pod到特定节点,完全符合你的部署需求。
  • 都是临时操作,用完清理后不会留下任何集群资源,也不会和其他服务的端口产生冲突。
  • 前提是你的外部机器能访问到Kubernetes API服务器(方案1、2)或者集群节点(方案3),网络打通是基础。

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

火山引擎 最新活动