Ingress

Ingress实现通常由两个组件组成:

  • Ingress Resource: Ingress Resource是配置路由规则

  • Ingress Controller: Ingress Controller 是Ingress API对象的一个实例,负责监控Kubernetes Ingress Resource并根据所需行为提供一种或多种机制

Ingress是Kubernetes的API对象,用于管理外部访问集群中的某个服务,通常是HTTP服务。Ingress可以提供负载均衡,SSL卸载以及基于名字解析的虚拟主机。

Ingress将集群内部的 Kubeernetes服务(services) 输出到外部的HTTP和HTTPS路由。流量路由是在Ingress资源(Ingress Resource)所定义的规则来控制的。

Ingress可以将给定的服务配置成外部可以访问的URLs,负载均衡流量,卸载SSL/TLS,以及提供基于名字的虚拟主机。而一个 Ingress控制器(controller) 则负责管理Ingress,结合负载均衡,就可以通过Ingress Controller配置边界路由器或者增加前端来帮助处理流量。

Ingress不会输出随机端口或协议。对于需要输出HTTP和HTTPS以外的服务则通常使用 Service.Type=NodePort 或者 Service.Type=LoadBalancer (参考 Kubeernetes服务(services) )。

备注

有多种 Ingress控制器(controller) 可以选择,即有多种负载均衡可以作为容器实例运行在边界,例如 NGINX, HAProxy, Istio, Gloo 等等。例如opensource.com上文章 Try this Kubernetes HTTP router and reverse proxy 介绍了采用 zalando开发的skipper 实现Ingress(我准备后续实践)。

为了有感性认识,请参考 Kubernetes部署registry仓库 ,其中采用了 NGINX Ingress 来实现。

备注

../../../_images/ingress.png

流量发送给服务的简单Ingress示例

Ingress可以配置为 Kubeernetes服务(services) 提供外部可访问的(externally-reachable) URLs,负载均衡流量,终结 SSL/TLS ,以及提供基于名字的虚拟主机(name-based virtual hosting)(这些都是传统的WEB服务器 Nginx 的功能)。 Ingress控制器(controller) 负责实现Ingress(fulfilling the Ingress,我理解就是负责控制类似 Nginx 这样的ingress resources配置),通常是通过负载均衡来实现Ingress(也就是类似NGIX内置的反向代理功能,转发流量给后端实际应用服务器)。不过 Ingress控制器(controller) 也能够配置边缘路由器或者其他前端来帮助处理流量(这里 Ingress Controller 的功能边界有点模糊,可能有些厂商也增加了通过 Ingress Controller 来控制一些特定厂商的路由器)。

Ingress 一般仅负责 HTTP 和 HTTPS 服务的对外公开,其他端口和协议通常使用 NodePort类型 Kubernetes服务LoadBalancer类型 Kubernetes服务 来做对外公开。

备注

不过, Kubernetes Ingress控制器Nginx 也支持 UCP/TCP 反向代理,所以实际上也可以用 Kubernetes Ingress控制器Nginx 来完成对外 ssh服务 输出(标准方法是使用 LoadBalancer类型 Kubernetes服务 )

参考