1.基本概念
APISIX 是 Apache 下的一款云原生的 API 网关,支持全生命周期的 API 管理,在应用中可以作为所有 API 调用的统一入口。
APISIX 有一些基础概念如下:
- Upstream,或者叫做上游,是一组目标主机的抽象,上游一组节点提供实际的业务服务,一般需要指定负载均衡策略去调用。
- Route,路由定义了一组规则,指定如何匹配用户的请求并执行对应的插件,最后将请求转发到上游。
- Service,服务是一组上游和插件(不包括认证)的抽象,可以给多个路由复用,同时配置的变更也可以应用到全部的路由,解耦的同时还可以保持灵活性,服务和路由的关系通常是 1:N。
- Plugin,插件可以通过消费者或路由实现功能的扩展,从而满足用户对流量管理、权限认证、安全性、可观察性、请求/响应转换等方面的特定要求。
- Consumer,消费者就是请求 APISIX 服务的用户,消费者都会绑定认证和授权的插件,从而对身份进行识别,并且消费者配置的插件具有最高的优先级,APISIX 可以为不同的消费者配置不同的规则,实现比较灵活的功能。
知道了上面的一些基础概念,然后我们就开始搭建 APISIX 服务网关吧。
2.部署方式
APISIX 有 3 种部署方式,分别如下:
- traditional 这个是经典默认的部署方式,将数据平面和控制平面一块启动,方便管理。
- decoupled 这种是将控制平面和数据平面分离的部署方式,中间通过 mTLS 进行通信,这种适合在比较大规模的集群环境中使用。
- 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 进行管理了。