当前位置: 首页 > news >正文

基于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 架构

  1. 管理 API:通过 RESTful API 管理 Kong;能自动化集成;提供了API/API消费者/插件的管理;
  2. 插件:使用 Lua 脚本创建 Plugins;实现强力的定制化;与第三方服务集成;
  3. 集群和数据存储:数据存储可选择 PostgreSQL 或 Cassandra;能从单节点扩展为集群;使用内存缓存提高性能;
  4. OpenResty:拦截请求/响应生命周期;基于 NGINX 扩展;实现了请求/响应的Lua处理化;
  5. 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 的运行可以划分为三个主要阶段:

  1. 接收请求:客户端发送请求到 Kong 网关,Kong 根据请求的 URL、方法和头信息来匹配配置的服务和路由。
  2. 执行插件:匹配成功后,Kong 会在请求和响应的生命周期中执行相关插件(如身份验证、速率限制等)。
  3. 转发请求:经过处理后,Kong 将请求转发到后端服务,并将响应返回给客户端。

这种模块化的设计使得 Kong 非常灵活,可轻松扩展功能并适应复杂的业务需求。

6. Kong 核心概念

名称

描述

Service

对应位于 Kong 后方的自身的 Upstream API 或微服务。

Route

Kong 的入口点,定义了如何把请求发送到特定 Service 的规则。一个 Service 可以有多个Route

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. 部署 

  1. 给节点打标签:kong-gateway=true,设置节点调度、容器组反亲和
  2. 命名空间:kong
  3. host 网络模式
  4. 环境资源有限,只部署一个实例

参考: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 工具 使用示例

需求:

  1. 在 k8s 当中 default 空间以 deployment 部署双实例服务
  2. 在 kong 网关进行相关配置,域名:nginx.kvip.top
  3. 绑定 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 接口进行配置

需求:

  1. 在 k8s 当中 pro 空间以 deployment 部署双实例服务
  2. 在 kong 网关进行相关配置,域名:py.aivp.top
  3. 绑定 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

 

相关文章:

  • Kubernetes(k8s)学习笔记(六)--KubeSphere前置环境安装
  • PowerShell 备份 Windows10/11 还原计算机驱动程序SOP
  • 复杂网络系列:第 5 部分 — 社区检测和子图
  • USB布局布线
  • 【iOS】 方法交换
  • C++负载均衡远程调用学习之Agent代理模块基础构建
  • 修复笔记:SkyReels-V2 项目中的 torch.load 警告
  • 使用 IDEA + Maven 搭建传统 Spring MVC 项目的详细步骤(非Spring Boot)
  • Linux中的粘滞位和开发工具和文本编辑器vim
  • 神经网络发展的时间线——积跬步至千里
  • terraform resource创建了5台阿里云ecs,如要使用terraform删除其中一台主机,如何删除?
  • 【ThinkBook 16+ 电脑重做系统type-c接口部分功能失效解决方案】
  • Ubuntu 系统上广受好评的浏览器推荐
  • Python 数据智能实战 (12):效果评估 - 超越传统指标
  • Monorepo项目多项目一次性启动工具对比与实践
  • 修复笔记:获取 torch._dynamo 的详细日志信息
  • 如何使用python保存字典
  • 【Java idea配置】
  • 深入了解Linux系统—— 环境变量
  • 8.2 GitHub企业级PDF报告生成实战:ReportLab高级技巧与性能优化全解析
  • 演员扎堆音乐节,是丰富了舞台还是流量自嗨?
  • 外交部就习近平主席将应邀对俄罗斯进行国事访问并出席纪念苏联伟大卫国战争胜利80周年庆典答问
  • 中虎跳峡封闭仍有游客逆行打卡,景区:专人值守防意外
  • 乌美矿产协议文本公布,明确乌收益及协议优先级
  • 建设银行南昌分行引金融“活水”,精准灌溉乡村沃土
  • 抗美援朝老战士宁昭逝世,享年93岁