从互联网访问 kubernetes 上的应用程序 运行

Access an application running on kubernetes from the internet

我很确定这是 运行 在 kubernetes 上运行应用程序时的基本用例,但直到现在我都找不到教程,也无法从文档中理解, 如何让它发挥作用。

我有一个应用程序正在侦听 port 9000。因此,当 运行 在我的本地主机上时,我可以通过网络浏览器在 localhost:9000 上访问它。当 运行 在 docker 容器中时,在我的 VPS 上 运行ning,它也可以在 myVPSAddress:9000 上访问。现在的问题是,如何将它部署在 kubernetes 运行 上 Virtual Private Server 上,并将应用程序公开为可见,就像部署在 docker 上一样。我可以从 VPS 内的集群地址访问应用程序,但不能访问服务器本身的 IP 地址。谁能告诉我一些基本的 docker 文件,并说明它在做什么,或者告诉我一些简单的方法,如何让它工作?谢谢

虽然有人会认为这是一个非常基本的用例,但对于 运行 在裸机服务器上安装自己的 kubernetes 集群的人来说情况并非如此。 (你在 VPS 上的方式)。

向 "the world" 公开应用程序的推荐方法是使用 kubernetes services, see this piece of documentation about exposing services. You define a kubernetes service, either of the type NodePort or of type Loadbalancer *.

这是一个简单的服务的样子(提示:它是默认类型 NodePort):

kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
  - protocol: TCP
    port: 9000
    targetPort: 9376

这将在端口 9376 的 VPS 集群的所有节点上公开带有标签 name: my-service 的服务(内部 运行ning 端口 9000)。

假设你的节点有一个 public IP(从你的问题我假设他们有),你可以安全地做 curl localhost:9376.

因为这通常不适合 UX/UI 向用户公开,所以人们使用 Loadbalancer 类型的服务。此服务类型为您的每个服务提供唯一的 IP,而不是端口。

这些服务首先是 class 云托管集群上的公民,例如 Google 的 GKE,但是如果你 运行 你自己的 Kubernetes 集群(设置使用说 kubeadm),那么你需要部署你的 Loadbalancer 服务提供者。我用过优秀的MetalLB and it works flawlessly once it's been setup, but you need to set it up yourself. If you want dns names for you services as well, you should also look at ExternalDNS.


* 这里需要注意的是,如果您能以某种方式使该 IP 可路由,您也可以使用类型为 ExternalIP 的服务,但除非网络在您的控制之下,否则这通常不是一种可行的方法,并且我建议改为查看 LB 提供商。