logo
Kong

第三章:Kong的进阶修炼 ⚔️

Kong的配置管理:声明式 vs 命令式

在Kong中,有两种主要的配置管理方式:声明式和命令式。理解这两种方式对于有效管理Kong至关重要。

命令式配置(Imperative Configuration)

命令式配置是通过Admin API一步步执行命令来配置Kong。这就像告诉厨师:“先打鸡蛋,然后加面粉,再加糖…”

优点

  • 直观、灵活,可以逐步应用更改
  • 适合初学者和交互式管理
  • 便于进行临时更改和实验

缺点

  • 难以版本控制
  • 难以在多环境间复制配置
  • 自动化部署较复杂

示例

Terminal window
# 创建一个服务
curl -X POST http://localhost:8001/services \
--data "name=example-service" \
--data "url=http://example.org"
# 为该服务创建一个路由
curl -X POST http://localhost:8001/services/example-service/routes \
--data "paths[]=/example"
# 添加一个插件
curl -X POST http://localhost:8001/services/example-service/plugins \
--data "name=rate-limiting" \
--data "config.minute=100"

声明式配置(Declarative Configuration)

声明式配置是通过一个配置文件定义整个Kong的期望状态。这就像给厨师一个完整的食谱:“这是蛋糕的所有材料和最终应该是什么样子”。

优点

  • 配置可以版本控制
  • 便于跨环境部署
  • 更适合GitOps工作流和CI/CD流程
  • 配置审查更容易

缺点

  • 需要完整理解配置结构
  • 不太适合小规模临时更改

示例kong.yml):

_format_version: "2.1"
services:
- name: example-service
url: http://example.org
routes:
- name: example-route
paths:
- /example
plugins:
- name: rate-limiting
config:
minute: 100

应用声明式配置:

Terminal window
# 对于DB-less模式
kong config parse kong.yml | kong config db_import -
# 或者,对于DB-less模式启动时
# 在kong.conf中设置
# declarative_config = /path/to/kong.yml

如何选择?

  • 小规模或测试环境:命令式配置更灵活,适合快速实验
  • 生产环境:声明式配置更可靠,方便团队协作和配置管理
  • 混合使用:利用kong config db_export命令导出当前配置,然后在声明式文件上进行修改

数据库模式 vs DB-less模式:如何选择?

Kong可以在两种主要模式下运行:数据库(DB)模式和无数据库(DB-less)模式。

数据库模式

在这种模式下,Kong使用关系型数据库(PostgreSQL或Cassandra)来存储配置。

优点

  • 支持动态更改配置(通过Admin API)
  • 集群节点间自动配置同步
  • 支持所有Kong功能,包括某些需要数据库的插件

缺点

  • 需要维护额外的数据库基础设施
  • 数据库可能成为性能瓶颈
  • 部署和维护更复杂

适用场景

  • 需要频繁动态更改配置的环境
  • 需要使用依赖数据库的插件(如OAuth2)
  • 大型、复杂的API管理需求

DB-less模式

在这种模式下,Kong不使用数据库,而是通过声明式配置文件来定义其行为。

优点

  • 部署简单,无需数据库依赖
  • 配置可以作为代码管理(配置即代码)
  • 性能更好(无数据库查询开销)
  • 适合容器和无服务器环境
  • 更容易实现不可变基础设施

缺点

  • 配置更改需要重新加载或重启
  • 不支持一些需要数据库的插件
  • 集群节点配置需要单独管理

适用场景

  • Kubernetes或容器环境
  • 追求高性能的场景
  • 配置变更不频繁的环境
  • 简化的部署流程

混合模式

从Kong 2.0开始,还支持混合模式,结合了两种模式的优点:

  • 控制平面(Control Plane):使用数据库模式,处理管理操作
  • 数据平面(Data Plane):使用DB-less模式,处理API流量

这种模式特别适合大规模部署,可以分离管理功能和数据处理功能。

选择决策树

