首页 文章

kubernetes:无法通过ClusterIP / NodePort访问VirtualBox集群上的服务

提问于
浏览
0

我使用说明here在VirtualBox上创建了一个3节点kubernetes集群(1个主2工作者) . 我正在使用Flannel作为覆盖网络 .

我在安装过程中在主设备上设置了 sysctl -w net.bridge.bridge-nf-call-iptables=1sysctl -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 回答

  • 1

    先检查是否有问题:

    kubectl describe service foo-http
    

    并尝试其他网络集群(例如:删除当前网络并部署编织网络)

    kubectl get -n kube-system daemonset | grep -i Flannel |cut -f1 -d ' '| kubectl delete daemonset -n kube-system 
     kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
    

    并且如您所述(或删除“targetPort”)测试将“port”和“targetPort”更改为8080,如:

    ports:
          - port: 8080
            targetPort: 8080
            nodePort: 31123
    

    然后

    kubectl delete service foo-http
    

    并再次创建您的服务

    kubectl create -f UrServiceScript.yaml
    
  • 1

    我认为您的服务清单选择器没有选择pod . 尝试描述pod并检查标签 . Kubectl描述pod然后根据您的pod标签更改您的服务清单 .

    最佳实践是通过编写部署或pod清单来使用声明性方法,而不是使用kubectl的命令式命令,例如run或create .

相关问题