Ingress 网络原理
Ingress 是 Kubernetes 中管理外部访问集群内服务的 API 对象,通常是 HTTP/HTTPS。Ingress 可以提供负载均衡、SSL 终止和基于名称的虚拟主机等功能。
为什么需要 Ingress?
在 Kubernetes 中,Pod 和 Service 已经提供了集群内部的网络通信能力,但是对于从集群外部访问集群内服务,还需要更灵活的方案:
- NodePort 服务类型需要使用非标准端口(30000-32767),不够用户友好
- LoadBalancer 服务类型需要为每个服务创建一个负载均衡器,成本高昂
- 需要基于 HTTP 路径和主机名进行路由的能力
- 需要集中管理 SSL/TLS 证书
- 需要实现复杂的流量控制,如重写、重定向等
Ingress 正是为了解决这些问题而设计的,它提供了一个统一的入口点,可以根据不同的规则将流量路由到不同的后端服务。
Ingress 工作原理
Ingress 资源
Ingress 资源是 Kubernetes API 中的一个对象,它定义了从集群外部到集群内 Service 的路由规则。Ingress 资源本身不会做任何事情,它需要 Ingress 控制器来实现其功能。
Ingress 控制器
Ingress 控制器是实现 Ingress 功能的组件,它监听 Ingress 资源的变化,并根据 Ingress 规则配置负载均衡器。Kubernetes 本身不提供 Ingress 控制器,需要单独部署。
常见的 Ingress 控制器包括:
- Nginx Ingress Controller:基于 Nginx 的 Ingress 控制器,是最常用的实现
- Traefik:一个现代化的 HTTP 反向代理和负载均衡器
- HAProxy Ingress:基于 HAProxy 的 Ingress 控制器
- Kong Ingress Controller:基于 Kong API 网关的 Ingress 控制器
- Istio Ingress Gateway:Istio 服务网格的入口网关
Ingress 控制器的工作流程:
- 监听 Kubernetes API 服务器上 Ingress 资源的变化
- 解析 Ingress 规则,生成相应的配置
- 配置负载均衡器(如 Nginx)以实现流量路由
- 处理 TLS 终止、路径重写等功能
Ingress 规则
Ingress 规则定义了如何将 HTTP/HTTPS 流量路由到 Kubernetes 服务。规则基于主机名和 URL 路径。
基于主机名的路由
可以根据不同的主机名将流量路由到不同的服务:
基于路径的路由
可以根据 URL 路径将流量路由到不同的服务:
路径类型
Kubernetes 支持三种路径类型:
- Exact:精确匹配 URL 路径
- Prefix:基于 URL 路径前缀匹配
- ImplementationSpecific:由 Ingress 控制器决定匹配方式
TLS 配置
Ingress 可以配置 TLS,为入站连接提供安全通信。TLS 配置需要一个包含证书和私钥的 Secret。
当配置了 TLS 后,Ingress 控制器会:
- 加载 Secret 中的证书和私钥
- 配置负载均衡器以终止 TLS 连接
- 将解密后的 HTTP 请求转发到后端服务
Ingress 实现细节
Nginx Ingress Controller 架构
以最常用的 Nginx Ingress Controller 为例,它的架构包括:
- Nginx:作为反向代理和负载均衡器
- Controller:监听 Ingress 资源并生成 Nginx 配置
- ConfigMap:存储 Nginx 配置模板
- Service:暴露 Nginx Ingress Controller
工作流程:
- 用户创建或修改 Ingress 资源
- Controller 监听到变化,解析 Ingress 规则
- Controller 生成新的 Nginx 配置
- Nginx 重新加载配置,开始按新规则路由流量
Ingress 与 Service 的关系
Ingress 不直接与 Pod 通信,而是通过 Service 与 Pod 通信:
- 外部流量首先到达 Ingress 控制器
- Ingress 控制器根据规则将流量路由到相应的 Service
- Service 再将流量路由到后端 Pod
这种设计使得 Ingress 可以利用 Service 提供的负载均衡和服务发现功能。
Ingress 注解
Ingress 资源支持通过注解(Annotations)来配置特定于 Ingress 控制器的功能。不同的 Ingress 控制器支持不同的注解。
常用 Nginx Ingress 注解
Ingress 高级功能
除了基本的路由功能外,Ingress 还可以实现许多高级功能:
1. 金丝雀发布
使用注解可以实现流量分割,将一部分流量路由到新版本的应用:
2. 速率限制
限制客户端的请求速率,防止过载:
3. 认证
为路由添加基本认证:
4. 自定义错误页面
配置自定义错误页面:
Ingress 排障
在排查 Ingress 问题时,可以使用以下命令和工具:
常用 Ingress 排障命令
Ingress 是 Kubernetes 网络模型中的重要组成部分,它提供了从集群外部访问集群内服务的灵活方式。理解 Ingress 的工作原理对于构建可靠的 Kubernetes 应用至关重要。
了解 CNI 插件