我使用说明here在VirtualBox上创建了一个3节点kubernetes集群(1个主2工作者) . 我正在使用Flannel作为覆盖网络 .
我在安装过程中在主设备上设置了 sysctl -w net.bridge.bridge-nf-call-iptables=1
和 sysctl -w net.bridge.bridge-nf-call-ip6tables=1
. 我当时没有在工作人员上设置它们,但我稍后设置它们并重启两个节点 .
- 我有一个用Go编写的简单Web应用程序,在端口8080上侦听 . 我创建了一个pod复制控制器:
kubectl run foo --image=<...> --port=8080 --generator=run/v1
我可以使用POD IP和端口8080访问我的服务 .
- 我还创建了一个ClusterIP服务 .
kubectl expose rc foo --name=foo-http --port=8081 --target-port=8080 # ClusterIP service
# kubectl get svc foo-http
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
foo-http ClusterIP 10.106.88.24 <none> 8081/TCP 14m
当我从任何群集节点运行它时,它会挂起:
curl http://10.106.88.24:8081 # that's the ClusterIP
通过运行strace,我可以看到curl启动一个非阻塞 connect
,并在 poll
上的循环中旋转,而套接字没有为 read
做好准备 - 所以连接没有通过 .
- 如果我改为创建NodePort服务,我只是拒绝连接 .
# cat svc_nodeport.json
apiVersion: v1
kind: Service
metadata:
name: foo-http
spec:
type: NodePort
ports:
- port: 8081
targetPort: 8080
nodePort: 31123
selector:
app: foo
# kubectl create -f svc_nodeport.json
# kubectl get svc foo-http
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
foo-http NodePort 10.104.78.88 <none> 8081:31123/TCP 7m
当我尝试通过端口31123连接时:
# curl http://<node-ip>:31123 # Tried on master and both workers
curl: (7) Failed connect to <node-ip>:31123; Connection refused
怎么调试这个?
2 回答
先检查是否有问题:
并尝试其他网络集群(例如:删除当前网络并部署编织网络)
并且如您所述(或删除“targetPort”)测试将“port”和“targetPort”更改为8080,如:
然后
并再次创建您的服务
我认为您的服务清单选择器没有选择pod . 尝试描述pod并检查标签 . Kubectl描述pod然后根据您的pod标签更改您的服务清单 .
最佳实践是通过编写部署或pod清单来使用声明性方法,而不是使用kubectl的命令式命令,例如run或create .