在 Kubernetes 集群中,服务之间的通信和外部流量的引入通常是至关重要的。虽然 NodePort
和 LoadBalancer
是最常见的解决方案,但当集群内部的服务逐渐增多时,管理不同服务的流量变得复杂。这个时候,Ingress 作为一种强大的流量管理工具,便应运而生。
本文将深入探讨 Kubernetes Ingress 的工作原理、主要功能、配置方法以及它与传统 Service 方式的对比,帮助你更好地理解和使用 Ingress。
什么是 Kubernetes Ingress?
Ingress 是 Kubernetes 中的一种资源类型,用于管理 HTTP 和 HTTPS 流量的路由。它允许你根据域名、路径等规则,将外部流量引导到集群内部的不同服务。Ingress 的出现极大简化了流量管理,尤其在多服务、多环境的场景下,它为流量路由提供了一个集中的配置点。
Ingress 并不是一个直接的负载均衡器,而是通过 Ingress 控制器 来实现流量的路由、负载均衡、SSL 终止等功能。常见的 Ingress 控制器包括 Nginx、Traefik 和 HAProxy 等。
Ingress 的主要功能
-
基于路径的流量路由
Ingress 允许你根据 HTTP 请求的路径将流量路由到不同的服务。例如,访问example.com/api
时,流量将被转发到service-api
,而访问example.com/web
时,流量将被转发到service-web
。 -
TLS/SSL 终止
通过配置 Ingress,你可以方便地启用 HTTPS 访问,并配置 SSL 证书。Ingress 控制器会负责处理 SSL 终止(即处理加密解密的工作),而将解密后的请求转发到后端服务。 -
负载均衡
Ingress 控制器会自动为服务提供负载均衡的功能。对于多个后端实例,Ingress 控制器会根据负载均衡算法(如轮询、加权轮询等)将请求分发到不同的服务实例。 -
路径重写和自定义规则
使用注解和 Ingress 控制器的配置,可以对请求路径进行重写,例如将/old-path
转发到/new-path
。这对于版本迁移、API 路径更改等场景非常有用。 -
集中的流量管理
Ingress 允许你在一个地方集中管理所有流量路由规则,而不必为每个服务单独创建NodePort
或LoadBalancer
服务。这简化了配置并减少了资源消耗。
Ingress 资源示例
以下是一个简单的 Ingress 配置文件示例:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: example-ingressnamespace: defaultannotations:nginx.ingress.kubernetes.io/rewrite-target: /
spec:rules:- host: example.comhttp:paths:- path: /apipathType: Prefixbackend:service:name: service-apiport:number: 80- path: /webpathType: Prefixbackend:service:name: service-webport:number: 80
在这个示例中,所有访问 example.com/api
的请求将被路由到 service-api
服务,而访问 example.com/web
的请求将被路由到 service-web
服务。通过注解 nginx.ingress.kubernetes.io/rewrite-target: /
,我们可以对路径进行重写,确保转发到后端服务时路径正确。
Ingress 与传统 Service 对比
特性 | Service (NodePort/LoadBalancer) | Ingress |
---|---|---|
流量路由 | 每个服务暴露一个独立的端口 | 通过域名和路径动态路由流量 |
HTTPS 支持 | 手动配置 LoadBalancer 或证书 | 内建 TLS/SSL 支持 |
复杂性 | 简单但灵活性较低 | 配置灵活,功能丰富,管理集中 |
资源消耗 | 每个服务需要独立的 LoadBalancer(成本较高) | 共享同一控制器资源 |
Ingress 相比传统的 NodePort
或 LoadBalancer
更加高效,尤其在需要管理多个服务时。Ingress 通过一个 IP 地址和端口处理多个服务的流量,减少了资源消耗和管理复杂度。
常见的 Ingress 控制器注解
Ingress 控制器通过注解来实现一些特定功能。以 Nginx 为例,常见的注解包括:
-
路径重写:
nginx.ingress.kubernetes.io/rewrite-target: /new-path
该注解允许你将请求的路径进行重写,常用于版本迁移或 API 路径更新。 -
限流:
nginx.ingress.kubernetes.io/limit-connections: "20"
设置最大连接数限制,防止恶意攻击或流量过载。 -
请求超时:
nginx.ingress.kubernetes.io/proxy-read-timeout: "30"
配置请求超时时间,避免长时间没有响应的请求阻塞。 -
跨域支持:
nginx.ingress.kubernetes.io/enable-cors: "true"
启用跨域资源共享(CORS),以支持不同域之间的 API 调用。
这些注解能够帮助你灵活地调整 Ingress 行为,满足特定的业务需求。
总结
Kubernetes 的 Ingress 是一个功能强大的流量管理工具,适用于在复杂集群中处理多服务的流量路由。通过灵活的配置,Ingress 可以帮助你集中管理 HTTP/HTTPS 流量,提供负载均衡、TLS 终止、路径重写等功能。与传统的 NodePort
或 LoadBalancer
服务相比,Ingress 可以更加高效和集中地处理流量,尤其在多域名、多服务的场景中,能极大简化资源管理。
无论你是构建微服务架构、管理 API 网关,还是简化 HTTPS 配置,Ingress 都是一个不可或缺的工具。如果你还没有使用过 Ingress,建议尽早在你的 Kubernetes 集群中尝试并配置它!