如何从 Docker-for-mac 或 Docker-for-Windows 获取可浏览的 url?

How to get browsable url from Docker-for-mac or Docker-for-Windows?

在 minikube 中,我可以通过 minikube service kubedemo-service --url 获得服务的 url。在 Kubernetes 模式下,如何在 Docker for Mac 或 Docker for Windows 中获取 type: LoadBalancer 服务的 URL?

service.yml 是:

apiVersion: v1
kind: Service
metadata:
  name: kubedemo-service
spec:
  type: LoadBalancer
  selector:
    app: kubedemo
  ports:
  - port: 80
    targetPort: 80

当我切换到 type: NodePort 和 运行 kubectl describe svc/kubedemo-service 我看到:

...
Type:                     NodePort
LoadBalancer Ingress:     localhost
...
NodePort:                 <unset>  31838/TCP
...

我可以浏览到 http://localhost:31838/ 来查看内容。切换到 type: LoadBalancer,我在 kubectl describe svc/kubedemo-service 中看到本地主机入口行,但我 ERR_CONNECTION_REFUSED 浏览到它。

(我熟悉 http://localhost:8080/api/v1/namespaces/kube-system/services/kubedemo-service/proxy/ 虽然这会更改站点的根目录,破坏 css 和假定根目录的 js 引用。我也熟悉 kubectl port-forward pods/pod-name 虽然这只连接到 pods 直到 k8s 1.10.)

如何在 Docker 中浏览到 type: LoadBalancer 服务(对于 Win)或 Docker(对于 Mac)?

How do I browse to a type: ClusterIP service or type: LoadBalancer service in Docker for Win or Docker for Mac?

当涉及到 kubernetes 网络级别的范围和服务级别的暴露时,这通常会造成混淆。以下是类型和范围的快速概述:

  • A ClusterIP 服务是默认的 Kubernetes 服务。它为您提供 inside 集群中的其他应用程序 inside 您的集群可以访问的服务。 没有外部访问。要在集群外访问它,您需要 运行 kube 代理(例如在标准仪表板示例中)。

  • LoadBalancer 服务 是向 Internet 公开服务的标准方式。负载平衡器访问和设置取决于云提供商。

  • NodePort 服务是将外部流量直接获取到您的服务的最原始方式。顾名思义,NodePort 在所有节点(VM)上打开一个特定端口,发送到该端口的任何流量都将转发到该服务。

这就是说,在 ClusteIP 上访问您的服务的唯一方法是从集群中的容器之一或在代理的帮助下,对于 LoadBalancer,您需要云提供商。您还可以使用自己的入口模拟 LoadBalancer(上游代理,例如 nginx,位于 ClusterIP 类型服务的前面)。

有用 link 更深入的解释和漂亮的图片:https://medium.com/google-cloud/kubernetes-nodeport-vs-loadbalancer-vs-ingress-when-should-i-use-what-922f010849e0

更新 LoadBalancer 讨论:

关于使用 LoadBalancer,这里是有用的参考文档 (https://kubernetes.io/docs/tutorials/stateless-application/hello-minikube/):

--type=LoadBalancer 标志表示您希望在集群外部公开您的服务。

  • 在支持负载平衡器的云提供商上,将提供外部 IP 地址以访问服务。
  • 在 Minikube 上,LoadBalancer 类型使服务可通过 minikube 服务命令访问。

    minikube service name-of-the-service
    

    这会自动打开浏览器 window,使用本地 IP 地址在服务端口上为您的应用提供服务。

LoadBalancer 将在 Docker-for-Mac 和 Docker-for-Windows 上工作,只要您是 运行 最近的构建.将类型翻转回 LoadBalancer 并更新。当您检查 describe 命令输出时,查找 Port: <unset> 80/TCP 行。并尝试点击 http://localhost:80.