暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Kubernetes NodePort vs LoadBalancer vs Ingress? 如何选择?

原创 活到老,学到老 2022-11-28
952


Kubernetes NodePort vs LoadBalancer vs Ingress? 如何选择?

最近有人问我 NodePorts、LoadBalancers 和 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 代理 --port=8080

现在,可以通过 Kubernetes API 访问此服务:

什么时候用这个?

在一些场景中,您会使用 Kubernetes 代理来访问服务。

  1. 调试服务,或某种场景下直接从本地电脑连接到它们
  2. 内部流量、显示内部仪表板等。

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

NodePort

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

这不是技术上最准确的图表,但它说明 NodePort 的工作原理

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”,还有一个是本机端口。如果不指定此端口,选择一个随机端口,大多数时候你应该让 Kubernetes 选择端口。

你什么时候用这个?

这种方法有很多缺点:

  1. 每个端口只能有一项服务

  2. 您只能使用端口 30000–32767

  3. 如果节点/虚拟机 IP 地址发生变化,需要调整

由于这些原因,我不建议在生产中使用这种方法来直接公开服务。

负载均衡器

LoadBalancer 服务是向 Internet 公开服务的标准方式。在云平台上,可以启动一个网络负载均衡器,它会提供一个 IP 地址,该地址会将所有流量转发到服务。

你什么时候用这个?

暴露一个服务的默认的方法,在指定的端口上的所有流量都将转发到该服务。没有过滤,没有路由等。

最大的缺点是产生云费用。

Ingress

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

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

例如,可以将 foo.yourdomain.com 上的所有内容发送到 foo 服务,并将 yourdomain.com/bar/ 路径下的所有内容发送到 bar 服务。

带有7层 HTTP 负载均衡器的 Ingress 对象的 YAML如下所示:

apiVersion: extensions/v1beta1

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 控制器,包括Cloud Load Balancer、Nginx、Contour、Istio等。还有一些用于 Ingress 控制器的插件,例如cert-manager,可以自动为您的服务提供 SSL 证书。

如果想在同一个 IP 地址下暴露多个服务,并且这些服务都使用相同的 7层协议(通常是 HTTP),则 Ingress 是最有用的。

云上当前最佳实践是LB+Ingress

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论