1. 概述
在 Kubernetes 中为外部服务配置 Ingress,有助于将来自集群外部的流量路由到内部服务或外部接口。 它支持基于 IP 和主机名的代理,能够灵活且安全地进行通信,例如 TLS 终止。合理管理动态 IP 和优化 Ingress 流量可以提升系统的可扩展性和性能。
在云环境(如 AKS)中,实施最佳实践,如静态 IP 管理和合理处理出口流量,有助于构建健壮的 Kubernetes 架构。
在本教程中,我们将探讨 Kubernetes 中代理流量和保护外部服务的不同方法。这些方法对于配置 Kubernetes Ingress 和管理流量至关重要。
2. 通过 Ingress 代理外部服务
Kubernetes 中有两种主要方式可以通过 Ingress 代理外部服务。我们来分别介绍。
2.1. 通过 IP 地址代理
Kubernetes 要将流量路由到外部服务的 IP 地址,需要一个没有 selector 的 Service 和一个 Endpoints 资源配合使用。
Service 定义了进入的端口,但不会连接到任何内部 Pod,因为目标是外部服务:
apiVersion: v1
kind: Service
metadata:
name: external-service
spec:
ports:
- protocol: TCP
port: 80
Endpoints 将外部 IP 映射到该 Service,确保流量被正确转发:
apiVersion: v1
kind: Endpoints
metadata:
name: external-service
subsets:
- addresses:
- ip: 1.2.3.4 # 外部 IP
ports:
- port: 80
然后我们创建 Ingress 资源来定义从外部域名的流量路由:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: external-ingress
spec:
rules:
- host: external.example.com
http:
paths:
- path: /
backend:
service:
name: external-service
port:
number: 80
此配置会将来自 external.example.com
的请求代理到指定的外部 IP 地址。
2.2. 通过主机名代理
对于使用主机名标识的服务(例如远程 API),Kubernetes 提供了 ExternalName
类型的 Service,它将 Service 映射到外部主机名,简化了配置:
apiVersion: v1
kind: Service
metadata:
name: external-service
spec:
type: ExternalName
externalName: my-external-backend.example.com
Ingress 配置如下:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: external-ingress
spec:
rules:
- host: external.example.com
http:
paths:
- path: /
backend:
service:
name: external-service
port:
number: 80
这样,访问 external.example.com
的请求会被代理到 my-external-backend.example.com
。
2.3. 处理 Ingress 中的动态 IP
如果外部服务的 IP 地址经常变化,使用 IP 代理的方式就需要频繁手动更新 Endpoints,维护成本较高。而使用 ExternalName
类型的 Service 则可以在每次请求时自动解析主机名,适应 IP 的变化。
✅ 建议:在高度动态的环境中,优先使用基于 DNS 的外部服务,避免手动维护 IP 地址。
2.4. 为外部服务配置 TLS 终止
为了实现安全通信,需要在 Ingress 控制器中配置 TLS 终止。默认情况下,即使客户端使用 HTTPS,代理到外部服务可能仍是 HTTP。要实现端到端加密,可以使用如下注解:
annotations:
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
同时将后端服务端口设置为 443:
backend:
service:
name: external-service
port:
number: 443
对于 ExternalName
类型的服务,确保外部服务本身支持 TLS,这样整个通信链路都是加密的。
3. Kubernetes Ingress 与外部服务的最佳实践
以下是一些在使用 Kubernetes Ingress 对接外部服务时的建议:
3.1. 使用静态 IP 提高稳定性
在云环境(如 Azure 或 AWS)中,建议为 LoadBalancer 和外部服务分配静态 IP,以确保 Ingress 路由的一致性和稳定性。
3.2. 使用 Web 应用防火墙(WAF)
为了提升安全性,可以在 Ingress 控制器前部署 WAF 进行流量过滤。例如 Azure Application Gateway 可以与 AKS 集成,为外部流量提供额外的安全防护。
3.3. 合理选择 Ingress 控制器
根据需求选择合适的 Ingress 控制器。虽然 NGINX 是最常用的,但 Traefik、HAProxy 等也各有优势,适合不同场景。
3.4. 全链路启用 TLS
无论是 Ingress 控制器还是外部服务,都应该启用 TLS 加密。尤其是处理敏感数据时,必须确保前后端都使用 HTTPS。
3.5. 使用 EndpointSlices 替代传统 Endpoints
在大规模集群中,建议使用 EndpointSlices 替代传统 Endpoints。EndpointSlices 是 Kubernetes 新推出的 API,支持更好的扩展性和性能。
4. 在 AKS 中处理出口流量
在 AKS 上配置 Ingress 对接外部服务时,合理处理出口流量对安全和稳定性至关重要。以下是关键策略:
4.1. 自定义路由(User-Defined Routes, UDR)
UDR 可以将 AKS 集群的出口流量引导到特定 IP 或 NAT 网关,便于实现白名单机制或安全通道转发。
4.2. 使用 NAT 网关保证出口 IP 固定
通过 NAT 网关,确保所有出口流量都使用同一个静态公网 IP,这对需要白名单控制的外部服务非常关键。
4.3. 使用网络安全组(NSG)
通过 NSG 限制 AKS Pod 的出口访问权限,只允许访问特定 IP 范围或服务,减少暴露面。
4.4. 使用 Azure 防火墙
Azure 防火墙可提供更高级别的安全控制,支持集中管理出口规则、威胁检测和日志记录,提升整体安全性。
✅ 建议组合使用:UDR + NAT Gateway + NSG + Azure Firewall,构建安全高效的出口流量管理体系。
5. 小结
本文我们介绍了 Kubernetes 中 Ingress 对接外部服务的几种方式,包括基于 IP 和主机名的代理配置、TLS 终止的设置,以及在 AKS 中如何高效、安全地处理出口流量。
通过合理配置,可以实现外部服务的灵活接入、流量控制和安全保障,为构建健壮的微服务架构打下坚实基础。