Ingress 是 Kubernetes 中的一种 API 资源,允许用户通过定义规则来控制外部 HTTP(S) 流量如何路由到集群内部的服务。Ingress 提供了一种集中式的流量管理方式,使得用户能够利用主机名和路径来路由流量,从而简化服务暴露。
Ingress 的主要功能
- HTTP 路由:基于请求的 URL 路径或主机名,将流量路由到不同的后端服务。可以在同一 IP 地址下运行多个应用。
- TLS 终止:支持 SSL/TLS 终止,可以安全地处理 HTTPS 请求,简化应用程序的安全配置。
- 负载均衡:将流量在多个后端服务之间分发,提供内置的负载均衡能力。
- 基于主机和路径的路由:通过配置规则,可以根据请求的主机名和路径将流量路由到不同的服务。
Ingress 的组成部分
Ingress 资源
Ingress 资源是定义路由规则的主要部分,通常包括以下元素:
- metadata:包含 Ingress 的名称、命名空间和其他元数据。
- spec:定义路由规则、TLS 配置和其他相关设置。
示例 Ingress 资源
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-service
port:
number: 80
tls:
- hosts:
- example.com
secretName: my-tls-secret
Ingress 控制器
Ingress 控制器负责根据 Ingress 资源定义的规则处理流量。它会自动配置负载均衡器或代理,以路由请求。
常见的 Ingress 控制器包括:
- NGINX Ingress Controller:最常用的控制器,支持丰富的路由和负载均衡功能。
- Traefik:动态反向代理,支持基于标签的路由。
- HAProxy:高性能负载均衡器,适合复杂的路由需求。
- GCE Ingress:在 Google Cloud 环境中原生支持。
Ingress 的工作原理
- 定义 Ingress 规则:用户创建 Ingress 资源,定义如何将外部流量路由到后端服务。
- Ingress 控制器监控:Ingress 控制器持续监控 Ingress 资源的变化,并根据规则配置流量处理逻辑。
- 流量路由:当外部请求到达 Ingress 控制器时,它根据定义的规则将请求转发到相应的后端服务。
Ingress 的使用场景
- 多服务路由:在同一域名下,根据 URL 路径路由请求到不同的服务。例如,将
/api
请求路由到 API 服务,将/app
请求路由到 Web 应用。 - 域名管理:通过主机名路由不同的服务,例如
api.example.com
路由到 API 服务,app.example.com
路由到前端应用。 - 安全连接:通过 TLS 终止,提供安全的 HTTPS 连接。
Ingress 的配置示例
创建一个简单的 Ingress
以下是一个完整的示例,展示如何配置 Ingress 将请求路由到不同的服务:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: example.com
http:
paths:
- path: /app1
pathType: Prefix
backend:
service:
name: app1-service
port:
number: 80
- path: /app2
pathType: Prefix
backend:
service:
name: app2-service
port:
number: 80
tls:
- hosts:
- example.com
secretName: my-tls-secret
配置 TLS
为了处理 HTTPS 请求,需要在 Ingress 中配置 TLS,首先创建一个 Kubernetes Secret,包含 TLS 证书和私钥。
创建 TLS Secret 示例:
kubectl create secret tls my-tls-secret --cert=path/to/tls.crt --key=path/to/tls.key
详细路由规则
路由规则的组件
- 主机名(host):用于指定请求的主机名。
- 路径(path):指定匹配的请求路径。
- 后端(backend):指向处理请求的服务和端口。
路由示例
基于主机的路由:
rules:
- host: api.example.com
http:
paths:
- path: /
backend:
service:
name: api-service
port:
number: 80
- host: app.example.com
http:
paths:
- path: /
backend:
service:
name: app-service
port:
number: 80
基于路径的路由:
paths:
- path: /v1
backend:
service:
name: v1-service
port:
number: 80
- path: /v2
backend:
service:
name: v2-service
port:
number: 80
Ingress 的最佳实践
- 使用合适的 Ingress 控制器:根据应用需求选择合适的控制器,以支持所需的路由和负载均衡功能。
- 启用 TLS:始终使用 TLS 加密流量,以保护数据安全。
- 保持配置简单:尽量避免复杂的路由规则,保持配置清晰明了,便于维护。
- 监控和日志:使用监控工具和日志记录,跟踪流量模式和性能,及时处理潜在问题。
总结
Kubernetes Ingress 是管理集群外部流量的重要工具,通过灵活的路由和 TLS 支持,实现了对集群内部服务的集中式流量控制。合理配置 Ingress 资源和控制器,可以提升应用的安全性和可用性,简化流量管理,使得 Kubernetes 集群在处理外部请求时更加高效和灵活。