Kubernetes 部署 Apache APISIX

Kubernetes 中部署 Apache APISIX 可以将其强大的 API 网关能力无缝融入云原生环境。下面我将详细解析其功能、部署方案、优势以及核心概念。
在这里插入图片描述

一、APISIX 在 K8s 中的核心价值:为什么选择它?

APISIX 在 K8s 中不仅仅是简单的入口路由,它作为一个全动态、高性能的 API 网关和处理平台,弥补了原生 Ingress Controller 的诸多短板:

特性K8s 原生 Ingress / 普通 Nginx Ingress ControllerApache APISIX on K8s
动态更新需要 Reload Nginx,可能导致流量中断和性能抖动。绝对热更新。所有配置(路由、证书、插件)通过 etcd 实时生效,无需重启或 reload 任何 worker 进程。
性能基于 Lua 的扩展(如 OpenResty)性能不错,但 Reload 是瓶颈。极致性能。基于 etcd 监听变化,纯 C 语言写的插件运行在高性能 radixtree 路由匹配中。
可扩展性扩展需要修改 Controller 代码或配置模板,复杂度高。插件化架构。拥有80+ 官方插件(认证、安全、流量控制、可观测性、日志等),可动态启用/禁用,也支持自定义 Lua 或 Java 插件。
服务发现主要依赖 K8s Endpoints API,与 K8s 服务绑定紧密。支持多服务注册中心。除了原生 K8s Service,还支持 Nacos、Eureka、Consul 等,轻松实现跨集群、混合云的服务发现。
配置管理配置通常写在 Ingress YAML 中,与业务服务耦合。解耦。网关配置(路由、插件)由独立的 ApisixRoute 等 CRD 管理,更清晰,权限分离。

总结:如果你需要的是一个功能强大、性能极致、无需重启、能应对复杂路由和流量治理场景的云原生 API 网关,而不仅仅是一个基本的反向代理,那么 APISIX 是 K8s 环境的绝佳选择。


二、核心架构与工作原理

在 K8s 中部署 APISIX 通常采用以下架构,其数据平面和控制平面的交互如下图所示:

flowchart TD
    A[管理员/DevOps] -->|1. 声明路由/插件规则| B[Kubectl Apply<br>ApisixRoute CRD]
    
    subgraph K8s Cluster[Kubernetes Cluster]
        B --> C[APISIX Ingress Controller<br>(控制平面)]
        C -->|2. 转换并分发配置| D[etcd Cluster<br>(配置存储)]

        subgraph DataPlane [数据平面]
            E[APISIX Pods<br>(处理实际流量)]
        end

        D -->|3. 实时监听配置变化| E
    end

    F[外部客户端] -->|4. 入口流量| G[K8s Service<br>(LoadBalancer/NodePort)]
    G -->|路由至| E
    E -->|5. 根据规则转发| H[后端业务服务<br>(Pod 1, Pod 2, ...)]
  1. 数据平面 (Data Plane)

    • apisix Pod 组成。它们是处理实际流量的代理节点,负责匹配路由、执行插件(如认证、限流、日志)、负载均衡等。其配置完全来自 etcd。
  2. 控制平面 (Control Plane)

    • apisix-ingress-controller:这是一个独立的控制器 Pod。它监听 K8s API Server 中与 APISIX 相关的 CRD(如 ApisixRoute)资源的变化,然后将其转换为 APISIX 能理解的配置,并写入 etcd。它本身不处理任何流量
  3. 配置存储

    • etcd:作为 APISIX 的配置数据库,所有路由、插件、上游等信息都存储在 etcd 中。apisix-ingress-controller 写入,apisix Pod 读取并监听变化。
  4. 资源定义

    • 自定义资源定义 (CRDs):APISIX 引入了多种 CRD,让你能够使用熟悉的 K8s YAML 方式来管理网关配置。
      • ApisixRoute:定义路由规则(匹配路径、方法、主机头等)以及绑定在路由上的插件。
      • ApisixUpstream:定义上游(后端服务)的高级策略,如负载均衡算法、健康检查、重试等。
      • ApisixTls:管理 TLS 证书。
      • ApisixPluginConfig:定义可复用的插件模板。

