前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >NodePort、LoadBalancers和Ingress在Kubernetes生产中如何选择?

NodePort、LoadBalancers和Ingress在Kubernetes生产中如何选择?

作者头像
CNCF
发布2019-12-04 10:00:22
8200
发布2019-12-04 10:00:22
举报
文章被收录于专栏:CNCFCNCF

最近,有人问我NodePortLoadBalancersIngress之间有什么区别。它们都是将外部流量带入群集的不同方法,并且它们都以不同的方式进行。简单的说,生产环境建议使用Loadbalancer和Ingress,四层(TCP/UDP)代理使用Loadbalancer,七层(HTTP/HTTPS)代理使用Ingress。

让我们看一下它们各自的工作方式以及何时使用它们。

ClusterIP

ClusterIP是默认的Kubernetes服务类型。它为你提供了群集内部的服务访问方式,集群内的应用程序可以访问该服务。外部应用不能访问。

ClusterIP服务的YAML如下所示:

apiVersion: v1

kind: Service

metadata:

name: my-internal-service

spec:

selector:

app: my-app

type: ClusterIP

ports:

- name: http

port: 80

targetPort: 80

protocol: TCP

如果您无法从Internet访问ClusterIP服务,为什么要谈论它?原来您可以使用Kubernetes代理访问它!

启动Kubernetes代理: $ kubectl proxy --port=8080

现在,您可以使用以下方案浏览Kubernetes API以访问该服务:

http://localhost:8080/api/v1/proxy/namespaces/<NAMESPACE>/services/<SERVICE-NAME>:<PORT-NAME>/

因此,要访问我们上面定义的服务,您可以使用以下地址:

http://localhost:8080/api/v1/proxy/namespaces/default/services/my-internal-service:http/

什么时候用代理?

在某些情况下,您将使用Kubernetes代理访问服务。

  1. 调试服务,或出于某些原因直接从笔记本电脑连接到服务
  2. 允许内部流量,显示内部仪表板等

因为此方法要求您以经过身份验证的用户身份运行kubectl,所以不应使用此方法将服务公开到Internet或将其用于生产服务。

NodePort

NodePort服务是将外部流量直接转发到服务的最原始的方法。顾名思义,NodePort会在所有节点(VM)上打开一个特定的端口,并且发送到该端口的所有流量都将转发到该服务。

原图不准确,具有一定的误导性

NodePort服务的YAML如下所示:

apiVersion: v1

kind: Service

metadata:

name: my-nodeport-service

spec:

selector:

app: my-app

type: NodePort

ports:

- name: http

port: 80

targetPort: 80

nodePort: 30036

protocol: TCP

基本上,NodePort服务与普通的“ ClusterIP”服务有两个区别。首先,类型为“ NodePort”。还有一个名为nodePort的附加端口,用于指定要在节点上打开的端口。如果您未指定此端口,它将选择一个随机端口。大多数时候,您应该让Kubernetes选择端口。如thockin所说,有许多关于可使用的端口的警告。

什么时候用NodePort?

此方法有很多缺点:

  • 每个端口只能提供一次服务
  • 您只能使用端口30000–32767
  • 如果您的节点/ VM IP地址更改,则需要处理

由于这些原因,不建议在生产中使用此方法直接公开您的服务。如果您运行的服务不一定总是可用,或者您对成本非常敏感,则此方法将对您有用。NodePort服务一个很好的例子是演示应用程序或临时应用程序。

LoadBalancer

LoadBalancer服务是将服务公开到Internet的标准方法。在华为云CCE上,这将启动网络负载均衡器,该网络负载均衡器将为您提供一个IP地址,该地址会将所有流量转发到您的服务。

什么时候用Loadbalancer?

如果要直接公开服务,这是默认方法。您指定的端口上的所有流量都将转发到服务。没有过滤,没有路由等。这意味着您可以向它发送几乎任何类型的流量,例如HTTP,TCP,UDP,Websockets,gRPC或其他任何内容。

最大的缺点是,使用LoadBalancer公开的每个服务都将获得其自己的IP地址,并且您必须为每个公开的服务支付LoadBalancer的费用,这可能会变得昂贵!

Ingress

与上述所有示例不同,Ingress实际上不是一种服务。相反,它位于多种服务的前面,并充当“智能路由器”或集群的入口点。

您可以使用Ingress进行许多不同的操作,并且有许多类型的Ingress控制器具有不同的功能。

默认的CCE Ingress控制器将为您启动HTTP(S)负载均衡器,这将使您可以同时进行基于路径和基于子域的到后端服务的路由。例如,您可以将foo.yourdomain.com上的所有内容发送到foo服务,并将yourdomain.com/bar/路径下的所有内容发送到bar服务。

具有L7 HTTP负载均衡器的CCE上Ingress对象的YAML可能看起来像这样:

kind: Ingress

metadata:

name: my-ingress

spec:

backend:

serviceName: other

servicePort: 8080

rules:

- host: foo.mydomain.com

http:

paths:

- backend:

serviceName: foo

servicePort: 8080

- host: mydomain.com

http:

paths:

- path: /bar/*

backend:

serviceName: bar

servicePort: 8080

什么时候用Ingress?

Ingress可能是公开服务的最强大方法,但也可能是最复杂的。华为云端负载均衡器,Nginx,Contour,Istio等,有很多类型的Ingress控制器。还有一些用于Ingress控制器的插件,例如cert-manager,可以为您的服务自动设置SSL证书。

如果要在同一IP地址下公开多个服务,并且这些服务都使用相同的L7协议(通常为HTTP),则Ingress最有用。

原文地址:

https://medium.com/google-cloud/kubernetes-nodeport-vs-loadbalancer-vs-ingress-when-should-i-use-what-922f010849e0

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-25 06:48:00,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CNCF 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档