以下是一个简单的决策树,帮助你选择适合的模式:

  1. 你是否需要使用依赖数据库的插件(如OAuth2)?

    • 是 → 数据库模式
    • 否 → 继续
  2. 你是否需要频繁动态更改配置?

    • 是 → 数据库模式
    • 否 → 继续
  3. 你是否优先考虑简化部署和性能?

    • 是 → DB-less模式
    • 否 → 数据库模式
  4. 你是否在使用容器或Kubernetes环境?

    • 是 → DB-less模式或混合模式
    • 否 → 视情况选择

Kong的高可用部署:生产环境不能掉链子

在生产环境中,Kong的高可用性至关重要。下面我们将探讨如何构建一个可靠的Kong部署。

基本架构组件

一个完整的高可用Kong部署通常包括:

  1. Kong节点:处理API请求的实例
  2. 数据库:PostgreSQL或Cassandra(如果使用数据库模式)
  3. 负载均衡器:分配请求到多个Kong节点
  4. 配置管理:管理和部署Kong配置

高可用部署模式

单区域多节点部署

最基本的高可用设置:

客户端 → 负载均衡器 → 多个Kong节点 → 上游服务
数据库(可选)

关键配置

  • 至少2个Kong节点(确保无单点故障)
  • 数据库高可用(主从复制或集群)
  • 负载均衡器健康检查

多区域部署

对于需要地理冗余的场景:

/ → 区域A:负载均衡器 → Kong节点A → 上游服务A
客户端 → DNS路由
\ → 区域B:负载均衡器 → Kong节点B → 上游服务B

考虑因素

  • 区域间数据同步(如果使用数据库模式)
  • 跨区域故障转移策略
  • 地理位置感知路由

混合模式部署(Kong 2.0+)

分离控制平面和数据平面:

→ 控制平面 → 数据库
管理员 → 负载均衡器 ↕
→ 数据平面 → 上游服务
客户端 → 负载均衡器 →

优势

  • 控制平面可以独立扩展和维护
  • 数据平面可以优化为无状态、高性能
  • 安全分离(控制平面可以放在内部网络)

Kubernetes上的高可用部署

Kubernetes提供了强大的容器编排能力,非常适合部署Kong:

# 简化的Kong Kubernetes清单示例
apiVersion: apps/v1
kind: Deployment
metadata:
name: kong
spec:
replicas: 3 # 多个副本确保高可用
selector:
matchLabels:
app: kong
template:
metadata:
labels:
app: kong
spec:
containers:
- name: kong
image: kong:latest
ports:
- containerPort: 8000
- containerPort: 8443
- containerPort: 8001
- containerPort: 8444
env:
- name: KONG_DATABASE
value: "postgres"
# 其他环境变量...
readinessProbe: # 健康检查确保流量只发送到健康的pod
httpGet:
path: /status
port: 8100
initialDelaySeconds: 5
timeoutSeconds: 1

高可用部署最佳实践

  1. 冗余

    • 至少部署2个Kong节点
    • 使用数据库模式时确保数据库高可用
  2. 自动扩展

    • 配置基于流量自动扩展Kong节点
    • 使用云平台的自动扩展功能或Kubernetes HPA
  3. 健康检查

    • 配置适当的健康检查端点
    • 自动剔除不健康的节点
  4. 蓝绿部署

    • 实施无停机更新策略
    • 先部署新版本,验证后再切换流量
  5. 备份与恢复

    • 定期备份Kong配置
    • 建立明确的恢复流程
  6. 故障演练

    • 定期测试节点故障场景
    • 验证自动恢复机制

监控和可观测性:让Kong”无处遁形”

高效监控Kong对于确保API网关的稳定性和性能至关重要。

监控什么?

