Kong 教程
1. 核心概念
Kong 是一款功能强大的开源 API 网关和服务网格,专为微服务架构设计,提供了路由、负载均衡、认证、限流、监控等丰富的功能。它基于 Nginx 和 OpenResty 构建,具有高性能、可扩展性和可靠性。
1.1 基本概念
- 服务(Service):定义后端服务的基本信息,如名称、URL、端口等。
- 路由(Route):定义如何将请求路由到服务,包含规则、方法、路径等。
- 上游(Upstream):定义后端服务的集群,包含多个目标(Target)。
- 目标(Target):后端服务的具体实例,包含 IP 地址和端口。
- 插件(Plugin):扩展 Kong 功能的组件,如认证、限流、监控等。
- 消费者(Consumer):API 的使用者,用于认证和授权。
- 证书(Certificate):SSL/TLS 证书,用于 HTTPS 服务。
- SNI:服务器名称指示,用于在单个 IP 地址上托管多个 HTTPS 服务。
1.2 工作原理
- 请求处理:接收客户端请求,根据路由规则匹配到对应的服务。
- 插件执行:按照配置的插件顺序执行插件逻辑,如认证、限流等。
- 负载均衡:如果服务配置了上游,则在多个目标之间进行负载均衡。
- 请求转发:将处理后的请求转发到后端服务。
- 响应处理:接收后端服务的响应,经过插件处理后返回给客户端。
2. 安装配置
2.1 安装 Kong
2.1.1 使用 Docker 安装
# 创建网络
docker network create kong-net
# 启动 PostgreSQL
docker run -d \n --name kong-db \n --network kong-net \n -p 5432:5432 \n -e POSTGRES_DB=kong \n -e POSTGRES_USER=kong \n -e POSTGRES_PASSWORD=kong \n postgres:13
# 初始化 Kong 数据库
docker run --rm \n --network kong-net \n -e KONG_DATABASE=postgres \n -e KONG_PG_HOST=kong-db \n -e KONG_PG_PASSWORD=kong \n -e KONG_CASSANDRA_CONTACT_POINTS=kong-db \n kong:latest kong migrations bootstrap
# 启动 Kong
docker run -d \n --name kong \n --network kong-net \n -e KONG_DATABASE=postgres \n -e KONG_PG_HOST=kong-db \n -e KONG_PG_PASSWORD=kong \n -e KONG_CASSANDRA_CONTACT_POINTS=kong-db \n -e KONG_PROXY_ACCESS_LOG=/dev/stdout \n -e KONG_ADMIN_ACCESS_LOG=/dev/stdout \n -e KONG_PROXY_ERROR_LOG=/dev/stderr \n -e KONG_ADMIN_ERROR_LOG=/dev/stderr \n -e KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl \n -p 8000:8000 \n -p 8443:8443 \n -p 8001:8001 \n -p 8444:8444 \n kong:latest2.1.2 使用 Kong Gateway
可以从 Kong 官方网站 下载 Kong Gateway,按照官方文档进行安装。
2.1.3 使用 Kubernetes 安装
使用 Helm 安装:
# 添加 Kong Helm 仓库
helm repo add kong https://charts.konghq.com
# 更新 Helm 仓库
helm repo update
# 安装 Kong
helm install kong kong/kong --namespace kong --create-namespace2.2 配置 Kong
2.2.1 环境变量配置
# 常用环境变量
KONG_DATABASE=postgres # 数据库类型:postgres, cassandra, or off
KONG_PG_HOST=localhost # PostgreSQL 主机
KONG_PG_PORT=5432 # PostgreSQL 端口
KONG_PG_USER=kong # PostgreSQL 用户
KONG_PG_PASSWORD=kong # PostgreSQL 密码
KONG_PG_DATABASE=kong # PostgreSQL 数据库
KONG_ADMIN_LISTEN=0.0.0.0:8001 # 管理 API 监听地址
KONG_PROXY_LISTEN=0.0.0.0:8000 # 代理监听地址
KONG_SSL_LISTEN=0.0.0.0:8443 # HTTPS 代理监听地址2.2.2 配置文件
Kong 的配置文件通常位于 /etc/kong/kong.conf,可以根据需要修改配置:
# 数据库配置
database = postgres
pg_host = localhost
pg_port = 5432
pg_user = kong
pg_password = kong
pg_database = kong
# 监听配置
admin_listen = 0.0.0.0:8001 reuseport backlog=16384, 0.0.0.0:8444 ssl reuseport backlog=16384
proxy_listen = 0.0.0.0:8000 reuseport backlog=16384, 0.0.0.0:8443 ssl reuseport backlog=16384
# 日志配置
proxy_access_log = /var/log/kong/access.log
proxy_error_log = /var/log/kong/error.log
admin_access_log = /var/log/kong/admin_access.log
admin_error_log = /var/log/kong/admin_error.log
# 插件配置
plugins = bundled # 启用的插件2.3 验证安装
# 检查 Kong 版本
curl -i http://localhost:8001
# 检查 Kong 状态
curl -i http://localhost:8001/status
# 查看已启用的插件
curl -i http://localhost:8001/plugins/enabled3. 基本使用
3.1 创建服务和路由
示例:创建服务和路由
# 创建服务
curl -i -X POST http://localhost:8001/services \n -d name=example-service \n -d url=http://httpbin.org
# 创建路由
curl -i -X POST http://localhost:8001/services/example-service/routes \n -d paths[]=/example \n -d methods[]=GET \n -d methods[]=POST
# 测试路由
curl -i http://localhost:8000/example/get3.2 配置插件
示例:配置限流插件
# 为服务添加限流插件
curl -i -X POST http://localhost:8001/services/example-service/plugins \n -d name=rate-limiting \n -d config.minute=10 \n -d config.hour=100 \n -d config.policy=local
# 测试限流
for i in {1..15}; do curl -i http://localhost:8000/example/get; done3.3 配置上游和目标
示例:配置上游和目标
# 创建上游
curl -i -X POST http://localhost:8001/upstreams \n -d name=backend-upstream
# 添加目标
curl -i -X POST http://localhost:8001/upstreams/backend-upstream/targets \n -d target=192.168.1.10:8080 \n -d weight=100
curl -i -X POST http://localhost:8001/upstreams/backend-upstream/targets \n -d target=192.168.1.11:8080 \n -d weight=50
# 创建使用上游的服务
curl -i -X POST http://localhost:8001/services \n -d name=backend-service \n -d host=backend-upstream \n -d port=8080 \n -d protocol=http
# 创建路由
curl -i -X POST http://localhost:8001/services/backend-service/routes \n -d paths[]=/backend
# 测试上游负载均衡
curl -i http://localhost:8000/backend3.4 配置 HTTPS
示例:配置 HTTPS
# 上传证书
curl -i -X POST http://localhost:8001/certificates \n -F "cert=@/path/to/cert.pem" \n -F "key=@/path/to/key.pem" \n -F "snis=example.com"
# 创建 HTTPS 服务
curl -i -X POST http://localhost:8001/services \n -d name=https-service \n -d url=https://httpbin.org
# 创建 HTTPS 路由
curl -i -X POST http://localhost:8001/services/https-service/routes \n -d paths[]=/https \n -d snis=example.com
# 测试 HTTPS
curl -i -k https://localhost:8443/https/get4. 高级功能
4.1 插件配置
示例:配置认证插件
# 创建消费者
curl -i -X POST http://localhost:8001/consumers \n -d username=user1
# 添加密钥认证
curl -i -X POST http://localhost:8001/consumers/user1/key-auth \n -d key=secret-key
# 为服务添加密钥认证插件
curl -i -X POST http://localhost:8001/services/example-service/plugins \n -d name=key-auth
# 测试认证
curl -i http://localhost:8000/example/get # 应该返回 401
curl -i http://localhost:8000/example/get -H "apikey: secret-key" # 应该成功示例:配置 CORS 插件
# 为服务添加 CORS 插件
curl -i -X POST http://localhost:8001/services/example-service/plugins \n -d name=cors \n -d config.origins=* \n -d config.methods=GET,POST,PUT,DELETE \n -d config.headers=Origin,Content-Type,Accept,Authorization \n -d config.credentials=true
# 测试 CORS
curl -i -X OPTIONS http://localhost:8000/example/get \n -H "Origin: http://example.com" \n -H "Access-Control-Request-Method: GET"4.2 服务网格配置
示例:配置服务网格
# 启用服务网格
curl -i -X POST http://localhost:8001/kong/mesh \n -d enabled=true
# 创建服务网格服务
curl -i -X POST http://localhost:8001/mesh/services \n -d name=mesh-service \n -d host=mesh-service \n -d port=8080
# 创建服务网格上游
curl -i -X POST http://localhost:8001/mesh/upstreams \n -d name=mesh-upstream
# 添加服务网格目标
curl -i -X POST http://localhost:8001/mesh/upstreams/mesh-upstream/targets \n -d target=192.168.1.10:8080
# 配置服务网格路由
curl -i -X POST http://localhost:8001/mesh/services/mesh-service/routes \n -d paths[]=/mesh4.3 健康检查和熔断
示例:配置健康检查和熔断
# 创建上游
curl -i -X POST http://localhost:8001/upstreams \n -d name=health-check-upstream \n -d healthchecks.active.type=http \n -d healthchecks.active.http_path=/health \n -d healthchecks.active.timeout=5 \n -d healthchecks.active.concurrency=10 \n -d healthchecks.active.interval=10 \n -d healthchecks.active.unhealthy.tries=3 \n -d healthchecks.active.healthy.tries=3
# 添加目标
curl -i -X POST http://localhost:8001/upstreams/health-check-upstream/targets \n -d target=192.168.1.10:8080
# 创建服务
curl -i -X POST http://localhost:8001/services \n -d name=health-check-service \n -d host=health-check-upstream \n -d port=8080
# 创建路由
curl -i -X POST http://localhost:8001/services/health-check-service/routes \n -d paths[]=/health-check
# 为服务添加熔断插件
curl -i -X POST http://localhost:8001/services/health-check-service/plugins \n -d name=circuit-breaker \n -d config.condition=healthy \n -d config.max_healthy=25 \n -d config.min_healthy=10 \n -d config.error_threshold=50 \n -d config.window_size=10 \n -d config.sleep_window=304.4 监控和日志
示例:配置 Prometheus 插件
# 启用 Prometheus 插件
curl -i -X POST http://localhost:8001/plugins \n -d name=prometheus
# 访问 Prometheus 指标
curl -i http://localhost:8001/metrics
# 配置文件日志插件
curl -i -X POST http://localhost:8001/plugins \n -d name=file-log \n -d config.path=/var/log/kong/file.log \n -d config.reopen=true5. 最佳实践
5.1 配置最佳实践
- 使用服务和路由:为每个后端服务创建单独的服务和路由,便于管理和监控。
- 合理使用插件:只启用必要的插件,避免过多插件影响性能。
- 配置上游和目标:对于多个后端实例,使用上游和目标进行负载均衡。
- 启用健康检查:为上游配置健康检查,及时发现和排除故障实例。
- 使用环境变量:使用环境变量管理配置,便于不同环境的部署。
5.2 性能优化
- 调整 Nginx 配置:根据硬件资源调整 Nginx 的 worker 进程数和连接数。
- 使用缓存:对于频繁请求的静态资源,使用缓存插件。
- 优化插件配置:合理配置插件参数,避免过度限制或监控。
- 使用数据库连接池:调整数据库连接池大小,提高数据库访问性能。
- 启用 HTTP/2:对于 HTTPS 服务,启用 HTTP/2 提高传输效率。
5.3 安全最佳实践
- 使用 HTTPS:为所有服务启用 HTTPS,保护数据传输安全。
- 配置认证:为敏感 API 配置认证插件,限制访问。
- 启用 CORS:合理配置 CORS 插件,避免跨站请求伪造。
- 使用限流:为 API 配置限流插件,防止滥用和 DDoS 攻击。
- 定期更新:及时更新 Kong 到最新版本,修复安全漏洞。
5.4 高可用配置
- 使用数据库集群:对于生产环境,使用 PostgreSQL 或 Cassandra 集群。
- 部署多个 Kong 实例:部署多个 Kong 实例,使用负载均衡器分发请求。
- 配置健康检查:为 Kong 实例配置健康检查,实现故障转移。
- 使用 Kong Manager:使用 Kong Manager 管理多个 Kong 实例。
- 定期备份:定期备份 Kong 配置和数据库,防止数据丢失。
6. 实用应用案例
6.1 微服务架构中的 API 网关
场景:在微服务架构中,使用 Kong 作为 API 网关,管理服务间的通信,提供认证、限流、监控等功能。
配置:
# 创建服务
curl -i -X POST http://localhost:8001/services \n -d name=user-service \n -d url=http://user-service:8000
curl -i -X POST http://localhost:8001/services \n -d name=product-service \n -d url=http://product-service:8000
curl -i -X POST http://localhost:8001/services \n -d name=order-service \n -d url=http://order-service:8000
# 创建路由
curl -i -X POST http://localhost:8001/services/user-service/routes \n -d paths[]=/api/users
curl -i -X POST http://localhost:8001/services/product-service/routes \n -d paths[]=/api/products
curl -i -X POST http://localhost:8001/services/order-service/routes \n -d paths[]=/api/orders
# 添加认证插件
curl -i -X POST http://localhost:8001/plugins \n -d name=key-auth \n -d config.key_names=apikey \n -d config.hide_credentials=true
# 添加限流插件
curl -i -X POST http://localhost:8001/plugins \n -d name=rate-limiting \n -d config.minute=100 \n -d config.hour=1000 \n -d config.policy=cluster
# 添加监控插件
curl -i -X POST http://localhost:8001/plugins \n -d name=prometheus
# 添加日志插件
curl -i -X POST http://localhost:8001/plugins \n -d name=file-log \n -d config.path=/var/log/kong/api.log
# 创建消费者
curl -i -X POST http://localhost:8001/consumers \n -d username=app1
# 添加 API 密钥
curl -i -X POST http://localhost:8001/consumers/app1/key-auth \n -d key=app1-secret-key6.2 多环境部署
场景:在开发、测试和生产环境中部署 Kong,使用不同的配置。
配置:
开发环境:
# 环境变量
KONG_DATABASE=off
KONG_PROXY_LISTEN=0.0.0.0:8000
KONG_ADMIN_LISTEN=0.0.0.0:8001
KONG_PLUGINS=bundled
KONG_LOG_LEVEL=debug测试环境:
# 环境变量
KONG_DATABASE=postgres
KONG_PG_HOST=postgres
KONG_PG_USER=kong
KONG_PG_PASSWORD=kong
KONG_PG_DATABASE=kong
KONG_PROXY_LISTEN=0.0.0.0:8000
KONG_ADMIN_LISTEN=0.0.0.0:8001
KONG_PLUGINS=bundled
KONG_LOG_LEVEL=info生产环境:
# 环境变量
KONG_DATABASE=postgres
KONG_PG_HOST=postgres-cluster
KONG_PG_USER=kong
KONG_PG_PASSWORD=secure-password
KONG_PG_DATABASE=kong
KONG_PROXY_LISTEN=0.0.0.0:8000 reuseport backlog=16384
KONG_SSL_LISTEN=0.0.0.0:8443 ssl reuseport backlog=16384
KONG_ADMIN_LISTEN=127.0.0.1:8001
KONG_PLUGINS=bundled
KONG_LOG_LEVEL=warn
KONG_NGINX_WORKER_PROCESSES=auto
KONG_NGINX_WORKER_CONNECTIONS=163846.3 Kubernetes 部署
场景:在 Kubernetes 集群中部署 Kong,使用 Helm 进行管理。
配置:
# 添加 Kong Helm 仓库
helm repo add kong https://charts.konghq.com
# 更新 Helm 仓库
helm repo update
# 创建命名空间
kubectl create namespace kong
# 安装 Kong
helm install kong kong/kong \n --namespace kong \n --set ingressController.installCRDs=true \n --set env.database=postgres \n --set env.pg_host=postgres.kong.svc.cluster.local \n --set env.pg_user=kong \n --set env.pg_password=kong \n --set env.pg_database=kong \n --set service.exposeAdmin=true
# 查看 Kong 资源
kubectl get all -n kong
# 创建 KongIngress 资源
cat <<EOF | kubectl apply -f -
apiVersion: configuration.konghq.com/v1
kind: KongIngress
metadata:
name: example-ingress
namespace: default
tproxy:
protocol: http
route:
methods:
- GET
- POST
regex_priority: 0
strip_path: true
preserve_host: false
upstream:
healthchecks:
active:
http_path: /health
interval: 10
timeout: 5
healthy:
successes: 3
unhealthy:
tcp_failures: 3
timeouts: 3
EOF
# 创建 Ingress
cat <<EOF | kubectl apply -f -
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
namespace: default
annotations:
kubernetes.io/ingress.class: kong
spec:
rules:
- host: example.com
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: example-service
port:
number: 80
EOF6. 总结
Kong 是一款功能强大的开源 API 网关和服务网格,专为微服务架构设计,提供了路由、负载均衡、认证、限流、监控等丰富的功能。它基于 Nginx 和 OpenResty 构建,具有高性能、可扩展性和可靠性。
通过本教程的学习,您应该已经掌握了 Kong 的核心概念、安装配置、基本使用、高级功能和最佳实践。在实际应用中,您可以根据具体的需求,灵活配置 Kong,以满足不同场景的要求。
6.1 核心优势
- 功能丰富:提供了路由、负载均衡、认证、限流、监控等丰富的功能。
- 可扩展性:通过插件系统,可以轻松扩展功能。
- 高性能:基于 Nginx 和 OpenResty,具有高性能和可靠性。
- 易于使用:提供了 RESTful API 和 Admin GUI,便于管理和配置。
- 丰富的集成:支持与 Kubernetes、Prometheus、Grafana 等工具集成。
- 开源免费:开源软件,免费使用。
6.2 应用前景
随着微服务架构的普及,API 网关的需求越来越高。Kong 作为一款成熟的 API 网关,在以下场景中有着广泛的应用前景:
- 微服务架构:作为微服务架构的入口点,管理服务间的通信。
- API 管理:管理和监控 API 的使用,提供认证和限流。
- 服务网格:在服务网格中作为控制平面,管理服务间的通信。
- 多环境部署:在开发、测试和生产环境中统一管理 API。
- 云原生应用:与 Kubernetes 等云原生工具集成,提供完整的 API 管理解决方案。
通过不断学习和实践 Kong 的功能和最佳实践,您可以充分发挥 Kong 的优势,构建现代化、可靠、安全的 API 管理系统。