一、什么是 Ingress¶
Ingress为Kubernetes集群中的服务提供了入口,Ingress 可为 Service 提供外部可访问的 URL、负载均衡流量、终止 SSL/TLS,以及基于名称的虚拟托管。在生产环境中常用的Ingress有Treafik、Nginx、HAProxy、Istio等。
相对于Service,Ingress.工作在七层(部分Ingress:控制器支持4和6层),所以可以支持HTTP协议的代理,也就是基于域名的匹配规则。
通俗来讲,Ingress和之前提到的Service、Deployment等类似,也是一个Kubernetes的资源对象,Deployment是用来部署应用的,Ingress就是实现用域名的方式访问应用。Ingress实现的方式有很多,比如Nginx、HAProxy、Treafik等,就Nginx而言,和上述提到的传统服务架构用Nginx类似。Ingress控制器在每个符合条件的宿主机上部署一个Pod,这个Pod里面运行的就是Nginx进程,里面的实现逻辑和宿主机部署Nginx的方式并无太大区别,关键区别是宿主机部署的Nginx需要更改Nginx的配置文件配置域名,而Ingress则和其他Kubernetes资源文件一样,使用YAML文件进行配置,之后Ingress控制器根据YAML文件定义的内容自动生成对应的配置文件。
在Kubernetes v1.1版中正式引用Ingress的概念,用于从集群外部到集群内部Service的HTTP和HTTPS路由,可以配置提供服务外部访问的URL、负载均衡和终止SSL,并提供基于域名的虚拟主机。流量从Internet到Ingress再到Services最后到Pod上,通常情况下,Ingress部署在所有的Node节点上,暴露443和80端口(一般通过hostNetwork的方式部署Ingress),之后再通过F5或公有云LB代理到对应的Ingress节点上,之后将域名解析到F5或公有云LB即可实现基于域名的服务发布。

二、Ingress 服务发布架构¶
传统架构 VS K8s 架构¶
下面对比一下在有无使用Kubernetes的的架构中,部署一个应用并使用域名进行发布的流程如下:

传统服务发布架构流程:
1.用户在浏览器中输入域名
2.域名解析至业务的入口IP(一般为外部负载均衡器,比如阿里云的SLB或者DMZ的网关)
3.外部负载均衡器反向代理至内网负载均衡(比如阿里云的SLB或者Nginx)
4.内网负载均衡根据自身的配置找到对应的程序
k8s服务发布架构流程:
1.用户在浏览器中输入域名
2.域名解析至业务的入口IP(一般为外部负载均衡器,比如阿里云的SLB或者DMZ的网关)
3.外部负载均衡器反向代理至Kubernetes的入口(一般为Ingress,或者通过NodePort暴露的服务等)
4.Ingress根据自身的配置找到对应的Service,再代理到对应的Service上
5.Ingress Controller监听Ingress资源,因为之前Ingress Controller配置了Service,从而通过Endpoints获取到Pod的IP:Port,直接将流量转发到对应的Pod
三、Ingress 的组成¶
下面以对比k8s架构和传统架构的方式进行说明:

Ingress相当于传统架构的nginx.conf,具有命名空间限制
Ingress Controller相当于传统架构的Nginx,没有命名空间限制
在k8s架构中,Ingress用于指定后端的那个服务,相当于传统架构中nginx.conf配置文件(用于指定后端的哪一台服务器上);
k8s架构中的Ingress Controller等同于传统架构中的nginx,代表的是服务。
Ingress和nginx对比表格如下:
| 概念 | 传统 Nginx | Kubernetes |
|---|---|---|
| 配置定义 | 手动编写 nginx.conf |
声明式定义 Ingress 资源 YAML |
| 配置生效 | 修改文件后需 nginx -s reload |
Ingress Controller 自动监听并更新配置 |
| 反向代理实例 | 手动部署 Nginx 服务器 | Ingress Controller Pod 运行在集群中 |
| 路由规则管理 | 分散在多个 Nginx 配置文件中 | 集中通过 Kubernetes API 管理 |
| 动态能力 | 依赖人工操作或脚本 | 支持自动发现服务、证书续期等 |
小结:
- Ingress ≈
nginx.conf的 Kubernetes 抽象(定义规则) - Ingress Controller ≈ 自动化的 Nginx 实例(实现规则)
四、Ingress 生产级高可用架构¶
在生产环境中,实现高可用的 Ingress 架构是非常重要的,因为 Ingress 控制着对集群内服务的流量路由和负载均衡。以下是一种常见的 Ingress 生产级高可用架构:
1.高可用 Ingress Controller:部署多个 Ingress Controller 实例,并将它们分布在不同的节点或可用区中,以确保在部分节点或区域故障时,其余 Ingress Controller 仍然可用。可以使用 Kubernetes 横向扩展功能来部署多个副本的 Ingress Controller。
2.外部负载均衡器:在 Ingress Controller 前面使用外部负载均衡器(如云厂商提供的负载均衡器或独立负载均衡器)来实现流量的分发。这样,即使某个 Ingress Controller 故障,负载均衡器仍然能够将流量路由到其他可用的 Ingress Controller。
3.内部负载均衡:对于 Ingress Controller 内部的流量负载均衡,可以使用一些负载均衡策略,如 Round Robin、Least Connections 或 IP Hash,确保流量均匀地分发给后端的服务实例。
4.备份和恢复:定期备份和持久化 Ingress Controller 的配置信息,以便在出现故障时快速恢复配置。同时,备份 Ingress Controller 的状态信息,例如 Session 状态,以保证无感知的恢复。
5.监控和告警:使用监控工具对 Ingress Controller 和后端服务进行监控,以及时发现潜在的故障并采取措施。设置合适的告警规则,及时通知运维人员。
6.异地多活:在有条件的情况下,可以考虑跨多个地理位置部署 Ingress Controller,以实现异地多活,提高整体的高可用性。
7.网络隔离:确保 Ingress Controller 所在的网络环境和后端服务的网络环境有适当的隔离,防止网络问题在整个系统中蔓延。
8.故障自动转移:使用合适的技术手段(如容器编排工具、Kubernetes 的节点故障转移等)实现 Ingress Controller 的自动转移和恢复,确保故障时的快速响应和恢复。
