Ingress 是 Kubernetes 提供的一种用于管理外部用户访问集群中服务的 API 对象。它主要用于 HTTP 和 HTTPS 流量的路由,通过定义一组规则,将外部请求路由到集群内部的不同服务。Ingress 使得在 Kubernetes 集群中管理和配置访问规则变得更加灵活和集中。
1. Ingress 的作用
- 统一入口管理:通过一个入口点管理多个服务的访问,减少暴露的 IP 和端口数量。
- 基于主机名和路径的路由:根据请求的域名和 URL 路径将流量路由到不同的服务。
- TLS/SSL 终端:支持 HTTPS,能够处理 TLS 终端,实现安全通信。
- 负载均衡:提供基本的负载均衡功能,分发流量到后端服务。
- 名称基的虚拟主机:支持多个虚拟主机共享同一个 IP 地址。
2. Ingress 的组成
- Ingress 资源:定义路由规则和配置信息的 Kubernetes 对象。
- Ingress Controller:负责实现 Ingress 资源中定义的路由规则。常见的 Ingress Controller 有 NGINX、Traefik、HAProxy 等。
3. Ingress 的工作原理
- 定义 Ingress 资源:开发者创建一个 Ingress 资源,指定路由规则,如域名、路径及对应的服务。
- Ingress Controller 解析规则:Ingress Controller 监视集群中的 Ingress 资源,当发现新的或更新的 Ingress 资源时,解析其中的规则。
- 配置代理服务器:Ingress Controller 根据解析的规则,配置其内部的代理服务器(如 NGINX)来实现流量路由。
- 流量路由:外部请求首先到达 Ingress Controller,然后根据规则将流量转发到相应的服务。
4. Ingress 的基本配置示例
以下是一个简单的 Ingress 资源示例:
yaml
复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
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: example-tls
解释:
- metadata.annotations:用于配置 Ingress Controller 的特定行为,这里使用了 NGINX 的 URL 重写功能。
- spec.ingressClassName:指定使用的 Ingress Controller 类,这里指定为
nginx。 - rules:定义了基于主机名和路径的路由规则。对于
example.com,路径/app1的流量会被路由到app1-service,路径/app2的流量则路由到app2-service。 - tls:配置 TLS/SSL,指定了要使用的证书
example-tls,确保example.com的流量通过 HTTPS 传输。
5. Ingress Controller 的选择
选择合适的 Ingress Controller 对集群的性能和功能有重要影响。常见的 Ingress Controller 包括:
- NGINX Ingress Controller:功能强大,社区支持良好,适用于大多数场景。
- Traefik:支持动态配置,易于集成和扩展,适合微服务架构。
- HAProxy Ingress:高性能,适合对性能有较高要求的场景。
- Istio:作为服务网格的一部分,提供高级流量管理功能,适用于复杂的微服务架构。
6. Ingress 的高级功能
- 路径重写:通过注解或 Ingress Controller 特性,重写请求路径。
- 认证和授权:集成身份验证机制,控制访问权限。
- 限流和熔断:限制请求速率,保护后端服务。
- 自定义错误页面:提供友好的错误响应页面。
- WebSocket 支持:支持 WebSocket 流量的转发。
7. Ingress 的最佳实践
- 使用合适的 Ingress Controller:根据具体需求选择性能和功能合适的 Ingress Controller。
- 合理规划路由规则:避免路径冲突,保持规则的简洁和清晰。
- 启用 TLS/SSL:确保数据传输的安全性,使用自动化工具(如 cert-manager)管理证书。
- 监控和日志:配置日志和监控,及时发现和排查问题。
- 高可用性部署:部署多个 Ingress Controller 实例,确保入口的高可用性。
- 安全配置:限制 Ingress 资源的访问权限,避免未授权的更改。
8. 常见问题与解决方案
-
Ingress 无法访问服务:
- 检查 Ingress Controller 是否正确部署。
- 确认服务和端口配置正确。
- 查看 Ingress Controller 的日志,排查错误信息。
-
TLS 配置失效:
- 确认证书是否正确配置,并且
secretName指向正确的 TLS Secret。 - 确保 Ingress Controller 支持 TLS。
- 确认证书是否正确配置,并且
-
路径匹配不正确:
- 确认
pathType是否设置正确,如Prefix或Exact。 - 检查路径的优先级,避免规则冲突。
- 确认
9. 总结
Ingress 是 Kubernetes 中一个强大且灵活的组件,用于管理外部流量到集群内部服务的路由。通过定义 Ingress 资源和部署适当的 Ingress Controller,开发者可以轻松地配置基于域名和路径的路由规则,实现高效的流量管理和安全控制。在实际应用中,结合具体需求和场景,合理配置和优化 Ingress,可以显著提升 Kubernetes 集群的可用性和可管理性。