# APISIX

  • :一个 API 网关。
  • 官方文档 (opens new window)
  • 2019 年由深圳支流科技公司开源,后来交给 ASF 基金会管理。企业版称为 API7 。
  • 特点:
    • 基于 openresty 管理网络流量,擅长 HTTP 反向代理,可进行动态路由。虽然也支持 TCP、UDP 反向代理,但只能像 Nginx 一样指定固定的 upstream 。
    • 有很多种插件,提供了缓存、限流、身份认证、可观测性等丰富的功能。
    • 支持动态更新,可在运行时更新配置、插件,而不需重启。

# 架构

  • APISIX 系统需要部署以下软件:
    • apisix :一个 HTTP 服务器,包含以下模块:
      • openresty :APISIX 基于它来收发、管理网络流量。因此部署 apisix 进程时,实际上是运行多个 Nginx 进程。
      • core :APISIX 的核心代码。
      • plugin runtime :插件的运行时。
        • APISIX 内置了一些插件,用户也可添加其它插件。
        • 插件可采用 Lua、Java、Golang、Python、JS 等语言开发,还支持 WASM 插件。
    • dashboard :一个 Web 服务器,提供对 APISIX 的 Web 管理页面。
      • 默认监听 9000 端口,账号密码为 admin、admin 。
      • 可在 Web 页面嵌入 Grafana 图表。
    • etcd :APISIX 默认将配置文件等数据存储在自身,可以改为存储到 etcd 数据库,从而可部署多个 apisix 实例,实现高可用。
  • apisix 进程通常监听多个 TCP 端口:
    • 9080 :用于接收一般的 HTTP 请求。
    • 9443 :用于接收一般的 HTTPS 请求。
    • 9180 :提供 HTTP 协议的 admin API ,用于修改 APISIX 的配置,客户端需要使用 key 进行身份认证。详见 官方文档 (opens new window)
    • 9090 :提供 HTTP 协议的 control API ,用于查询 APISIX 的配置、运行状态。
    • 9091 :提供 exporter 接口,供 Prometheus 采集监控指标,URI 为 /apisix/prometheus/metrics 。

# 部署

APISIX 有多种部署方式:

  • 下载二进制程序,直接部署在主机上。这样比较麻烦。
  • 通过 Docker 容器部署:
    docker run -d --name apisix \
        -p 9080:9080 \
        -e APISIX_STAND_ALONE=true \
        apache/apisix:2.15.1-debian
    
  • 通过 docker-compose 部署,参考 官方示例 (opens new window)
  • 在 k8s 集群安装 APISIX Ingress Controller :
    wget https://github.com/apache/apisix-helm-chart/releases/download/apisix-0.12.1/apisix-0.12.1.tgz
    helm install apisix apisix-0.12.1.tgz \
        --create-namespace --namespace ingress-apisix \
        --set gateway.type=NodePort \
        --set ingress-controller.enabled=true \
        --set ingress-controller.config.apisix.serviceNamespace=ingress-apisix
    
    wget https://github.com/apache/apisix-helm-chart/releases/download/apisix-dashboard-0.7.0/apisix-dashboard-0.7.0.tgz
    helm install apisix-dashboard apisix-dashboard-0.7.0.tgz \
        --create-namespace --namespace ingress-apisix
    
    • 这会在 ingress-apisix 命名空间部署以下 Pod :
      apisix                      # Deployment 类型
      apisix-dashboard            # Deployment 类型
      apisix-ingress-controller   # Deployment 类型
      apisix-etcd                 # StatefulSet 类型,有 3 个实例,挂载 PVC 。如果当前 k8s 不支持 PVC ,则可改为其它类型的 volume
      
    • 这会创建多个 Service :
      apisix-admin                # ClusterIP 类型,反向代理 apisix ,供管理员调用 admin API
      apisix-dashboard            # ClusterIP 类型,反向代理 dashboard
      apisix-etcd                 # ClusterIP 类型,反向代理 etcd
      apisix-gateway              # NodePort 类型(也可改成 LoadBalancer 类型),反向代理 apisix ,供一般客户端访问
      apisix-ingress-controller   # ClusterIP 类型,反向代理 ingress-controller
      

# 版本

  • v2.0
  • v3.0
    • 2022 年发布。
    • 有很多不向下兼容的改动,因此建议旧版本先升级到 v2.15 ,再升级到 v3.0 。

# 用法

# 管理对象

Nginx 处理 HTTP 请求时主要使用 server、location 等配置,而 APISIX 设计了以下对象:

  • route
    • :表示路由规则,类似于 Nginx 的 location 。
  • upstream
    • :表示被 APISIX 反向代理的上游服务,类似于 Nginx 的 upstream 。
    • 创建一个 upsteam 对象之后,可以被多个 route 反向代理。
  • service
    • :表示一个抽象的服务,可绑定多个 route 路由规则。类似于 Nginx 的 server 。
  • consumer
    • :用于标识一个客户端。允许给不同 consumer 的客户端发来的 HTTP 请求,采用不同的插件配置。
    • Nginx 可通过 HTTP 请求的 client_ip、headers 分辨客户端的类型,返回不同的 HTTP 响应。而 APISIX 除了这些功能,还可根据插件过滤 HTTP 请求。
  • consumer group
    • :用于标识一组客户端,使它们采用相同的插件配置。

# 修改配置

有多种修改 APISIX 配置的方式:

  • 向 admin API 发送 HTTP 请求。例:
    curl -X PUT http://127.0.0.1:9180/apisix/admin/routes/1 -H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" -d '
    {
      "name": "route-1",
      "methods": ["GET"],
      "host": "test.com",
      "uri": "/*",
      "upstream": {
        "type": "roundrobin",
        "nodes": {
          "httpbin.org:80": 1
        }
      }
    }'
    
    • 这会创建一个 id 为 1 的 route ,规则为:当收到 HTTP 请求时,如果 methods、host、uri 符合描述,则将该 HTTP 请求转发给 upstream 。
    • 测试访问:
      curl 127.0.0.1:9080/get -H "Host: test.com"
      
  • 在 Dashboard 的 Web 页面上配置。不过目前 Web 页面尚未覆盖所有 admin API 。
  • 在 k8s 集群安装 APISIX Ingress Controller 之后,除了上述两种配置方式,也可创建 ApisixRoute、ApisixUpstream 等 CRD 对象。
    • APISIX CRD 对象的语法与 k8s Ingress 相似,但功能更多。
    • apisix-ingress-controller 会通过 kube-apiserver 监视所有 APISIX CRD 对象的变化。发现变化时,自动将 CRD 对象转换成 APISIX 原生配置,并通过 admin API 导入 APISIX ,但不支持导出。
    • 例:
      apiVersion: apisix.apache.org/v2
      kind: ApisixRoute
      metadata:
        name: route-1
        namespace: default
      spec:
        http:
        - name: rule-1
          match:
            hosts:
            - test.com
            paths:
            - /*
          upstreams:                    # 收到请求流量时,反向代理到 ApisixUpstream
          - name: upstream-1
          # plugins:
          #   ...
      ---
      apiVersion: apisix.apache.org/v2
      kind: ApisixUpstream
      metadata:
        name: upstream-1
        namespace: default
      spec:
        externalNodes:
        - type: Domain
          name: httpbin.org