【问题标题】:kubernetes: cannot access service on VirtualBox cluster via ClusterIP / NodePortkubernetes:无法通过 ClusterIP / NodePort 访问 VirtualBox 集群上的服务
【发布时间】:2018-10-29 19:08:24
【问题描述】:

我使用指令here 在 VirtualBox 上创建了一个 3 节点 kubernetes 集群(1 个 master + 2 个 worker)。我正在使用 Flannel 作为覆盖网络。

我在安装过程中在master上设置了sysctl -w net.bridge.bridge-nf-call-iptables=1sysctl -w net.bridge.bridge-nf-call-ip6tables=1。当时我还没有在worker上设置它们,但我后来设置了它们并重新启动了两个节点。

  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
    

如何调试这个?

【问题讨论】:

    标签: docker kubernetes flannel


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      如果有问题,请先检查:

      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')"
      

      为了测试,如您所提到的,将“port”和“targetPort”更改为 8080(或删除“targetPort”),例如:

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

      然后

      kubectl delete service foo-http
      

      然后再次创建您的服务,例如

      kubectl create -f UrServiceScript.yaml
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-08-23
        • 2019-07-26
        • 1970-01-01
        • 1970-01-01
        • 2021-06-27
        • 1970-01-01
        • 2019-06-18
        相关资源
        最近更新 更多