Kubernetes服务访问-Nodeport、Loadbalancer和Ingress

阅读:474 2019-03-19 15:01:21 来源:新网

最近,有人问我nodeport,loadbalancer和ingress之间的区别是什么。它们是将外部流量引入群集的不同方式,并且实现方式不一样。我们来看看它们是如何工作的,以及什么时候该用哪种。

注意:本文适用于googlekubernetesengine。如果你在其他公有云、混合云、minikube等上运行,可能会略有不同。例如,您不能在minikube上使用loadbalancer。我也没有深入技术细节。如果您有兴趣了解更多,官方文档是一个很好的资源!

clusterip服务是默认的kubernetes服务。它为您提供集群内部其他应用程序可以访问的服务,外部无法访问。

clusterip服务的yaml类似这样:

apiversion:v1kind:servicemetadata:name:my-internal-serviceselector:app:my-appspec:type:clusteripports:-name:httpport:80targetport:80protocol:tcp

如果你不能从集群外部上访问一个clusterip服务,我为什么要谈论它?因为你可以使用kubernetesproxy来访问它!启动kubernetesproxy:

$kubectlproxy--port=8080

现在,你可以使用如下的kubernetesapi访问服务:

http://localhost:8080/api/v1/proxy/namespaces//services/:/

所以,如果要访问我们刚刚定义的服务,可以使用下面的地址:

http://localhost:8080/api/v1/proxy/namespaces/default/services/my-internal-service:http/什么时候用?

有几种情况可以使用kubernetesproxy来访问您的服务:

由于此方法要求您用已授权用户运行kubectl,因此您不应该使用此方法将您的服务公开到公网上或将其用于生产。

nodeport服务是暴露服务的最原始方式。顾名思义,nodeport会在所有节点(vm)上打开一个特定的端口,并且发送到此端口的任何流量都将转发到该服务。nodeport服务的yaml类似这样:

apiversion:v1kind:servicemetadata:name:my-nodeport-serviceselector:app:my-appspec:type:nodeportports:-name:httpport:80targetport:80nodeport:30036protocol:tcp

基本上,nodeport服务与普通的“clusterip”服务yaml定义有两点区别。首先,type是“nodeport”。还有一个称为nodeport的附加端口,指定在节点上打开哪个端口。如果你不指定这个端口,它会选择一个随机端口。

这种方法有许多缺点:

由于这些原因,我不建议在生产中使用这种方法。如果您运行的服务不必始终可用,或者您非常关注成本,则此方法适用于您,比如演示程序或临时应用。

loadbalancer服务暴露服务的标准方式。在gke上,这将启动一个网络负载平衡器,它将为您提供一个将所有流量转发到您的服务的ip地址。

如果你想直接暴露一个服务,这是默认的方法(gke上)。您指定的端口上的所有流量都将被转发到该服务,没有过滤、路由等。这意味着您可以发送几乎任何类型的流量,如http,tcp,udp,websockets,grpc或其他。

最大的缺点是,您使用loadbalancer公开的每项服务都将获得自己的ip地址,并且您必须为每个暴露的服务使用一个loadbalancer,这可能会付出比较大的代价!

与以上所有例子不同,ingress实际上不是一种服务。相反,它位于多个服务之前,充当集群中的“智能路由器”或入口点。

您可以使用ingress做很多不同的事情,并且有许多类型的ingress控制器,具有不同的功能。

gke默认的ingress控制器将为您启动一个http(s)负载均衡器。这将使您可以执行基于路径和基于子域名的路由到后端服务。例如,您可以将foo.yourdomain.com上的所有内容发送到foo服务,并将yourdomain.com/bar/路径下所有内容发送到bar服务的。在gke上的七层http负载均衡器的ingress对象yaml定义类似这样:

apiversion:extensions/v1beta1kind:ingressmetadata:name:my-ingressspec:backend:servicename:otherserviceport:8080rules:-host:foo.mydomain.comhttp:paths:-backend:servicename:fooserviceport:8080-host:mydomain.comhttp:paths:-path:/bar/*backend:servicename:barserviceport:8080什么时候用?

ingress可能是暴露服务最强大的方式了,但也可能是最复杂的。来自googlecloudloadbalancer,nginx,contour,istio等的ingress控制器类型很多。还有用于ingress控制器的插件,如cert-manager,可以为您的服务自动提供ssl证书。

相关文章
{{ v.title }}
{{ v.description||(cleanHtml(v.content)).substr(0,100)+'···' }}
你可能感兴趣
推荐阅读 更多>
推荐商标

{{ v.name }}

{{ v.cls }}类

立即购买 联系客服