kubeadm搭建K8s集群后如何通过Ubuntu主机IP访问NodePort暴露的Pod内API
访问Pod内部API服务的几种可行方案
方案1:直接使用已配置的NodePort Service访问(推荐,适配你当前的集群配置)
你已经将Service设置为NodePort类型,该类型本身就支持通过集群任意节点的IP+分配的NodePort端口访问后端Pod服务,操作步骤如下:
- 执行命令查询Service分配的NodePort端口:
kubectl get svc <你的Service名称> -n <对应命名空间>
输出中PORT(S)列格式为<服务端口>:<NodePort>/TCP,其中第二个数字就是集群分配的NodePort端口,默认取值范围为30000-32767。 - 确认运行Pod的Ubuntu宿主机防火墙、云服务商安全组已放开该NodePort端口的入站规则,直接访问
http://<宿主机IP>:<NodePort端口>即可访问Pod内的API服务。
方案2:开启hostNetwork模式直接复用宿主机网络
如果你需要Pod直接绑定宿主机IP端口,无需经过Service转发,可以修改Deployment配置开启hostNetwork:
在Deployment的spec.template.spec字段下添加hostNetwork: true,配置示例如下:
apiVersion: apps/v1 kind: Deployment metadata: name: 你的Deployment名称 spec: replicas: 1 selector: matchLabels: app: 你的服务标签 template: metadata: labels: app: 你的服务标签 spec: hostNetwork: true # 开启宿主机网络复用 containers: - name: 你的容器名称 image: 你的服务镜像地址 ports: - containerPort: 8080 # 替换为你的API服务实际监听端口
配置更新后,Pod会直接使用宿主机的网络栈,API服务监听的端口会直接绑定在宿主机所有IP上,直接访问http://<宿主机IP>:<API服务端口>即可。
注意:开启hostNetwork后端口不能和宿主机本地进程、同节点其他开启hostNetwork的Pod端口冲突
方案3:端口转发(仅适合临时调试场景)
如果只是临时调试不需要长期暴露服务,可以使用kubectl端口转发功能:
执行命令:kubectl port-forward --address 0.0.0.0 pod/<你的Pod名称> <宿主机监听端口>:<Pod内API端口> -n <对应命名空间>
命令保持运行期间,就可以通过http://<宿主机IP>:<指定的宿主机监听端口>访问Pod内的API服务,命令停止后转发规则自动失效。
访问不通常见排查项
- 确认Pod状态为Running,无异常重启:
kubectl get pod -n <命名空间> - 确认Pod内API服务监听地址为
0.0.0.0而非127.0.0.1,否则仅支持Pod内部访问 - 确认宿主机iptables/ufw防火墙、云安全组已放开对应端口的入站访问
- 确认Service的selector标签和Pod的labels完全匹配,保证流量可以正常转发到后端Pod
内容的提问来源于stack exchange,提问作者Dhinesh Prabakaran
相关产品推荐
相关产品推荐