三、核心功能详解

通过上述组件,APISIX 在 K8s 中提供了极其丰富的功能:

  1. 高级流量路由

    • 基于路径、Header、Cookie、查询参数、请求方法等进行路由。
    • 支持金丝雀发布(按权重/比例分流)、蓝绿部署。
    • 支持 A/B 测试。
  2. 强大的安全防护

    • 认证:JWT、Key Auth、Basic Auth、Wolf RBAC、OpenID Connect (OIDC) 等。
    • 安全:CORS、CSRF、IP 黑白名单、URI 阻塞、WAF 集成。
    • 限流限速:请求速率限制、并发请求限制、漏桶算法、请求突发。
  3. 可观测性

    • 指标:集成 Prometheus,暴露丰富的 metrics(QPS、延迟、带宽、状态码等)。
    • 日志:支持将访问日志推送到 HTTP、Kafka、SkyWalking、Elasticsearch 等数十种目标。
    • 追踪:支持 SkyWalking、Zipkin、Jaeger 等分布式追踪系统。
  4. 高可用与弹性

    • 数据平面 (apisix) 和控制器 (ingress-controller) 均可水平扩展。
    • 所有配置存储在 etcd 集群中,确保高可用。
    • 支持 Pod 优雅终止,最大限度减少流量中断。

四、部署方式

通常使用 Helm 进行一键部署,这是最推荐的方式。

# 添加 APISIX Helm 仓库
helm repo add apisix https://charts.apiseven.com
helm repo update

# 安装 APISIX,包含 APISIX、etcd、ingress-controller
helm install apisix apisix/apisix --set gateway.type=LoadBalancer --set ingress-controller.enabled=true --namespace apisix

关键配置参数

  • gateway.type: 设置为 LoadBalancer(云厂商)、NodePortLoadBalancer
  • ingress-controller.enabled: 必须启用。
  • etcd.enabled: 如果已有外部 etcd 集群,可设置为 false

五、一个简单示例:部署并暴露服务

  1. 部署一个示例应用

    # httpbin.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: httpbin
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: httpbin
      template:
        metadata:
          labels:
            app: httpbin
        spec:
          containers:
          - name: httpbin
            image: kennethreitz/httpbin
            ports:
            - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: httpbin-svc
    spec:
      selector:
        app: httpbin
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80
    

    kubectl apply -f httpbin.yaml

  2. 创建 APISIX 路由规则 (ApisixRoute):

    # apisix-route.yaml
    apiVersion: apisix.apache.org/v2
    kind: ApisixRoute
    metadata:
      name: httpbin-route
    spec:
      http:
      - name: httpbin-rule
        match:
          hosts:
          - local.httpbin.org # 匹配的域名
          paths:
          - /* # 匹配的路径
        backends:
        - serviceName: httpbin-svc
          servicePort: 80
        plugins:
        - name: prometheus # 启用 Prometheus 插件,暴露指标
          enable: true
        - name: limit-count # 启用限流插件
          enable: true
          config:
            count: 5
            time_window: 60
            key: remote_addr
            rejected_code: 503
            policy: local
    

    kubectl apply -f apisix-route.yaml

  3. 访问测试

    • 获取 APISIX Gateway 的 IP:kubectl get svc apisix-gateway -n apisix
    • 使用 curl 访问(假设 IP 是 10.0.0.1):
      curl http://10.0.0.1/get -H 'Host: local.httpbin.org'
      # 应该能看到 httpbin 返回的 JSON
      
    • 测试限流:快速连续请求 6 次,第 6 次会返回 503

总结

在 Kubernetes 中部署 Apache APISIX,你得到的是一个功能全面、性能卓越、完全动态的现代化 API 网关解决方案。它通过自定义资源 (CRD) 与 K8s 完美集成,允许 DevOps 和开发人员使用声明式的方式管理复杂的流量治理策略,极大地提升了 API 管理的效率和可靠性,是构建微服务架构和应对高并发场景的理想选择。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值