Kubernetes里面NodePort和Ingress以及ClusterIP在生产环境中如何选择?

654 阅读3分钟

本文已参与「掘力星计划」,赢取创作大礼包,挑战创作激励金。

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

NodePorts、LoadBalancers、Ingress有什么区别呢,它们都是将外部流量引入集群的不同实现方式。

ClusterIP(集群内部IP)

ClusterIP 服务是默认的 Kubernetes 服务。它为您提供集群内的服务,集群内的其他应用程序可以访问该服务。没有外部访问。

ClusterIP 服务的 YAML 如下所示:

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 代理访问它!

WX20211014-093004@2x.png 启动 Kubernetes proxy 模式:

$ kubectl proxy --port=8080

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

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

NodePort(节点端口)

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

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 选择端口。 WX20211014-093759@2x.png

这种方法有很多缺点:

  1. 每个端口只能有一项服务
  2. 您只能使用端口30000–32767
  3. 如果您的节点/虚拟机IP地址发生变化,您需要处理。

Ingress(入口)

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

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

默认的入口控制器将为您启动一个HTTP(S)负载均衡器(HTTP(S)负载均衡是一种基于代理的第7层负载均衡器,可让您在单个外部 IP 地址后面运行和扩缩服务)。这将使您可以对后端服务进行基于路径和基于子域的路由。

WX20211014-094735@2x.png

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

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 是基于七层网络负载均衡的,七层网络负载均衡和四层网络负载均衡的区别请参考这篇文章: # 四层、七层网络负载的区别?