在 Kubernetes 中公开服务

在 Kubernetes 中公开服务

我是 Kubernetes 新手,有一些疑问。我设置了一个由一个主节点和一个节点组成的 Kubernetes 集群。我部署了一个非常简单的基于 NodeJS 的应用程序,使用Deployment带有 2 个副本的 kind。然后,我通过 将其公开为服务kubectl expose deployment my-app --port=80

现在,我的服务如下所示:

root@sw-kubernetes01:~# kubectl get services
NAME             CLUSTER-IP        EXTERNAL-IP   PORT(S)   AGE
my-app           192.168.100.167   <none>        80/TCP    10m
kubernetes       192.168.100.1     <none>        443/TCP   1h

我是否应该通过导航到 来访问我的应用http://192.168.100.167:?我收到超时错误。否则,我如何获取外部 IP 来从外部访问服务?

我知道如果我将服务声明为type: NodePort,我可以使用节点 IP 访问我的应用程序,是否存在自动平衡 pod 之间负载的方法?

答案1

如果你正在本地集群上工作,则可以使用--type=NodePort

kubectl expose deployment my-app --port=80 --type=NodePort

然后 grep 查找端口

kubectl get svc my-service -o yaml | grep nodePort

您可以使用前面 grep 结果输出的集群 ip 和端口来浏览。

答案2

如果您在 GCE、EC2 或 OpenStack 上运行,通常需要一两分钟才能创建负载均衡器并EXTERNAL_IP填充字段。该字段中的 IP 是您用来访问服务的 IP。

如果您没有在 GCE、EC2 或 OpenStack 上运行,外部负载均衡器功能将不适合您,因为 Kubernetes 不知道如何在您的环境中创建一个。

答案3

正如问题中提到的,您可以访问节点端口使用提供的端口的服务

kubectl get svc my-service -o yaml | grep nodePort

以及任何公共节点 IP。但是,这些请求不需要最终到达您用于请求的 IP 所在的节点。实际上,这些请求会在集群内路由到与服务关联的任何 pod。因此,这里存在一些负载平衡。

相关内容