我是 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。因此,这里存在一些负载平衡。