集群外无法访问 NodePort 类型的服务

NodePort type service not accessible outside cluster

我正在尝试在 Windows 机器上使用 minikube 设置本地集群。按照 kubernetes.io 中的一些教程,我得到了集群的以下清单:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: external-nginx-deployment
  labels:
   app: external-nginx
spec: 
  selector: 
    matchLabels: 
      app: external-nginx
  replicas: 2 
  template: 
    metadata: 
      labels:
        app: external-nginx
    spec: 
      containers: 
      - name: external-nginx
        image: nginx 
        ports: 
        - containerPort: 80 
---
apiVersion: v1
kind: Service 
metadata: 
  name: expose-nginx 
  labels: 
   service: expose-nginx
spec: 
  type: NodePort 
  selector: 
    app: external-nginx 
  ports: 
  - protocol: TCP
    port: 80
    targetPort: 80
    nodePort: 32000

如果我做对了,这应该创建一个带有 nginx 实例的 pod,并将它暴露给主机的 32000 端口。 但是,当我 运行 curl http://$(minikube ip):32000 时,我收到 连接被拒绝 错误。

我 运行 bash 在服务 expose-nginx 中通过 kubectl exec svc/expose-nginx -it bash 并且从那里我能够访问 external-nginx pods 正常,这让我相信这不是集群内的问题。

我也尝试将服务类型更改为 LoadBalancer 并启用 minikube tunnel,但得到了相同的结果。

有什么我遗漏的吗?

几乎总是默认 minikube 使用 docker 驱动程序来创建 minikube 虚拟机。在主机系统中,它看起来像是 VM 的一个大 docker 容器,其中其他 kubernetes 组件也是 运行 作为容器。基于服务的测试 NodePort 通常不起作用,因为它应该喜欢访问通过 NodePort 公开的服务应该在 minikube_IP:NodePort 地址上工作。

解决方案是:

  • 对于本地测试,使用 kubectl port-forward 将服务暴露给本地机器(OP 所做的)

  • 使用 minikube service 命令将服务暴露给主机。工作方式与 kubectl port-forward.

    非常相似
  • 而不是 docker 驱动程序使用适当的虚拟机,它将获得自己的 IP 地址(VirtualBoxhyperv 驱动程序 - 取决于系统)。 Reference.

  • (与 minikube 无关)为 Windows 使用 Docker 桌面中的内置功能 kubernetes。我已经 并且服务类型应该是 LoadBalancer - 它将在 localhost.

    上暴露给主机