外部用户如何访问在Kubernetes上运行的服务?

288 阅读2分钟

  本文将介绍如何使用NodePort、LoadBalancer、Ingress控制器三种方式将服务公开,供外部用户访问,并探讨三者之间何时使用?如何选择?

发布服务的三种方式:

  • NodePort 服务类型,将应用程序公开到每个节点上的端口上。
  • LoadBalancer 服务类型,创建一个指向Kubernetes服务的外部负载均衡器。
  • Ingress 管理外部访问的API对象,Ingress不会公开任何端口或协议。

NodePort

  如果将service.type设置为NodePort,Kubernetes控制器将从--service-node-port-range(默认值: 30000-32767)范围内分配一个端口,每个节点都将该端口代理到您的服务。虽然这对于大多数TCP或UDP客户端来说可能不是问题,但HTTP或HTTPS流量最终暴露在非标准端口上。但是,NodePort旨在作为高级入口模型(例如,LoadBalancer)的构建块,当您不需要生产环境URL时,它对于开发目的很方便。

LoadBalancer

  LoadBalance服务类型会自动部署一个外部负载均衡器,该外部负载均衡器与特定的IP地址关联,并将外部流量路由到集群中的Kubernetes服务。但不像NodePort,并不是所有的云提供商都支持LoadBalance服务类型。如果您在支持LoadBalancer服务类型的环境中,这可能是路由流量的最安全,最简单的方法。

Ingress

  一个API对象,用于管理对集群中服务的外部访问,通常是HTTP。Ingress可以提供负载均衡、SSL终止和基于名称的虚拟主机。Ingress控制器通常不会消除对外部负载均衡器的需要,只是在负载均衡器后面增加了一个额外的路由和控制层。将HTTP和HTTPS以外的服务公开到Internet时,通常使用Service.Type = NodePort或 Service.Type = LoadBalancer类型的服务。

  我们刚刚介绍了将外部流量路由到Kubernetes集群的三种基本模式,Ingress控制器和Kubernetes服务都需要一个外部负载均衡器,并且如前所述,NodePort不能直接用于生产的,但是,通常情况下,您的Kubernetes服务还将对入口施加其他要求。例如:

  • 基于内容的路由(例如,基于HTTP方法,请求标头或特定请求的其他属性的路由)
  • 弹性,例如速率限制,超时
  • 支持多种协议,例如WebSockets或gRPC
  • 认证方式

特定于服务的入口管理

  因此,进入策略的问题实际上是选择正确的方式来管理从外部负载均衡器到服务的流量。你有三种选择:

  • 选择一个Ingress控制器,例如 ingress-nginx
  • API Gateway,例如 Ambassador
  • 使用NGINX自定义部署

  假设您不想自己部署,那么如何在入口控制器和API网关之间进行选择?

参考链接:blog.getambassador.io/kubernetes-…