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:latest

2.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-namespace

2.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/enabled

3. 基本使用

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/get

3.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; done

3.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/backend

3.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/get

4. 高级功能

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[]=/mesh

4.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=30

4.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=true

5. 最佳实践

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-key

6.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=16384

6.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
EOF

6. 总结

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 管理系统。

« 上一篇 Traefik 教程 下一篇 » APISIX 教程