1. 简介
1.1 什么是Kong API Gateway?
Kong 是一款广泛使用的开源 API Gateway 和微服务管理工具,最初由 Mashape(现为 Kong Inc.)在 2015 年推出。它基于 Nginx 和 OpenResty 构建,旨在为现代应用程序提供高性能、可扩展的 API 网关解决方案。
Kong 的核心功能是帮助开发者和企业管理 API 请求的路由、认证、安全、流量控制以及其他与 API 生命周期相关的任务。无论是单体应用还是微服务架构,Kong 都可以高效地协助处理复杂的 API 管理需求。
1.2 Kong 的主要功能和特点
-
高性能和可扩展性
Kong 以其极高的性能著称,能够轻松处理每秒数万次请求,同时支持横向扩展,以适应业务增长。 -
插件化架构
Kong 提供了丰富的插件生态系统,支持开箱即用的功能扩展,如身份认证、流量控制、日志记录和分析等。开发者也可以根据需求开发自定义插件。 -
支持多种协议
Kong 支持 HTTP、HTTPS、gRPC 和 WebSocket 等多种协议,能够适配各种现代应用的通信需求。 -
多租户管理
Kong 支持多租户环境,可以为不同团队、应用或客户提供隔离的 API 管理能力。 -
强大的安全机制
内置的安全功能支持多种身份认证方式(如 OAuth2.0、JWT、API Key 等),同时可以与外部身份提供商集成。 -
容器和云原生支持
Kong 与容器化和云原生技术无缝集成,能够运行在 Kubernetes、Docker 等环境中,方便快速部署和扩展。 -
多语言支持
Kong 的插件使用 Lua 编写,但其 API 是语言无关的,任何语言的应用都可以轻松与 Kong 集成。 -
社区与企业支持
Kong 提供开源社区版(Kong Gateway)和付费的企业版(Kong Enterprise),以满足不同规模企业的需求。
1.3 为什么选择 Kong?
- 适配现代架构:在微服务、容器化和 DevOps 的背景下,Kong 提供了企业级的解决方案来处理 API 管理的复杂性。
- 开源社区活跃:得益于开源社区的支持,Kong 拥有丰富的文档、教程和插件生态,且发展快速。
- 灵活性:无论是部署到裸机、虚拟机,还是现代容器编排平台,Kong 都能够快速适配,支持动态扩展。
2. Kong 的核心架构
2.1 Kong Gateway 的工作原理
Kong 的核心是基于 Nginx 和 OpenResty 构建的高性能代理服务器。它的主要职责是接收客户端的 API 请求,将这些请求根据配置路由到后端服务,同时执行一系列预定义的功能(如认证、限流、日志记录等)。Kong 的运行可以划分为三个主要阶段:
- 接收请求:客户端发送请求到 Kong 网关,Kong 根据请求的 URL、方法和头信息来匹配配置的服务和路由。
- 执行插件:匹配成功后,Kong 会在请求和响应的生命周期中执行相关插件(如身份验证、速率限制等)。
- 转发请求:经过处理后,Kong 将请求转发到后端服务,并将响应返回给客户端。
这种模块化的设计使得 Kong 非常灵活,可轻松扩展功能并适应复杂的业务需求。
2.2 数据平面和控制平面的区别
Kong 的架构采用了现代化的分布式设计,主要分为 数据平面(Data Plane) 和 控制平面(Control Plane):
-
数据平面
数据平面负责处理实际的 API 流量,包括接收客户端请求、执行插件功能并转发请求到后端服务。数据平面的节点通常是无状态的,便于横向扩展。 -
控制平面
控制平面负责管理和配置 Kong 的运行状态。它存储 API 配置、路由规则和插件数据,并将这些配置同步到数据平面的节点。控制平面通常需要连接到一个数据库(如 PostgreSQL)来存储元数据。
在生产环境中,控制平面和数据平面可以分开部署,以实现更高的可靠性和扩展性。
2.3 插件机制介绍
Kong 的插件机制是其核心功能之一,允许用户在请求和响应的生命周期中自定义逻辑。这些插件是 Lua 脚本,运行在 OpenResty 的执行环境中。插件分为以下几个阶段执行:
-
访问阶段(Access Phase)
在请求进入后端服务之前执行,常用于身份验证、限流和权限控制。 -
认证阶段(Authentication Phase)
验证请求的身份是否合法,确保只有授权用户可以访问服务。 -
变换阶段(Transformation Phase)
可以修改请求的内容(如头信息、参数)或响应的内容(如响应体)。 -
日志阶段(Log Phase)
在请求完成后执行,记录请求和响应的相关数据,用于分析和监控。
2.4 插件的分类
- 安全插件:如 OAuth2、JWT、API Key 验证等。
- 流量控制插件:如速率限制、连接限制等。
- 观察与监控插件:如日志记录、分布式追踪、Prometheus 集成等。
- 自定义插件:用户可以编写 Lua 脚本开发自定义功能。
2.5 插件的加载方式
- 全局插件:应用于所有服务和路由。
- 服务级插件:仅应用于特定的服务。
- 路由级插件:仅应用于特定的路由。
- 消费者级插件:与特定的 API 消费者相关联。
Kong 的插件机制为其提供了强大的扩展能力,适用于从简单到复杂的各种场景。
3. Kong 的安装与部署
Kong 提供了多种安装和部署方式,可以运行在裸机、虚拟机、Docker 容器和 Kubernetes 等多种环境中。以下内容将涵盖常见的安装和部署方法。
3.1 安装前的准备工作
在安装 Kong 之前,需要确保以下环境准备就绪:
-
操作系统要求:
- 支持的操作系统包括 CentOS、Ubuntu、Debian、MacOS 等。
- 如果是容器化部署,需要预装 Docker 或 Kubernetes。
-
数据库:
- Kong 支持两种模式:
- DB-less 模式:无需数据库,适用于简单配置或静态环境。
- 传统模式:需要使用 PostgreSQL 或 Cassandra 数据库存储配置。
- PostgreSQL 是更常见的选择,需确保数据库可用。
- Kong 支持两种模式:
-
依赖工具:
- 必要工具包括
curl
、wget
、tar
等。 - 如果需要安装 Kong 企业版,需获取授权密钥。
- 必要工具包括
3.2 安装 Kong:单机模式
单机模式适合测试或开发环境,以下以 Ubuntu 系统为例:
-
更新系统:
sudo apt update && sudo apt upgrade
-
添加 Kong 的 APT 仓库:
echo "deb [trusted=yes] https://download.konghq.com/gateway-3.x-ubuntu $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/kong.list sudo apt update
-
安装 Kong:
sudo apt install -y kong
-
初始化数据库(如果使用数据库模式):
kong migrations bootstrap
-
启动 Kong:
kong start
-
验证安装:
在浏览器中访问http://localhost:8001
,如果返回 Kong 的管理 API 信息,则安装成功。
3.3 安装 Kong:集群模式
在生产环境中,通常会部署多台 Kong 实例以实现高可用和负载均衡。
-
部署数据库:
- 使用 PostgreSQL 作为后端数据库,并配置多实例访问。
-
配置 Kong 实例:
- 编辑
/etc/kong/kong.conf
文件,确保所有 Kong 实例指向相同的数据库。
database = postgres pg_host = <PostgreSQL-Host> pg_port = 5432 pg_user = kong pg_password = <your-password> pg_database = kong
- 编辑
-
初始化数据库(只在第一个实例上运行):
kong migrations bootstrap
-
启动多个 Kong 实例:
在每台服务器上运行:kong start
-
负载均衡:
- 在前端使用负载均衡器(如 Nginx 或 AWS ELB),将流量分配到多个 Kong 实例。
3.4 容器化部署(Docker 和 Kubernetes)
-
使用 Docker 部署 Kong:
- 拉取 Kong 的 Docker 镜像:
docker pull kong
- 运行容器(DB-less 模式):
docker run -d --name kong -p 8000:8000 -p 8443:8443 -p 8001:8001 kong:latest
- 拉取 Kong 的 Docker 镜像:
-
使用 Kubernetes 部署 Kong:
- 安装
kubectl
和Helm
工具。 - 添加 Kong 的 Helm 仓库:
helm repo add kong https://charts.konghq.com helm repo update
- 部署 Kong:
helm install kong kong/kong --set ingressController.installCRDs=false
- 验证部署:
kubectl get pods -n kong
- 安装
3.5 安装后的基本配置
-
配置服务和路由:
- 创建服务:
curl -i -X POST http://localhost:8001/services/ \ --data "name=example-service" \ --data "url=http://httpbin.org"
- 添加路由:
curl -i -X POST http://localhost:8001/services/example-service/routes \ --data "paths[]=/example"
- 创建服务:
-
测试 API:
- 使用
curl
或浏览器访问:http://localhost:8000/example
- 使用
4. 配置和管理 API
在安装并启动 Kong 后,下一步是配置和管理 API 服务、路由以及流量控制规则。Kong 提供了简单直观的管理方式,包括 RESTful API、命令行工具(CLI)和图形化管理界面(Kong Manager)。
4.1 创建和管理服务与路由
Kong 的核心概念是 服务(Service) 和 路由(Route):
- 服务:代表一个后端 API 服务的定义,通常是一个上游服务的 URL。
- 路由:定义了请求如何与服务匹配和绑定。
创建服务
通过 Admin API 创建服务:
curl -i -X POST http://localhost:8001/services/ \
--data "name=example-service" \
--data "url=http://httpbin.org"
上述命令创建了一个名为 example-service
的服务,指向 http://httpbin.org
。
创建路由
为服务添加路由:
curl -i -X POST http://localhost:8001/services/example-service/routes/ \
--data "paths[]=/example"
这将创建一个路由,当访问 http://<Kong-IP>:8000/example
时,Kong 会将流量转发到 http://httpbin.org
。
验证配置
通过以下命令测试路由是否生效:
curl -i http://localhost:8000/example
如果返回了 httpbin.org
的响应,说明配置成功。
更新和删除服务/路由
- 更新服务:
curl -i -X PATCH http://localhost:8001/services/example-service \ --data