APISIX 安装

小得盈满

2023/09/24

1.基本概念

APISIX 是 Apache 下的一款云原生的 API 网关,支持全生命周期的 API 管理,在应用中可以作为所有 API 调用的统一入口。

APISIX 有一些基础概念如下:

  1. Upstream,或者叫做上游,是一组目标主机的抽象,上游一组节点提供实际的业务服务,一般需要指定负载均衡策略去调用。
  2. Route,路由定义了一组规则,指定如何匹配用户的请求并执行对应的插件,最后将请求转发到上游。
  3. Service,服务是一组上游和插件(不包括认证)的抽象,可以给多个路由复用,同时配置的变更也可以应用到全部的路由,解耦的同时还可以保持灵活性,服务和路由的关系通常是 1:N。
  4. Plugin,插件可以通过消费者或路由实现功能的扩展,从而满足用户对流量管理、权限认证、安全性、可观察性、请求/响应转换等方面的特定要求。
  5. Consumer,消费者就是请求 APISIX 服务的用户,消费者都会绑定认证和授权的插件,从而对身份进行识别,并且消费者配置的插件具有最高的优先级,APISIX 可以为不同的消费者配置不同的规则,实现比较灵活的功能。

知道了上面的一些基础概念,然后我们就开始搭建 APISIX 服务网关吧。

2.部署方式

APISIX 有 3 种部署方式,分别如下:

  1. traditional 这个是经典默认的部署方式,将数据平面和控制平面一块启动,方便管理。
  2. decoupled 这种是将控制平面和数据平面分离的部署方式,中间通过 mTLS 进行通信,这种适合在比较大规模的集群环境中使用。
  3. standalone 这种仅部署数据平面并且配置都从本地加载,这种部署方式常用在 Kubernetes 容器环境中,因为每次全量的配置都由 k8s 的配置中心生成并运行。

一般规模下比较常用的部署方式就是 traditional,无论是 traditional 还是 decoupled 都需要依赖外部的 etcd 保存配置,官网给出的 Docker 部署示例是将 etcd 集成到一个 compose 中,但是这样会失去 etcd 的高可用性,只适合测试环境,所以我们采用外部专用的 etcd 集群。

关于部署方式可以参考文档:https://apisix.apache.org/docs/apisix/3.2/deployment-modes/

具体 etcd 的部署就不再详细写了,可以参考之前 etcd 集群的部署文档,这里假设已经存在了 etcd 集群,当前我们采用 Docker Compose 的方式来部署 APISIX 和 Dashboard。

3.安装 APISIX 和 Dashboard

本地安装的 APISIX 版本是 3.2.2,也是目前的长期支持版。

首先,我们创建一个 Docker Compose 项目目录用于存放配置文件:

mkdir apisix-3.2.2
cd apisix-3.2.2

然后我们将 APISIX 和 Dashboard 的配置放到 conf 子目录下:

mkdir conf

首先创建 APISIX 的配置文件:conf/config.yaml,内容如下:

apisix:
    node_listen:
        - port: 9088
    enable_ipv6: true
    enable_control: true
    control:
        ip: "[::]"
        port: 9090
deployment:
    role: traditional
    role_traditional:
        config_provider: etcd
    admin:
        admin_listen:
            port: 9180
        allow_admin:
            - 0.0.0.0/0
        admin_key:
            - name: "admin"
              key: b848941cd4e1003f2f961a7786ecf75f
              role: admin
            - name: "viewer"
              key: dd3bc5bde63f272f554b91336bfcfcb3
              role: viewer
    etcd:
       host:
           - http://10.23.0.21:2379
           - http://10.23.0.22:2379
           - http://10.23.0.23:2379
       user: apisix
       password: apisix
       prefix: /apisix
       timeout: 30
#plugin_attr:
#    prometheus:
#        export_addr:
#            ip: "0.0.0.0"
#            port: 9091
#END

上面配置的内容简要解释一下:

apisix.node_listen:设置 APISIX 的用户访问端口,默认是 9080,这里冲突所以进行了修改

apisix.control:配置控制 API 所监听的地址和端口,地址默认监听所有 IPv4 和 IPv6 的网卡,端口这里是 9090

deployment.role:配置了部署方式为 traditional,同时指定了配置中心是 etcd

