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

什么是 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 控制器。以下是部署步骤:

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

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

相关推荐
Patrick_Wilson1 天前
从「改个端口」到 502:Next.js on k8s 的容器端口、Service 映射与 env 覆盖
docker·kubernetes·next.js
探索云原生1 天前
K8s 1.36 这个 GA 特性,把 initContainer 拉模型的 hack 干掉了
ai·云原生·kubernetes
云恒要逆袭1 天前
运行你的第一个Docker容器
后端·docker·容器
Java之美2 天前
一次k8s升级引发的DevicePlugin注册失败
云原生·kubernetes
程序员老赵3 天前
10 分钟部署 OpenCode:Docker 一键安装,浏览器打开就能用 AI 写代码(附完整命令与排错)
docker·容器·ai编程
武子康6 天前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
2601_961875249 天前
决战申论100题2026|最新|范文
linux·容器·centos·debian·ssh·fabric·vagrant
java_cj9 天前
深入kube-apiserver认证机制:从Bearer Token到mTLS的完整认证链解析
linux·运维·服务器·云原生·容器·kubernetes
程序员老赵9 天前
服务器没有桌面?Docker 跑个 Chrome,浏览器就能远程用
docker·容器·devops