Kubernetes Ingress和Ingress Controller说明

Kubernetes Ingress 只是 Kubernetes 中的一个普通资源对象,需要一个对应的 Ingress Controller 来解析 Ingress 的规则,暴露服务到外部,比如 ingress-nginx,本质上来说它只是一个 Nginx Pod,然后将请求重定向到其他内部(ClusterIP)服务去,这个 Pod 本身也是通过 Kubernetes 服务暴露出去,最常见的方式是通过 LoadBalancer 来实现,或者使用 DaemonSet 的方式部署在指定 node 节点上,以 NodePort 的方式暴露出去

使用 Ingress 的缘由

Kubernetes 上的 NodePort 和 LoadBalancer 类型的 Service 资源能够把集群内部的服务暴露给集群外部客户端访问,但两个负载均衡资源必然产生更大的网络延迟,且会增加在云服务器静态IP地址及 LoadBalancer的开销。 因此 Kubernetes 为这种需求提供了一种更为高级的流量管理约束方式,尤其是对 HTTP/HTTS 协议的约束。

Kubernetes 使用 Ingress 控制器作为统一的流量入口,管理内部各种必要的服务,并通过 Ingress 这一 API 资源来描述如何区分流量及内部的路由逻辑。 有了 Ingress 和 Ingress Controller,可以通过定义路由流量的规则来完成服务发布,而无须创建一堆 NodePort 或 LoadBalancer 类型的 Service,而且流量也会由Ingress Controller 直接到达后端的 Pod 对象

  • NodePort 只支持四层的数据转发,不支持七层的HTTP 和HTTPS
  • NodePort 是基于节点的port 来使用,port是有限的

Ingress 定义

Ingress 公开了从集群外部到集群内服务的 HTTP 和 HTTPS 路由。流量路由由 Ingress 资源上定义的规则来控制。 file Ingress 资源基于 HTTP 虚拟主机或 URL 路径的流量转发规则,它把需要暴露给集群外部的每个 Service 对象,映射为 Ingress Controller 上的一个虚拟主机或某虚拟主机上的一个 PATH 路径 img

说明:Ingress 资源自身并不能进行 流量穿透 ,它仅是一组路由规则的集合

这些规则要真正发挥作用还需要其他功能的辅助,例如监听某套接字,然后根据这些规则的匹配机制真正完成流量路由等。实现该功能的组件就是 Ingress Controller。

Ingress Controller 说明

Ingress Controller 是一种能读懂 ingress 配置,并将其翻译成自己配置文件的应用程序,它本身就是一类以代理 HTTP/HTTPS 协议为主要功能的代理程序,通常兼有传输层的功能,它可以由任何具有反向代理(HTTP/HTTPS协议)功能的服务程序实现

Ingress 是把七层负载均衡转发的相关规则,抽象出来的一个组件,Ingress 是 Kubernetes API的标准资源类型之一,它其实就是一组基于 DNS 名称(host)或 URL 路径把请求转发到指定的 Service 资源的规则,用于将集群外部的请求流量转发到集群内部完成服务发布。但是Ingress 资源自身并不能进行 流量穿透 ,它仅是一组路由规则的集合。

注意: Ingress 控制器是 Kubernetes 集群的一个重要附件,它更像是一个自定义控制器,但支撑着 API Server 内置的 Ingress 资源及相关功能实现,该控制器需要在集群上单独部署。

Ingress Controller 通过与 Kubernetes API 交互,动态的去感知集群中 Ingress 规则变化,然后读取它,按照 Ingress 的模板生成一段 Nginx 配置,再写到 Nginx Pod 中,最后 reload 加载刷新,工作流程如下图: file

说明: Ingress Controller 不同于 Deployment 控制器,Ingress Controller 不直接运行为 kube-controller-manager 的一部分,它仅仅是 Kubernetes 集群的一个附件,类似于 CoreDns,需要在集群上单独部署 file

使用 Ingress 资源进行流量分发时,Ingress Controller 可基于某 Ingress 资源定义的规则将客户端的请求流量直接转发至 Service 对应的后端 Pod 资源之上,这种转发机制会绕过 Service 资源,直达应用 Pod,从而省去了由 Kube-proxy 实现的端口代理开销

上图说明:

  • ingress-nginx-service 是引入外部流量到达 Ingress-nginx-Controller,也可以使用 DaemonSet 控制器部署 Ingress Controller,让它共享 node节点网络,监听在符合对应 labels 的node节点上,从而把服务暴露出来

  • site1-service 的作用是 使用 Service的 Selector 标签,辅助 Ingress Controller 来匹配后端 endpoints 的 Pod 加入到 Ingress Controller 的 backend 中,类似于 Nginx 的 upstream,它不转发 Ingress Controller 的流量到后端断点 pod,如果后端 pod 发生变动,则 Service 会自动更新 endpoints,Ingress 通过于 API Server交互,获取变动信息后,会将信息注入到 Ingress Controller 管理的 7 层负责 Nginx 配置文件中,并reload 加载更新

  • Ingress 规则需要由一个 Service 资源对象辅助识别所有相关 Pod 对象,但是 Ingress Controller 可经由 site1.ikubernets.io 规则的定义直接将请求流量调度值 Pod1 或 Pod 2,而无须经由 Service 对象 API 的再次转发。


Kubernetes Ingress和Ingress Controller说明
http://www.qiqios.cn/2022/01/12/kubernetes-ingress和ingress-controller说明/
作者
一亩三分地
发布于
2022年1月12日
许可协议