Kubernetes-NodePort vs Loadbalancer vs Ingress 在生产中如何选择?

最近,有人问我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 NodePort vs Loadbalancer vs Ingress 在生产中如何选择?

在客户端使用kubectl转发了本地端口到pod端口的连接:

kubectl port-forward service/nginx 8080:80
Forwarding from 127.0.0.1:8080 -> 80
Forwarding from [::1]:8080 -> 80
Handling connection for 8080

现在,您可以访问该服务了:

$ curl http://localhost:8080/

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

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

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

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

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

什么时候用代理?

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

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

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

NodePort

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

Kubernetes NodePort vs Loadbalancer vs Ingress 在生产中如何选择?原图不准确,具有一定的误导性

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 地址,该地址会将所有流量转发到您的服务。

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  type: LoadBalancer
  selector:
    app: nginx
  ports:
  - port: 80
    targetPort: 80

什么时候用 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 服务。

Kubernetes NodePort vs Loadbalancer vs Ingress 在生产中如何选择?

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

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

Ingress与service最大的区别:Ingress 不是服务类型,但它充当集群的入口点。 它可以将路由规则整合到一个资源中,因为它可以在同一IP地址下公开多个服务。

其他:

1. 根据最近大约两年的Kubernetes生产部署经验,涉及140多个Pod,15多个服务。不要使用NodePort,否则迟早会遇到麻烦,例如安全问题和端口管理混乱,甚至有些团队正在使用NodePort检查其他相关的微服务运行状况。一旦将其部署在严格的网络环境(如AWS,Azure公共云或某些严格的承诺环境)中,就会出现一些奇怪的行为。

Sandeep,尽管您警告不要在服务上使用NodePorts,但据我了解,要使用Google Cloud Ingress控制器,您需要为服务设置NodePort:https : //github.com/kubernetes/ingress-gce #l7-kubernetes上的负载平衡

正确,但是在这种情况下,它有所不同,因为您不是直接使用NodePort,这只是LB将流量转发到群集的一种方式。该团队正在研究高级网络功能,这些功能将删除该hacky解决方案,并为您提供本机入口,而无需打开NodePort。

 

 

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值