Kubernetes中Service无法访问DaemonSet/Deployment的18081端口问题
从你的描述来看,Pod本身运行正常、port-forward能正常调用API,Service和Pod的关联也显示正常,但集群内就是连不上Service,转成Deployment也一样——这种情况我遇到过好多次,大概率不是Service配置的问题,而是下面几个容易忽略的点:
1. 容器内服务的监听地址是关键!
这是最常见的坑:很多服务默认会监听127.0.0.1(本地回环地址),这样只有容器自己能访问,Kubernetes的Service转发流量过来自然会被拒绝。
你可以先进入Pod里检查一下服务的监听情况:
kubectl exec -it <你的monerod-pod名称> -- netstat -tulpn
如果输出里看到127.0.0.1:18081,那问题就找到了!
解决方法很简单:修改monerod的启动参数,让它监听0.0.0.0(允许所有地址访问)。比如monerod通常需要加--rpc-bind-ip 0.0.0.0这个参数,具体可以查下它的官方文档,调整容器的启动命令就行。
2. 确认Service的targetPort和容器端口匹配
虽然你用kubectl expose生成的配置看起来没问题,但还是要确认下:
- Deployment里的
containerPort确实是18081 - Service的
targetPort有没有写错(如果是命名端口要对应,这里是数字端口应该没问题)
你可以用kubectl describe service monerod-deployment查看Service的Endpoints,如果Endpoints里显示了Pod的IP和18081端口,说明Service和Pod的关联是正常的;如果是空的,那才是选择器的问题,但你说UI里关联正常,所以这个可能性不大。
3. 检查网络策略是否拦截了流量
如果你的集群启用了网络策略(比如Calico、Cilium这类插件),可能存在阻止Pod访问Service的规则。你可以先看看当前命名空间有没有网络策略:
kubectl get networkpolicies
如果有相关策略,检查是否允许发起请求的Pod访问monerod的18081端口;或者临时禁用网络策略试试,看能不能正常访问。
4. 直接测试Pod IP的访问
既然Service访问不行,你可以在发起请求的Pod里直接curl目标Pod的IP和18081端口:
curl -X POST http://<monerod-pod的IP>:18081/json_rpc ...
如果这个也失败,那肯定是Pod本身的问题(比如服务没监听正确地址);如果这个成功,那才是Service的问题,但根据你的port-forward正常的情况,这个测试大概率会失败,还是回到监听地址的问题上。
5. 查看Pod日志确认服务启动状态
有时候容器里的服务可能没正确启动,或者启动参数有误,导致端口没监听。你可以看看Pod的日志:
kubectl logs <你的monerod-pod名称>
检查有没有服务启动失败的报错,或者确认启动参数里是否正确配置了监听地址。
总的来说,先优先检查服务监听地址这个点,解决这个问题后,Service的访问大概率就正常了!
内容的提问来源于stack exchange,提问作者thunder

