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 代理来访问服务。
- 调试服务,或某种场景下直接从本地电脑连接到它们
- 内部流量、显示内部仪表板等。
因为此方法需要经过身份验证的用户身份运行 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 选择端口。
你什么时候用这个?
这种方法有很多缺点:
每个端口只能有一项服务
您只能使用端口 30000–32767
如果节点/虚拟机 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