deployment.admin:这个部分配置了 admin API 所监听的端口,以及访问 admin API 所需的 KEY。具体 KEY 可以按照下面的命令生成:

openssl rand -hex 16

deployment.etcd:配置 APISIX 所需要的 etcd 服务列表,建议分配专门的用户,不要用 root 用户,同时授权给 prefix 配置的路径,默认是 /apisix。

然后下面还有提供 prometheus 监控服务的配置,这里注释掉了,当然默认也会开启端口,如果需要修改可以调整这里的配置。

对于 APISIX 的默认配置可以参考:https://github.com/apache/apisix/blob/master/conf/config-default.yaml

上面配置保存后,我们继续创建 APISIX Dashboard 所需的配置文件:conf/dashboard.yaml,内容如下:

conf:
  listen:
    host: "::"
    port: 9188
  allow_list:
    - 0.0.0.0/0
  etcd:
    endpoints:
      - "http://10.23.0.21:2379"
      - "http://10.23.0.22:2379"
      - "http://10.23.0.23:2379"
    username: "apisix"
    password: "apisix"
    mtls:
      key_file: ""          # Path of your self-signed client side key
      cert_file: ""         # Path of your self-signed client side cert
      ca_file: ""           # Path of your self-signed ca cert, the CA is used to sign callers' certificates
    prefix: /apisix     # apisix config's prefix in etcd, /apisix by default

  log:
    error_log:
      level: warn       # supports levels, lower to higher: debug, info, warn, error, panic, fatal
      file_path:
        /dev/stderr  # supports relative path, absolute path, standard output
                        # such as: logs/error.log, /tmp/logs/error.log, /dev/stdout, /dev/stderr
    access_log:
      file_path:
        /dev/stdout
  security:
      content_security_policy: "default-src 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; frame-src *"

authentication:
  secret:
    e400104c00efdced86a809a76b4ce56f
  expire_time: 3600
  users:
    - username: admin   # username and password for login `manager api`
      password: admin
    - username: apisix
      password: apisix

plugins:
  # 比较多,参考配置文件:https://github.com/apache/apisix-docker/blob/master/example/dashboard_conf/conf.yaml 进行填写
  - api-breaker
  - authz-keycloak
  - basic-auth
  - batch-requests
  - consumer-restriction
  - cors
  # ...

这个配置也比较好理解,需要注意的是 Dashboard 是通过 etcd 对 APISIX 间接管理的,因此不需要直接配置 APISIX 的地址,同样上面是端口和 etcd 相关的配置,然后日志部分的配置改成了标准错误和标准输出,如果有需要可以改成具体的路径然后通过卷映射到容器内部。

下面 authentication 部分的 secret 是 JWT 认证的密钥,同样按照上面的方法生成一下,下面 users 是页面的登录用户,这里初始化了两个用户。

最后 plugins 是支持的插件,这个比较多,所以这里就列了几个,其余的参考官方给出了样例来填写即可,链接是:https://github.com/apache/apisix-docker/blob/master/example/dashboard_conf/conf.yaml

配置无误保存后,我们创建 docker-compose.yml 配置文件:

version: "3"

services:

  apisix:
    image: apache/apisix:3.2.2-debian
    restart: always
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - ./conf/config.yaml:/usr/local/apisix/conf/config.yaml:ro
    ports:
      - "9088:9088/tcp"
      - "9180:9180/tcp"
      - "127.0.0.1:9090:9090/tcp"

  apisix-dashboard:
    image: apache/apisix-dashboard:3.0.1-alpine
    restart: always
    environment:
      - TZ=Asia/Shanghai
    volumes:
    - ./conf/dashboard.yaml:/usr/local/apisix-dashboard/conf/conf.yaml
    ports:
    - "9188:9188"

配置比较简单,主要就是映射了一下配置文件,然后开放了主要的端口,注意在容器内监听的端口要比开放出来的多,比如 HTTPS 9443、Prometheus 的 9091 都没有开放出来,需要的之后再开启即可。

另外为了保证安全 control API 监听的地址修改为 127.0.0.1,防止外部访问。

最后我们启动 APISIX 和 Dashboard:

docker compose up -d
# 查看日志是否正常
docker compose logs 

启动后我们访问测试下:

curl -sI http://localhost:9088 | grep Server

可以看到返回的具体版本,然后就可以访问 Dashboard 进行管理了。