Kubernetes Pod访问服务时出现Connection refused问题咨询
问题原因排查与解决方案
1. 核心故障原因:Service标签选择器与Pod标签不匹配
Kubernetes Service依靠selector字段匹配对应标签的Pod作为流量转发的后端目标:
- 你在Deployment的Pod模板中为Pod设置的标签是
app: simple-server-app - 你编写的
service.yaml中selector配置的是run: simple-server
两者完全不匹配,导致Service没有关联到任何可用的后端Pod,因此访问Service地址时会返回连接拒绝的报错。
修复方案:修改service.yaml的selector为和Pod一致的标签即可:
apiVersion: v1 kind: Service metadata: name: simple-server-svc labels: run: simple-server spec: ports: - port: 8080 targetPort: 8080 protocol: TCP selector: # 调整为与Pod标签匹配 app: simple-server-app
修改完成后重新执行kubectl apply -f service.yaml即可生效。
2. 潜在风险项:Node服务监听地址配置
你当前的server.js中监听逻辑如果显式绑定了localhost,会导致只有容器内部可以访问,集群内其他Pod、Service转发的流量都无法正常访问。
你当前的代码日志虽然打印的是localhost,Node 12版本默认未显式指定监听host时会监听0.0.0.0(所有网卡地址),为了避免后续修改代码引入问题,建议显式指定监听所有网卡:
app.listen(port, '0.0.0.0', () => { console.log(`Example app listening at http://0.0.0.0:${port}`) })
3. 额外校验项:Deployment YAML缩进问题
你提供的deployment.yaml中template字段缩进存在问题,和selector不是平级关系,如果执行kubectl apply时报错,需要调整缩进为如下格式:
spec: replicas: 2 selector: matchLabels: app: simple-server-app # template与selector平级,不要额外缩进空格 template: metadata: labels: app: simple-server-app spec: containers: - name: simple-server image: aroraankit7/simple-server:v1 ports: - containerPort: 8080
内容的提问来源于stack exchange,提问作者Ankit Arora
相关产品推荐
相关产品推荐

