Kubernetes Ingress:使用 Apache APISIX 进行外部流量路由
什么是 Ingress?
在 Kubernetes 中,随着微服务架构的广泛应用,集群中的服务需要暴露到外部,以便供用户或其他服务访问。如何高效、安全地管理这些流量,成为了一个重要的议题。Ingress 作为 Kubernetes 提供的一种资源,能够为你提供灵活且高效的外部流量路由功能。本文将介绍如何在 Kubernetes 中使用 Apache APISIX 作为 Ingress 控制器,来智能地管理和路由外部流量。
Ingress 是 Kubernetes 中的一种资源,主要用于控制和管理外部 HTTP 和 HTTPS 流量如何进入集群。Ingress 可以基于请求的 域名、路径 等规则,将流量路由到集群内部的不同服务。与传统的 NodePort 或 LoadBalancer 服务暴露方式相比,Ingress 更加灵活高效,适合在微服务架构中使用。
Ingress 的基本功能
- 外部流量路由:根据域名、路径等规则将流量路由到目标服务。
- 负载均衡:Ingress 控制器能够自动为服务提供流量分发,确保流量均匀分配到各个 Pod 上。
- SSL/TLS 终止:Ingress 可以配置 SSL/TLS 证书,确保安全的 HTTPS 流量。
- 请求重定向与重写:Ingress 允许根据路径规则对请求进行重定向和重写。
Apache APISIX 作为 Ingress 控制器
Apache APISIX 是一个高性能、可扩展的 API 网关。它原生支持 Kubernetes Ingress,可以作为 Kubernetes 集群中的 Ingress 控制器,处理和管理外部流量。APISIX 不仅提供流量路由功能,还集成了负载均衡、流量控制、日志收集等功能,非常适合微服务架构中的流量管理。
为什么选择 APISIX 作为 Ingress 控制器?
- 高性能:APISIX 基于 NGINX 和 OpenResty 构建,性能非常高,能够处理大量的并发请求。
- 灵活的路由规则:支持路径、域名、请求头、方法等灵活的路由规则。
- 丰富的插件生态:APISIX 提供了丰富的插件支持,比如认证、流量控制、API 限速、监控等,可以满足大多数场景的需求。
- 动态配置:APISIX 支持动态配置,可以通过 Kubernetes API 和 ConfigMap 轻松调整路由规则和服务配置。
Ingress 的工作原理
Ingress 是通过 Ingress 控制器 实现外部流量路由的。Ingress 控制器监听 Kubernetes 中的 Ingress 资源,并根据配置的路由规则将流量转发到对应的服务。
Apache APISIX 作为 Ingress 控制器,会根据集群中定义的 Ingress 资源和路由规则,将外部流量路由到相应的服务。APISIX 控制器会自动管理负载均衡、请求转发、SSL/TLS 终止等任务。
基本工作流程:
- 外部请求通过负载均衡器进入集群,发送到 Ingress 控制器(如 Apache APISIX)。
- Ingress 控制器解析 Ingress 资源中的路由规则,确定将流量转发到哪个 Service。
- 流量被转发到对应的 Service,Service 会根据选择器将流量转发到匹配的 Pod。
- 最终,Pod 处理请求并返回响应。
如何配置 Apache APISIX 作为 Ingress 控制器?
1. 部署 Apache APISIX Ingress 控制器
在 Kubernetes 中使用 Apache APISIX 作为 Ingress 控制器,首先需要部署 APISIX 控制器。以下是部署步骤:
# 添加 APISIX 官方 Helm 仓库
helm repo add apisix https://charts.apisix.apache.org
helm repo update# 安装 APISIX Ingress 控制器
helm install apisix apisix/apisix-ingress-controller \--set apisix.gateway.enabled=true \--set ingressController.installCRDs=true
这个命令将会部署 APISIX 控制器以及相关的 CRDs(自定义资源定义),并为集群中的服务提供路由能力。
2. 创建 Ingress 资源
APISIX 控制器将根据你定义的 Ingress 资源规则将外部流量路由到 Kubernetes 集群中的服务。以下是一个基本的 Ingress 资源示例:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: example-ingressannotations:ingress.kubernetes.io/rewrite-target: /apisix.ingress.kubernetes.io/ssl-redirect: "true"
spec:rules:- host: example.comhttp:paths:- path: /frontendpathType: Prefixbackend:service:name: frontend-serviceport:number: 80- path: /backendpathType: Prefixbackend:service:name: backend-serviceport:number: 80
在上面的例子中,外部请求 http://example.com/frontend
会被路由到 frontend-service
,而请求 http://example.com/backend
会被路由到 backend-service
。APISIX 会根据这些规则管理流量路由,并根据需要执行负载均衡。
3. 配置域名和负载均衡器
为了通过域名 example.com
访问服务,你需要将该域名指向 APISIX 控制器 的外部负载均衡器的 IP 地址。如果你使用云平台(如 AWS、GCP),负载均衡器会提供一个外部 IP 地址。
将 DNS 配置指向这个 IP 地址:
example.com
→ APISIX 控制器的外部 IP 地址
这样,当用户访问 http://example.com
时,流量会通过 APISIX 控制器路由到相应的服务。
4. 配置 SSL/TLS
如果你希望通过 HTTPS 提供安全的访问,可以为 APISIX 配置 SSL/TLS 证书。首先,你需要将证书存储为 Kubernetes Secret,然后在 Ingress 资源中引用它:
- 创建 TLS 证书 Secret:
kubectl create secret tls apisix-tls --cert=cert.crt --key=cert.key
- 更新 Ingress 资源,启用 SSL/TLS:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: secure-ingress
spec:tls:- hosts:- example.comsecretName: apisix-tlsrules:- host: example.comhttp:paths:- path: /pathType: Prefixbackend:service:name: my-serviceport:number: 443
这将确保所有通过 https://example.com
访问的流量都通过 TLS 加密,提供安全的通信。
5. 使用 APISIX 插件增强功能
APISIX 提供了多种插件,允许你增强流量控制的能力。例如,你可以启用流量限速、身份验证、日志记录等功能。通过配置 Ingress 注解,你可以轻松启用这些插件。
例如,启用流量限速插件:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: example-ingressannotations:apisix.ingress.kubernetes.io/plugins: rate-limiting
spec:rules:- host: example.comhttp:paths:- path: /pathType: Prefixbackend:service:name: my-serviceport:number: 80
这样,APISIX 会为 example.com
配置流量限速插件,限制每秒钟的请求数。
总结
Apache APISIX 作为一个高性能的 API 网关和 Ingress 控制器,能够为 Kubernetes 提供灵活、强大的外部流量路由和管理能力。通过配置 APISIX Ingress 控制器,你可以轻松地将外部 HTTP/HTTPS 流量路由到集群中的不同服务,并且还能够集成负载均衡、SSL/TLS 终止、流量控制等功能。
与传统的 NodePort 和 LoadBalancer 服务暴露方式相比,APISIX 提供了更高的灵活性、可扩展性和可管理性,特别适合用于微服务架构中多服务的流量路由。通过 APISIX,你可以更好地控制外部流量的访问方式,提高集群的性能、安全性和可靠性。