基于k8s系统的API网关-kong网关
1. 为什么需要 API 网关
API网关是一个服务器,是系统的唯一入口。API网关封装了系统内部架构,为每个客户端提供一个定制的API。它可能还具有其它职责,如身份验证、监控、负载均衡、缓存、请求分片与管理、静态响应处理。API网关方式的核心要点是,所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有的非业务功能。网关也是提供REST/HTTP的访问API。
在微服务架构之下,服务被拆的非常零散,降低了耦合度的同时也给服务的统一管理增加了难度。在旧的服务治理体系之下,鉴权,限流,日志,监控等通用功能需要在每个服务中单独实现,这使得系统维护者没有一个全局的视图来统一管理这些功能。API 网关致力于解决的问题便是为微服务纳管这些通用的功能,在此基础上提高系统的可扩展性。微服务搭配上 API 网关,可以使得服务本身更专注于自己的领域,很好地对服务调用者和服务提供者做了隔离。
目前,比较流行的网关有:Nginx 、 Kong 、Orange等,还有微服务网关Zuul 、Spring Cloud Gateway等。对于 API Gateway,常见的选型有基于 Openresty 的 Kong、基于 Go 的 Tyk 和基于 Java 的 gateway,这三个选型本身没有什么明显的区别,主要还是看技术栈是否能满足快速应用和二次开发。
2. kong 网关简介
Kong是一款基于OpenResty(Nginx + Lua模块)编写的高可用、易扩展的,由Mashape公司开源的API Gateway项目。Kong是基于NGINX和Apache Cassandra或PostgreSQL构建的,能提供易于使用的RESTful API来操作和配置API管理系统,它可以水平扩展多个Kong服务器,通过前置的负载均衡配置把请求均匀地分发到各个Server,来应对大批量的网络请求。
Kong主要有三个组件:
- Kong Server :基于nginx的服务器,用来接收API请求。
- Apache Cassandra/PostgreSQL :用来存储操作数据。
- Kong dashboard:官方推荐UI管理工具,也可以使用 restfull 方式 管理admin api。
Kong采用插件机制进行功能定制,插件集(可以是0或n个)在API请求响应循环的生命周期中被执行。插件使用Lua编写,目前已有几个基础功能:HTTP基本认证、密钥认证、CORS( Cross-origin Resource Sharing,跨域资源共享)、TCP、UDP、文件日志、API请求限流、请求转发以及nginx监控。
Kong作为微服务的请求的网关,能通过插件提供负载均衡、日志记录、鉴权、限流、转换以及其他等功能。相对与旧的、没有使用网关的方式,Kong 把这些通用功能中心化,让微服务更加专注于业务本身。
Kong 官网:The API Platform Powering the API World | Kong Inc. 插件介绍,帮助文档等。
Kong 源码:GitHub - Kong/kong: 🦍 The Cloud-Native API Gateway and AI Gateway.
Kong UI管理工具:GitHub - PGBI/kong-dashboard: Dashboard for managing Kong gateway 浏览器UI管理工具
Kong 桌面管理工具:GitHub - getprimate/primate: A modern dashboard for Kong Gateway admins 有linux版本,windows版本,mac版本。
3. kong 架构
- 管理 API:通过 RESTful API 管理 Kong;能自动化集成;提供了API/API消费者/插件的管理;
- 插件:使用 Lua 脚本创建 Plugins;实现强力的定制化;与第三方服务集成;
- 集群和数据存储:数据存储可选择 PostgreSQL 或 Cassandra;能从单节点扩展为集群;使用内存缓存提高性能;
- OpenResty:拦截请求/响应生命周期;基于 NGINX 扩展;实现了请求/响应的Lua处理化;
- NGINX:验证过的高性能基础组件;HTTP 和反向代理服务器;处理底层操作;
Kong集群中的节点通过gossip协议自动发现其他节点,当通过一个Kong节点的管理API进行一些变更时也会通知其他节点。每个Kong节点的配置信息是会缓存的,如插件,那么当在某一个Kong节点修改了插件配置时,需要通知其他节点配置的变更。
4. Kong 的主要功能和特点
1、高性能和可扩展性
Kong 以其极高的性能著称,能够轻松处理每秒数万次请求,同时支持横向扩展,以适应业务增长。
2、插件化架构
Kong 提供了丰富的插件生态系统,支持开箱即用的功能扩展,如身份认证、流量控制、日志记录和分析等。开发者也可以根据需求开发自定义插件。
3、支持多种协议
Kong 支持 HTTP、HTTPS、gRPC 和 WebSocket 等多种协议,能够适配各种现代应用的通信需求。
4、多租户管理
Kong 支持多租户环境,可以为不同团队、应用或客户提供隔离的 API 管理能力。
5、强大的安全机制
内置的安全功能支持多种身份认证方式(如 OAuth2.0、JWT、API Key 等),同时可以与外部身份提供商集成。
6、容器和云原生支持
Kong 与容器化和云原生技术无缝集成,能够运行在 Kubernetes、Docker 等环境中,方便快速部署和扩展。
7、多语言支持
Kong 的插件使用 Lua 编写,但其 API 是语言无关的,任何语言的应用都可以轻松与 Kong 集成。
8、社区与企业支持
Kong 提供开源社区版(Kong Gateway)和付费的企业版(Kong Enterprise),以满足不同规模企业的需求。
5. Kong Gateway 的工作原理
Kong 的核心是基于 Nginx 和 OpenResty 构建的高性能代理服务器。它的主要职责是接收客户端的 API 请求,将这些请求根据配置路由到后端服务,同时执行一系列预定义的功能(如认证、限流、日志记录等)。Kong 的运行可以划分为三个主要阶段:
- 接收请求:客户端发送请求到 Kong 网关,Kong 根据请求的 URL、方法和头信息来匹配配置的服务和路由。
- 执行插件:匹配成功后,Kong 会在请求和响应的生命周期中执行相关插件(如身份验证、速率限制等)。
- 转发请求:经过处理后,Kong 将请求转发到后端服务,并将响应返回给客户端。
这种模块化的设计使得 Kong 非常灵活,可轻松扩展功能并适应复杂的业务需求。
6. Kong 核心概念
名称 | 描述 |
Service | 对应位于 Kong 后方的自身的 |
Route | Kong 的入口点,定义了如何把请求发送到特定 |
Plugin | 插件提供了模块化系统,用来修改或控制 Kong。插件提供了大量功能,比如访问控制、缓存、限流、日志记录等。 |
Consumer | 消费者,表示使用 API 的用户,能用来对用户进行访问控制、跟踪等。 |
Upstream | 上游对象表示虚拟主机名,可用于在多个服务(目标)上对传入请求进行负载平衡。例如,一个名为service.v1的上游。使用upstream_url=https://service.v1.xyz/some/path创建API对象。对该API的请求将被代理到上游中定义的目标。 |
7. Kong 网关请求流程
当Kong运行时,每个对API的请求将先被Kong命中,然后这个请求将会被代理转发到最终的API接口。在请求(Requests)和响应(Responses)之间,Kong将会执行已经事先安装和配置好的任何插件,授权您的API访问操作。Kong是每个API请求的入口点(Endpoint)。
8. 基于 k8s 部署 kong
8.1. 环境
服务 | 版本 |
kong | 3.10 |
postgresql | 13 |
K8s | v1.30.7 |
8.2. 部署
- 给节点打标签:kong-gateway=true,设置节点调度、容器组反亲和
- 命名空间:kong
- host 网络模式
- 环境资源有限,只部署一个实例
参考:Overview - Kong Gateway | Kong Docs
[root@master ~]# kubectl get deploy,pods -n kong -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
deployment.apps/kong-gateway 1/1 1 1 2d kong-gateway kong/kong-gateway:3.10 app=kong-gateway,instance=kong-gatewayNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/kong-gateway-849cc5ff89-2nkg2 1/1 Running 0 177m 192.168.100.10 master <none> <none>
8.3. 默认端口及描述
- 8000: 用来接收来自客户端的 HTTP 流量的请求,并转发到上游服务
- 8443: 用来接收来自客户端的 HTTPS 流量的请求,并转发到上游服务
- 8001: 用来接收访问 Admin API 的 HTTP 流量的请求
- 8444: 用来接收访问 Admin API 的 HTTPS 流量的请求
- 8002: 用来接收访问 Admin Manager gui 的 HTTP 流量的请求
- 8445: 用来接收访问 Admin Manager gui 的 HTTPS 流量的请求
- 8100:健康检测
9. GUI 管理工具
管理 Kong 可以直接使用 Admin API,当然也有基于 Admin API 实现 GUI 管理工具。
Kong 官方提供了 GUI 管理工具,Kong Manager。
默认访问:http://IP:8002
containers:- env:- name: KONG_ADMIN_GUI_URLvalue: 'http://192.168.100.10:8002'- name: KONG_ADMIN_GUI_PATHvalue: /
10. GUI 工具 使用示例
需求:
- 在 k8s 当中 default 空间以 deployment 部署双实例服务
- 在 kong 网关进行相关配置,域名:nginx.kvip.top
- 绑定 host 进行测试
# 服务信息如下
[root@master ~]# kubectl get deploy,pods,svc
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-app 2/2 2 2 10m53sNAME READY STATUS RESTARTS AGE
pod/nginx-app-86bb9cfcbc-dbsld 1/1 Running 0 10m7s
pod/nginx-app-86bb9cfcbc-p8sc5 1/1 Running 0 10m5sNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/nginx ClusterIP 10.105.145.42 <none> 8081/TCP 8m# 测试
[root@master ~]# curl 10.105.145.42:8081
'''主机名称:nginx-app-86bb9cfcbc-p8sc5</br>
'''
10.1. 配置证书
Certificates
-> + New certificate
10.2. 配置 SNIs
上一步配置证书时,已设置 SNIs,这里会自动创建;SNIs 是与路由进行证书绑定。
10.3. 创建 services
10.4. 创建 route
10.5. 绑定 host 测试
在 host 文件添加:192.168.100.10 nginx.kvip.top
11. 通过 api 接口进行配置
需求:
- 在 k8s 当中 pro 空间以 deployment 部署双实例服务
- 在 kong 网关进行相关配置,域名:py.aivp.top
- 绑定 host 进行测试
[root@master ~]# kubectl get deployment,pods,svc -n pro
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/py-app 2/2 2 2 2d21hNAME READY STATUS RESTARTS AGE
pod/py-app-59d6f5db66-pgr5g 1/1 Running 0 2d21h
pod/py-app-59d6f5db66-zpr7s 1/1 Running 0 2d21hNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/py-app ClusterIP 10.108.163.217 <none> 8085/TCP 2d21h[root@master ~]# curl http://10.108.163.217:8085/info | jq
{"hostname": "py-app-59d6f5db66-zpr7s","ipaddress": "10.244.219.97","time": "2025-04-30 14:14:50","traceId": "20250430.141450.10.244.219.97.1001.00013","version": "v1"
}
11.1. 配置证书
curl -X POST -H 'content-type:application/json' http://192.168.100.10:8001/default/certificates -d '{"cert": "-----BEGIN CERTIFICATE-----\nMIIEP7dLc0G6QH8SKVDC/DYcFLJqwWwpMwenB/ycbWm\n-----END CERTIFICATE-----","key": "-----BEGIN RSA PRIVATE KEY-----\nMIy50Cin690L3dge9Qrw0ceo\n-----END RSA PRIVATE KEY-----","cert_alt": null,"key_alt": null,"snis": ["*.aivp.top"],"tags": ["aivp.top"]
}'
11.2. 配置 SNIs
上一步配置证书时,已设置 SNIs,这里会自动创建;SNIs 是与路由进行证书绑定。
curl -X POST -H 'content-type:application/json' htt路由p://192.168.100.10:8001/default/snis -d '{"name": "","tags": [],"certificate": {"id": ""}
}'
11.3. 创建 services
curl -X POST -H 'content-type:application/json' http://192.168.100.10:8001/default/services -d '{"name": "py-app","tags": ["py-app"],"protocol": "http","path": "/","read_timeout": 60000,"retries": 5,"host": "py-app.pro.svc.cluster.local","connect_timeout": 60000,"ca_certificates": null,"client_certificate": null,"write_timeout": 60000,"port": 8085
}'
11.4. 创建 route
curl -X POST -H 'content-type:application/json' http://192.168.100.10:8001/default/services/d591e663-93ec-47de-a6db-b256fc591f6e/routes -d '{"name": "route-py-app","protocols": ["http","https"],"https_redirect_status_code": 426,"strip_path": true,"preserve_host": false,"request_buffering": true,"response_buffering": true,"tags": ["route-py-app"],"service": {"id": "d591e663-93ec-47de-a6db-b256fc591f6e"},"methods": null,"hosts": ["py.aivp.top"],"paths": ["/"],"headers": null,"regex_priority": 0,"path_handling": "v0","sources": null,"destinations": null,"snis": ["*.aivp.top"]
}'
11.5. 绑定 host 测试
在 host 文件添加:192.168.100.10 py.aivp.top