关键指标

  1. 延迟指标

    • 请求处理时间
    • 上游服务响应时间
    • 插件处理时间
  2. 流量指标

    • 请求率(每秒请求数)
    • 带宽使用
    • 按路由/服务/消费者分类的流量
  3. 错误指标

    • HTTP错误率(4xx, 5xx)
    • 拒绝的请求(认证失败、限流等)
    • 上游服务错误
  4. 资源利用率

    • CPU使用率
    • 内存使用
    • 网络IO
    • 连接数

日志

Kong生成几种类型的日志:

  1. 访问日志:记录所有请求详情
  2. 错误日志:记录Kong内部错误
  3. 插件日志:特定插件生成的日志

监控工具和集成

Kong原生工具

  1. Kong Vitals(企业版):

    • 内置监控控制面板
    • 健康检查和性能指标
    • 异常检测
  2. Admin API状态端点

    • /status提供基本健康信息
    • 集群状态、节点信息等

集成第三方监控系统

  1. Prometheus + Grafana

安装Prometheus插件:

Terminal window
curl -X POST http://localhost:8001/plugins \
--data "name=prometheus"

这将暴露一个/metrics端点,Prometheus可以抓取该端点。然后使用Grafana创建仪表板。

  1. ELK Stack(Elasticsearch, Logstash, Kibana):

配置HTTP日志插件发送到Logstash:

Terminal window
curl -X POST http://localhost:8001/plugins \
--data "name=http-log" \
--data "config.http_endpoint=http://logstash:8080" \
--data "config.method=POST" \
--data "config.timeout=10000"
  1. Datadog

安装Datadog插件:

Terminal window
curl -X POST http://localhost:8001/plugins \
--data "name=datadog" \
--data "config.host=datadog-agent" \
--data "config.port=8125" \
--data "config.prefix=kong"

分布式追踪

对于微服务架构,分布式追踪尤为重要:

  1. 安装Zipkin插件
Terminal window
curl -X POST http://localhost:8001/plugins \
--data "name=zipkin" \
--data "config.http_endpoint=http://zipkin:9411/api/v2/spans" \
--data "config.sample_ratio=1"
  1. OpenTelemetry集成(较新的标准):

Kong支持通过插件集成OpenTelemetry,允许与多种后端系统兼容。

告警策略

设置适当的告警对于及时发现问题至关重要:

  1. 高延迟告警:当API响应时间超过阈值
  2. 错误率告警:当错误率超过正常基线
  3. 健康检查失败:当节点健康检查失败
  4. 资源使用告警:当CPU/内存使用过高

监控最佳实践

  1. 建立基线

    • 了解正常工作负载下的性能指标
    • 识别高峰期和低谷期模式
  2. 实施多层监控

    • 基础设施层(服务器、网络)
    • Kong应用层(API网关自身)
    • 业务层(API使用模式、业务影响)
  3. 日志管理

    • 实施日志轮转防止磁盘填满
    • 考虑日志聚合以便集中分析
    • 为敏感信息配置日志屏蔽
  4. 可视化仪表板

    • 创建针对不同受众的仪表板(开发、运维、管理)
    • 包含关键性能指标和健康状态
    • 设置趋势视图识别长期问题

小结与练习

在本章中,我们深入探讨了Kong的进阶主题:

  • 命令式vs声明式配置管理
  • 数据库vs DB-less模式的选择
  • 高可用部署架构
  • 全面的监控策略

练习

  1. 创建一个声明式配置文件(kong.yml),包含至少一个服务、两个路由和三个不同的插件
  2. 使用Docker Compose设置一个高可用的Kong环境(至少两个Kong节点,一个负载均衡器)
  3. 配置Prometheus和Grafana监控Kong,创建一个包含关键指标的仪表板
  4. 编写一个简单的脚本,定期备份Kong配置(使用kong config db_export

这些练习将帮助你将理论知识应用到实践中,为在生产环境中部署Kong做好准备。

在下一章中,我们将探索Kong的高级功能,包括自定义插件开发和高级认证机制。


温馨提示:本教程是系列内容的一部分,请继续阅读下一章节,逐步掌握Kong的各项功能。