当前位置: 首页 > 知识库问答 >
问题:

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

梁明辉
2023-03-14

我使用此处的说明在 VirtualBox 上创建了一个 3 节点 kubernetes 集群(1 个主 2 个工作线程)。我正在使用法兰绒作为覆盖网络。

我在安装过程中在主服务器上设置了< code > sysctl-w net . bridge . bridge-nf-call-iptables = 1 和< code > sysctl-w net . bridge . bridge-nf-call-IP 6 tables = 1 。我当时没有在workers上设置它们,但是我后来设置了它们并重新启动了两个节点。

>

  • 我有一个用 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个答案

    田博易
    2023-03-14

    首先检查是否有问题:

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

    对于测试,将“端口”和“目标端口”更改为您提到的8080(或删除“目标端口”),如下所示:

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

    然后

    kubectl delete service foo-http
    

    并再次创建您的服务。

    kubectl create -f UrServiceScript.yaml
    
    松涵容
    2023-03-14

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

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

     类似资料:
    • 在我的 OVH 托管 Kubernetes 集群中,我正在尝试公开 NodePort 服务,但看起来无法通过以下方式

    • 我正在尝试使用三个虚拟机(Master–10.x.x.4、Node1–10.x.x.150、Node2–10.x.x.160)创建Kubernetes集群。 我能够通过此链接成功创建留言簿应用程序:http://kubernetes.io/v1.0/examples/guestbook/.我只对frontend-service.yaml做了一个更改:使用NodePort。我可以使用节点IP和端口号

    • 什么起作用了? 使用Helm(启用RBAC)部署入口控制器 集群IP服务部署 什么不起作用? null K8S入口 注释中最后应用的配置(入口描述输出)显示入口资源清单。但是,我贴在下面作为参考 附加信息 null 任何关于我可能做错了什么的建议或见解将非常感谢。

    • 在 Kubernetes 集群内访问 TiDB 时,使用 TiDB service 域名 ${cluster_name}-tidb.${namespace} 即可。 若需要在集群外访问,则需将 TiDB 服务端口暴露出去。在 TidbCluster CR 中,通过 spec.tidb.service 字段进行配置: spec: ... tidb: service: ty

    • 我们在AWS EKS上运行两种类型的服务: null

    • 我假设上述证书的路径是主机上的路径,python脚本将从中获取文件,然后进行YAML构建? 测试呼叫3: 测试呼叫4: