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

什么是 Ingress?

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

Ingress 是 Kubernetes 中的一种资源,主要用于控制和管理外部 HTTP 和 HTTPS 流量如何进入集群。Ingress 可以基于请求的 域名 、路径 等规则,将流量路由到集群内部的不同服务。与传统的 NodePort 或 LoadBalancer 服务暴露方式相比,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 控制器。以下是部署步骤:

bash 复制代码
# 添加 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 资源示例:

yaml 复制代码
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:
bash 复制代码
kubectl create secret tls apisix-tls --cert=cert.crt --key=cert.key
  1. 更新 Ingress 资源,启用 SSL/TLS:
yaml 复制代码
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 注解,你可以轻松启用这些插件。

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

yaml 复制代码
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 终止、流量控制等功能。

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

相关推荐
虎头金猫3 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
赵文宇(温玉)3 天前
CoreDNS的hosts插件的缺行配置导致k8s集群异常
容器·kubernetes·rancher
guo_wen_qiang3 天前
上传本地镜像到harbor中
docker·容器·持续部署
张洛闻Eren3 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
忆~遂愿3 天前
本地片库怎么在外面打开?Plex + cpolar 搭一套可远程访问的私人影音库
docker·容器
Thneonl3 天前
你的 Pod 为什么 Pending:调度器两阶段
后端·kubernetes
不吃香菜kkk、3 天前
CI/CD(GitOps)学习与部署手册
运维·云原生·容器·kubernetes·云计算·jenkins·argocd
九皇叔叔4 天前
Kubernetes 资源管理方式详解:命令式与声明式管理
docker·容器·k8s
程序猿小郑4 天前
Docker Compose 构建完整服务实战指南:从入门到最佳实践
docker·容器
ysu_03144 天前
【2026】K8s GPU调度空占怎么解?Kueue与Volcano Gang配置
云原生·kubernetes·gpu算力·volcano·ai基础设施·kueue·gang scheduling