kubernetes:无法通过ClusterIP / NodePort

时间:2018-05-19 14:59:00

标签: docker kubernetes flannel

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

我在安装过程中在主服务器上设置了sysctl -w net.bridge.bridge-nf-call-iptables=1sysctl -w net.bridge.bridge-nf-call-ip6tables=1。我当时没有在工人身上设置它们,但我稍后设置它们并重启两个节点。

  1. 我有一个用Go编写的简单Web应用程序,在端口8080上侦听。我创建了一个pod +复制控制器:

    kubectl run foo --image=<...> --port=8080 --generator=run/v1
    

    我可以使用POD IP和端口8080访问我的服务。

  2. 我还创建了一个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做好准备 - 所以连接没有通过。

  3. 如果我改为创建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
    
  4. 如何调试?

2 个答案:

答案 0 :(得分:1)

我认为您的服务清单选择器没有选择容器。 尝试描述pod并检查标签。 Kubectl描述了pod 然后根据您的广告连播标签更改您的服务清单。

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

答案 1 :(得分: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')"

用于测试变更&#34;端口&#34;和&#34; targetPort&#34;你提到的8080(或删除&#34; targetPort&#34;),如:

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

然后

kubectl delete service foo-http

再次创建您的服务Ex。

kubectl create -f UrServiceScript.yaml