Kubernetes Ingress:使用 Apache APISIX 进行外部流量路由

发布于:2025-09-13 ⋅ 阅读:(19) ⋅ 点赞:(0)

什么是 Ingress?

在 Kubernetes 中,随着微服务架构的广泛应用,集群中的服务需要暴露到外部,以便供用户或其他服务访问。如何高效、安全地管理这些流量,成为了一个重要的议题。Ingress 作为 Kubernetes 提供的一种资源,能够为你提供灵活且高效的外部流量路由功能。本文将介绍如何在 Kubernetes 中使用 Apache APISIX 作为 Ingress 控制器,来智能地管理和路由外部流量。

Ingress 是 Kubernetes 中的一种资源,主要用于控制和管理外部 HTTP 和 HTTPS 流量如何进入集群。Ingress 可以基于请求的 域名路径 等规则,将流量路由到集群内部的不同服务。与传统的 NodePortLoadBalancer 服务暴露方式相比,Ingress 更加灵活高效,适合在微服务架构中使用。

Ingress 的基本功能

  1. 外部流量路由:根据域名、路径等规则将流量路由到目标服务。
  2. 负载均衡:Ingress 控制器能够自动为服务提供流量分发,确保流量均匀分配到各个 Pod 上。
  3. SSL/TLS 终止:Ingress 可以配置 SSL/TLS 证书,确保安全的 HTTPS 流量。
  4. 请求重定向与重写:Ingress 允许根据路径规则对请求进行重定向和重写。

Apache APISIX 作为 Ingress 控制器

Apache APISIX 是一个高性能、可扩展的 API 网关。它原生支持 Kubernetes Ingress,可以作为 Kubernetes 集群中的 Ingress 控制器,处理和管理外部流量。APISIX 不仅提供流量路由功能,还集成了负载均衡、流量控制、日志收集等功能,非常适合微服务架构中的流量管理。

为什么选择 APISIX 作为 Ingress 控制器?

  1. 高性能:APISIX 基于 NGINX 和 OpenResty 构建,性能非常高,能够处理大量的并发请求。
  2. 灵活的路由规则:支持路径、域名、请求头、方法等灵活的路由规则。
  3. 丰富的插件生态:APISIX 提供了丰富的插件支持,比如认证、流量控制、API 限速、监控等,可以满足大多数场景的需求。
  4. 动态配置: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-ingress
  annotations:
    ingress.kubernetes.io/rewrite-target: /
    apisix.ingress.kubernetes.io/ssl-redirect: "true"
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /frontend
        pathType: Prefix
        backend:
          service:
            name: frontend-service
            port:
              number: 80
      - path: /backend
        pathType: Prefix
        backend:
          service:
            name: backend-service
            port:
              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 资源中引用它:

  1. 创建 TLS 证书 Secret:
kubectl create secret tls apisix-tls --cert=cert.crt --key=cert.key
  1. 更新 Ingress 资源,启用 SSL/TLS:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: secure-ingress
spec:
  tls:
  - hosts:
    - example.com
    secretName: apisix-tls
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: my-service
            port:
              number: 443

这将确保所有通过 https://example.com 访问的流量都通过 TLS 加密,提供安全的通信。

5. 使用 APISIX 插件增强功能

APISIX 提供了多种插件,允许你增强流量控制的能力。例如,你可以启用流量限速、身份验证、日志记录等功能。通过配置 Ingress 注解,你可以轻松启用这些插件。

例如,启用流量限速插件:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    apisix.ingress.kubernetes.io/plugins: rate-limiting
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: my-service
            port:
              number: 80

这样,APISIX 会为 example.com 配置流量限速插件,限制每秒钟的请求数。


总结

Apache APISIX 作为一个高性能的 API 网关和 Ingress 控制器,能够为 Kubernetes 提供灵活、强大的外部流量路由和管理能力。通过配置 APISIX Ingress 控制器,你可以轻松地将外部 HTTP/HTTPS 流量路由到集群中的不同服务,并且还能够集成负载均衡、SSL/TLS 终止、流量控制等功能。

与传统的 NodePortLoadBalancer 服务暴露方式相比,APISIX 提供了更高的灵活性、可扩展性和可管理性,特别适合用于微服务架构中多服务的流量路由。通过 APISIX,你可以更好地控制外部流量的访问方式,提高集群的性能、安全性和可靠性。