如何通过ClusterIP访问Kubernetes服务

18

我正在尝试使用三台虚拟机(Master-10.x.x.4、Node1-10.x.x.150、Node2-10.x.x.160)创建Kubernetes集群。

我成功地创建了客户端应用程序,遵循以下链接:http://kubernetes.io/v1.0/examples/guestbook/。我仅对frontend-service.yaml进行了一个更改:使用NodePort。我可以使用节点IP和端口号(10.x.x.150:30724或10.x.x.160:30724)访问前端服务。因此,一切都按预期工作,但是我无法使用ClusterIP地址(在我的情况下为10.x.x.79)访问前端服务。

我对NodePort的理解是,可以通过群集IP和群集的每个节点上的端口访问服务。如何通过ClusterIP访问服务,以便我不必访问每个节点?我错过了什么吗?

服务和Pod详细信息

$sudo kubectl describe service frontend

Name:                   frontend
Namespace:              default
Labels:                 name=frontend
Selector:               name=frontend
Type:                   NodePort
IP:                     10.x.x.79
Port:                   <unnamed>       80/TCP
NodePort:               <unnamed>       30724/TCP
Endpoints:              172.x.x.13:80,172.x.x.14:80,172.x.x.11:80
Session Affinity:       None

No events.

$sudo kubectl describe pod frontend-2b5us

Name:                           frontend-2b5us
Namespace:                      default
Image(s):                       gcr.io/google_samples/gb-frontend:v3
Node:                           10.x.x.150/10.x.x.150
Labels:                         name=frontend
Status:                         Running
Reason:
Message:
IP:                             172.x.x.11
Replication Controllers:        frontend (3/3 replicas created)
Containers:
  php-redis:
    Image:              gcr.io/google_samples/gb-frontend:v3
    State:              Running
      Started:          Fri, 30 Oct 2015 04:00:40 -0500
    Ready:              True
    Restart Count:      0

我尝试搜索,但没有找到与我的问题完全相同的解决方案,但我发现了一个类似于GCE的问题。

为什么无法通过IP访问我的Kubernetes服务?

2个回答

18
你没有ClusterIP服务,但你有NodePort服务。要访问该服务,你需要连接到群集中任意一个节点的NodePort,就像你已经发现的那样。在这里,你会获得负载均衡。尽管你连接到群集节点,但你获取的Pod不一定在那个特定的节点上运行。
阅读文档中的相关部分,了解更多服务类型:https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services---service-types。在GCP上,你可能不想使用NodePort。
谈到ClusterIP。为了进行调试目的而访问ClusterIP服务,你可以运行kubectl port-forward。你实际上不会访问服务,而是直接连接到其中一个Pod。
例如:
kubectl port-forward frontend-2b5us 80 8080

现在连接到 localhost:8080

更复杂的命令,它可以自动发现给定命名空间 -n weave 和选择器的端口。摘自https://www.weave.works/docs/scope/latest/installing/

kubectl port-forward -n weave \
    "$(kubectl get -n weave pod \
         --selector=weave-scope-component=app \
         -o jsonpath='{.items..metadata.name}')" \
    4040

6

你是从哪里访问clusterIP的?clusterIP(默认情况下)只能在集群内部工作。它是虚拟IP,不进行路由。


我正在尝试首先在集群内访问,以及如何配置以访问集群IP地址在集群外(不是公共网络)的情况下。我已经尝试了所有防火墙之外的方法。 - Ethiraj Krishna
从集群内部,clusterIP 应该可以工作。你能解释一下你遇到了什么错误吗?你可能还想阅读 http://docs.k8s.io/v1.0/user-guide/debugging-services.html。 - Tim Hockin
谢谢你的回复,Tim。正如我之前提到的那样,我在我的frontend-service.yaml中使用了type = NodePort,因此我可以使用Node的IP和Node端口访问我的应用程序。我正在尝试找出一种方法来外部访问一个服务端点,以便我不必处理负载平衡。似乎type = LoadBalancer可能支持这一点,但大多数文档都说它适用于云提供商,但不确定如何在我的环境中使用它。再次说明,这可能是我对文档的理解不足。 - Ethiraj Krishna
LoadBalancer类型仅适用于支持负载均衡器配置的云。您可以设置自己的负载均衡器,例如https://github.com/kubernetes/contrib/tree/master/service-loadbalancer。 - Tim Hockin
谢谢,我会尝试的。 - Ethiraj Krishna
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接