传统服务如下左图,通用函数重复使用在多个服务中,系统庞大僵化难以管理,由于会冲击其他服务导致的扩展困难,由于系统限制导致生产率低,如下右图是kong的解决方案

Kong网关介绍[通俗易懂](玩转Kong网关)-风君雪科技博客Kong网关介绍[通俗易懂](玩转Kong网关)-风君雪科技博客

kong特点:

云原生:平台无关,kong可以在裸机和Kubernetes上运行。

动态负载平衡:跨多个上游服务的流量负载均衡。                                              

基于哈希的负载平衡:具有一致的哈希和粘性会话。  

断路器:智能跟踪不健康的上游服务。                                                    

健康检查:主动和被动监控您的上游服务。                                                       

服务发现:解析第三方DNS解析程序(如Consul)中的SRV记录。     

Serverless:直接从kong调用AWS lambdaopenswish函数。          

    WebSockets:通过WebSockets与上游服务通信。                                          

OAuth2.0:轻松地向API添加OAuth2.0身份验证。 

日志记录:通过HTTPTCPUDP或磁盘记录对系统的请求和响应。      

安全性:ACLbot检测、白名单/黑名单IP…                                                 

系统日志:记录到系统日志。  

ssl:为基础服务或api设置特定的ssl证书。                                      

监控:实时监控提供关键的链路和性能指标。                                                    

转发代理:使Kong作为透明的HTTP代理。  

认证:HMACJWTBASIC等   。                                                       

速率限制:基于多个变量的阻塞和限制请求。                                                    

转换:添加、删除或操作HTTP请求和响应。

缓存:在代理层缓存和响应服务。                                                          

cli:从命令行控制您的Kong集群。                                                                   

REST APIKong可以使用RESTful API进行管理操作,以获得最大的灵活性。

地理复制:配置跨不同区域的更新。                                    

故障检测和恢复:如果您的Cassandra节点之一发生故障,Kong不会受到影响 。     

集群:集群中kong节点自动保持更新。

可伸缩性:Kong支持横向扩展。                                         

性能:Kong核心通过扩展和使用nginx,可以轻松地处理负载。                    

插件:支持向KongAPI添加功能的可扩展的架构。有关插件和集成的更多信息,您可以查看KongHub

kong架构:

Kong网关介绍[通俗易懂](玩转Kong网关)-风君雪科技博客Kong网关介绍[通俗易懂](玩转Kong网关)-风君雪科技博客

OpenResty—定制的Nginx模块(Lua虚拟机)
Kong—在OpenResty中运行的Lua脚本网关程序
配置数据中心—基于数据库
Router—三种路由规则
LoadBalance—Dns解析和Ring-balancer
Plugin—可扩展的插件

Kong核心基于OpenResty构建,对请求/响应使用Lua脚本处理;
Kong Restful API提供了管理kong的功能;
数据中心用于存储Kong集群节点信息、API、消费者、插件等信息,目前提供了PostgreSQL和Cassandra支持,如果需要高可用建议使用Cassandra;
Kong使用了DNS-Balancer和Ring-Balancer两种均衡模式
Kong会代理HTTP请求,根据HTTP主机头、请求URI和请求方式(GET/POST等)匹配路由规则,找到实际处理请求的后端服务
Kong插件支持裁剪添加插件,插件不仅可以处理请求,还可以定义API,操作数据库,本身提供了许多插件,支持鉴权认证、安全控制、流量调控和请求报文转换等
DNS解析器将使用标准配置文件/etc/hosts和etc/resolv.conf ,会将主机名解析为SRV或A记录

流程:
Kong网关介绍[通俗易懂](玩转Kong网关)-风君雪科技博客Kong网关介绍[通俗易懂](玩转Kong网关)-风君雪科技博客

init_by_lua*
  
发生在master进程启动阶段。这里会对数据访问层进行初始化,加载插件的代码,构造路由规则表。

init_worker_by_lua*
  
发生在worker进程启动阶段。这里会开启数据同步机制,执行每个插件的init_worker方法。

set_by_lua*
  
处理请求第一个执行阶段。这里可以做一些流程分支处理判断变量初始化。kong没有使用该阶段。

rewrite_by_lua*
  
这里可以对请求做一些修改。kong在这里会把处理代理给插件的rewrite方法。

access_by_lua*
  
kong在这里对请求进行路由匹配,找到后端的upstream服务的节点。

balancer_by_lua*
  
kong在这里会把上一阶段找到的服务节点设置给nginxload balancer。如果设置了重试次数,此阶段可能会被执行多次。

header_filter_by_lua*
  
这里可以对响应头做一些处理。kong在这里会把处理代理给插件的header_filter方法。

body_filter_by_lua*
  
这里可以对响应体做一些处理。kong在这里会把处理代理给插件的body_filter方法。

log_by_lua*
  
kong在这里会通过插件异步记录日志和一些metrics数据。

功能:

Service:对外提供的服务
Route:路由规则
插件:包含丰富的功能
Consumers:与Service使用方关联,可用于跟踪,访问管理等
配置:具有丰富的功能,支持注入Nginx指令
存储:Cassandra或PostgreSQL

1、添加服务 $ curl –i -X POST \ —url http://localhost:8001/services/ \ –data ‘name=example-service’ \ –data ‘url=http://mockbin.org‘

2、添加路由 $ curl –i -X POST \ —url http://localhost:8001/services/example-service/routes \ –data ‘hosts[]=example.com‘

3、添加插件 $ curl –i -X POST \ —url http://localhost:8001/services/example-service/plugins/ \ –data ‘name=key-auth

4Consumers与使用您的Service的个人相关联,并可用于跟踪,访问管理等 添加consumer $ curl -i -X POST \ –url http://localhost:8001/consumers/ \ –data “username=Jason«

5Kong将把所有数据(例如路由,服务,消费者和插件)存储在CassandraPostgreSQL中,并且属于同一群集的所有Kong节点必须将它们自己连接到同一个数据库。

6origin配置 http://upstream-foo-bar:1234=http://localhost:5678服务端口:

8000 Kong用来监听来自客户端的HTTP流量,并将其转发到上游服务
8443 Kong用来监听传入的HTTPS流量。此端口具有和8000端口类似的行为,但它仅用于HTTPS流量。可以通过配置文件禁用此端口。
8001 Admin API用于接收管理命令。
8444 Admin API监听HTTPS流量。

路由功能:

三种规则

“hosts”: [“example.com”, “foo-service.com”], 
“paths”: [“/foo”, “/bar”], 
“methods”: [“GET”]
 }
首先尝试匹配具有最多规则的路由
Host 匹配示例:GET / HTTP/1.1 Host: service.com ->  GET / HTTP/1.1 Host: <my-service-host.com>
Paths 匹配规则:最长路径规则,支持正则表达式,
Method方法匹配:{ “methods”: [“GET”, “HEAD”], “service”: { “id”: “…” } }  -> GET / HTTP/1.1 Host: …   HEAD /resource HTTP/1.1 Host: …
Kong网关介绍[通俗易懂](玩转Kong网关)-风君雪科技博客Kong网关介绍[通俗易懂](玩转Kong网关)-风君雪科技博客

负载均衡:

基于DNS的负载均衡:
Kong从DNS服务器获取信息,按如下顺序解析记录:
1、上一次成功解析的类型
2、SRV 记录:包含ip、port、weight 
3、A 记录:只包含ip
4、CNAME 记录
环装负载均衡:Kong维护节点信息,基于一致性hash
这种方法可支持灰度发布/多版本部署及流量分配
Upstream:权重分配、健康检查、session sticky
Target:维护机器信息 
Kong网关介绍[通俗易懂](玩转Kong网关)-风君雪科技博客Kong网关介绍[通俗易懂](玩转Kong网关)-风君雪科技博客

kong会根据配置定期对后端服务节点机器调用检查url进行检查,如果检查超时或HTTP返回码满足失败条件的次数超过限制,负载均衡器会把该节点标记为不可用。
kong集群:

集群节点使用同一db,共享相同配置
集群与负载均衡无关,组建集群前仍需负载均衡

拥有一个Kong集群并不意味着您的客户流量将在您的Kong节点之间进行负载均衡。 您仍需要在Kong节点前面安装负载均衡器来分配流量
数据库缓存配置:1、db_update_frequency (default: 5s) ,此值确定Kong节点将为无效事件轮询数据库的频率;2、db_update_propagation (default: 0s),延迟更新,为了确保更改有时间跨数据库节点传播;3、db_cache_ttl (default: 0s),Kong将缓存数据库实体(命中和未命中)的时间(以秒为单位),0表示不会清除缓存
Kong网关介绍[通俗易懂](玩转Kong网关)-风君雪科技博客Kong网关介绍[通俗易懂](玩转Kong网关)-风君雪科技博客

用户管理:

支持Restful管理Api:
1、功能强大,2、可发到集群任何节点,3、自动下沉至db数据中心,4、kong定时刷新缓存保证信息一致性
支持命令行管理命令:
kong check  kong migrations kong prepare kong quit 
kong reload kong restart kong stop kong version 
kong health

kong check 检查给定Kong配置文件的有效性
kong health 验证Kong 的服务组件是否正常运行
kong migrations 管理数据库迁移
kong prepare 此命令用来准备Kong前缀文件夹及其子文件夹和文件
kong quit 优雅地退出一个正在运行的Kong节点(Nginx和其他节点)在给定的前缀目录中配置的服务
kong reload 重新加载Kong节点(并启动其他已配置的服务)在给定的前缀目录中
kong restart 重新启动Kong节点(以及其他配置的服务,如Serf)在给定的前缀目录中。 
kong stop 停止给定的正在运行的Kong节点(Nginx和其他已配置的服务)在指定的前缀目录
kong version 打印kong的版本

健康检查和断路器:

1、主动检查
定期向上游的每个目标的已配置路径发出HTTP或HTTPS请求
TCP failures”,“HTTP failures”或“timeouts”计数器达到配置的阈值,则目标将被标记为不健康。
“Successes”计数器达到其配置的阈值,则目标将标记为健康。
2、被动检查—断路器

主动探测(在主动健康检查上)或代理请求(在被动健康检查上)会生成用于确定目标是健康还是不健康的数据。请求可能会产生TCP错误,超时或产生HTTP状态代码。根据此信息,运行状况检查器会更新一系列内部计数器:

如果返回的状态代码是一个配置为“healthy”的状态代码,它将递增目标的“Successes”计数器,并清除所有其他计数器;

如果连接失败,它将递增目标的“TCP failure”计数器,并清除“Successes”计数器;

如果超时,它将递增目标的“超时”计数器并清除“成功”计数器;

如果返回的状态代码是配置为“unhealthy”的状态代码,它将递增目标的“HTTP failure”计数器并清除“成功”计数器。

认证:

通过插件支持身份验证
支持匿名访问
支持多重认证:
1、多客户端对同服务可以使用不同认证方法
2、支持多个认证插件的与和或逻辑

Kong支持给定服务的多个身份验证插件,允许不同的客户端使用不同的身份验证方法来访问给定的服务或路由。

在评估多个身份验证凭据时,可以将auth插件的行为设置为执行逻辑AND或逻辑OR。行为的关键是config.anonymous属性。

验证插件的通用方案/流程如下:

1、将auth插件应用于服务或全局(您不能将其应用于消费者)

2、创建一个消费者consumer实体

3、为消费者提供特定身份验证方法的身份验证凭据

4、现在每当有请求进入Kong时,都会检查提供的凭据(取决于身份验证类型),如果请求无法验证,它将阻止请求,或者在header中添加使用者和凭据详细信息并转发请求。

Kong网关介绍[通俗易懂](玩转Kong网关)-风君雪科技博客Kong网关介绍[通俗易懂](玩转Kong网关)-风君雪科技博客

日志:

debug:含调试信息
info/notice:包含正常行为
warn:警告日志。
error:错误日志。
crit:当Kong在紧急条件下工作而不能正常工作从而影响多个客户时,使用此级别。
支持编写规则屏蔽某些日志

debug:它提供有关插件的runloop和每个插件或其他组件的调试信息。只是在调试期间使用,因为它的消息量太多了。

info/notice:kong没有在这两个级别上产生很大的差异。提供有关正常行为的信息,其中大多数行为可以忽略。

warn:要记录任何不会导致事务丢失但需要进一步调查的异常行为,应使用警告级别。

error:用于记录导致请求被停止的错误(例如,获取HTTP 500错误)。需要监控此类日志的速率。

crit:Kong在紧急条件下工作而不能正常工作从而影响多个客户时,使用此级别。

插件:

Lua插件使用插件开发工具包(PDK),与Kong的核心和其他组件交互

模块文件名称

是否必须

描述

api.lua

No

定义Admin API中可用的端点列表,用来与插件处理的自定义实体进行交互。

daos.lua

No

定义DAO(数据库访问对象)列表,这些DAO是插件所需的自定义实体的抽象,存储在数据存储区中。

handler.lua

Yes

接口的实现。每个函数都由Kong请求或连接所需的时刻运行。

migrations/xxxx.lua

No

数据库迁移(如创建表)。只有当您的插件必须在数据库中存储自定义实体并通过daos.lua定义的其中一个DAO与它们进行交互时,才需要进行迁移。

schema.lua

Yes

保存插件配置的schema约束,以便用户只能输入有效的配置值。

 

插件继承基类base_plugin.lua并在handler.lua中实现功能

nginx启动阶段加载plugins目录中插件

插件列表:

认证

Basic Authentication 基础认证插件

HMAC Authentication 认证插件

JWT 插件

Key Authentication 密钥认证插件

LDAP Authentication 认证插件

OAuth 2.0 Authentication 认证插件

Session 插件

安全

CORS 插件

IP Restriction 插件

Bot Detection 机器人检测插件

日志

File Log 插件

TCP Log 插件

变更

Correlation ID 关联 ID插件

Request Transformer 请求变更插件

Response Transformer 响应变更插件

传输限制

ACL 插件

Proxy Caching 代理缓存插件

Rate Limiting 速率限制插件

Response Rate Limiting 响应率限制插件

Request Termination 请求终止插件

Request Size Limiting 请求大小限制插件

分析与监测

Datadog 插件

Zipkin 插件

部署

Kubernetes Sidecar 注入插件

插件开发套件:

插件开发工具包 Plugin Development Kit(或“PDK”)是一组Lua函数和变量
插件可以使用这些函数和变量来实现自己的逻辑

kong.configuration                  包含当前Kong节点配置的只读表,基于配置文件和环境变量

kong.db                                     KongDAO实例(kong.db模块)。 包含各种实体的访问者对象。

kong.dns                                   Kong DNS解析器实例,来自luarestydns-c模块的客户端对象

kong.worker_events                 KongIPC模块实例,用于来自luaresty-worker-events模块的worker进程间间通信

kong.cluster_events                 用于节点间通信的Kong的集群事件模块的实例

kong.cache                               来自kong.cache模块的Kong数据库缓存对象的实例

kong.client                               客户信息模块一组函数,用于查询在给定请求的上下文中连接到Kong的客户端的信息

kong.ctx                                   客户信息模块函数组,用于查询在给定请求的上下文中连接到Kong的客户端的信息。

kong.ip                                     此模块可用于确定给定IP地址是否在trusted_ips配置属性定义的可信IP地址范围内

kong.log                                  允许日志以插件的名称作为前缀,以便进行调试

kong.node                               返回节点信息

kong.request                           request 模块是一组函数,用于获取有关客户端发出的传入请求的信息。

kong.response                        此模块允许在将响应发送回客户端之前改变响应

kong.routerRouter                  模块用于访问请求的路由属性的一组功能。

kong.serviceservice                 模块包含一组函数来操作对service的请求的连接

kong.service.request              操作对service的请求

kong.service.response           用来操作Service的响应

kong.table                               表的公用程序

kubernetes&service mesh:

Kubernetes sidecar injector plugin
使用iptables
分为数据面和控制面板
服务与数据面kong在一个pod
通过kong-admin管理mesh

Kong网关介绍[通俗易懂](玩转Kong网关)-风君雪科技博客Kong网关介绍[通俗易懂](玩转Kong网关)-风君雪科技博客

Origins配置在Kong用于服务网格(service mesh)时是必需的  http://upstream-foo-bar:1234=http://localhost:5678

配置在db中(Postgre和cassandra),控制面kong-admin写入配置

Kong网关介绍[通俗易懂](玩转Kong网关)-风君雪科技博客Kong网关介绍[通俗易懂](玩转Kong网关)-风君雪科技博客

servicea -> servicea-kong -> serviceb-kong -> serviceb

kong对比istio+envoy:

功能点

kong-mesh (community)

istio + envoy

分析

服务发现

通过admin api添加服务,并只能发现通过api添加的服务

支持对接k8s, consul等注册中心进行服务发现

从平台独立性来看,kong mesh占优; 从服务接管易用性来看,istio占优

服务协议

支持http, http2, websocket, stream

支持http, http2, grpc, websocket, stream

istio+envoy占优

服务路由

支持根据源、目标地址,method、host、path、protocol等细粒度的路由

支持除左侧列举的所有能力外,还支持按header以及subset(标签)的路由

istio+envoy占优

负载均衡

支持轮询、权重、一致性hash的负载均衡模式

支持除左侧列举的所有负载均衡模式外,还支持随机、最低负载等模式

istio+envoy占优

健康检查

支持主动健康检查以及被动健康检查(熔断)

支持主动健康检查以及被动健康检查(熔断)

基本对等

安全

支持Certificate证书管理,支持JWT+TLS加密传输

支持证书下发及更新,JWT+mTLS加密传输

基本对等

多用户

支持按consumer授权

支持RBAC用户角色授权

istio+envoy占优

故障注入

不支持

支持

istio+envoy占优

监控统计

继承nginx的统计能力,支持按请求、连接、健康状态等维度的统计

支持更细粒度的比如按协议、Zone的统计

istio+envoy占优

可扩展性

背靠openresty,提供强大的自定义插件能力,使用lua进行开发

提供lua插件开发能力,但能力比较基础

kong mesh占优

学习曲线

kong自身提供控制面和数据面能力,组网简单,纯lua语言上手较轻松

istio+envoy一起至少4个组件,跨两种语言,上手较难

kong mesh占优

 

引用:

1、Nginx、OpenResty和Kong的基本概念与使用方法 https://www.cnblogs.com/lijiaocn/p/9769771.html

2、kong-docs-cn  https://github.com/qianyugang/kong-docs-cn

3、kong mesh深度分析报告 https://www.servicemesher.com/blog/kong-mesh-analyse-report/

4、kong docs https://docs.konghq.com/install/kubernetes/

5、kong源码导读 http://techblog.ppdai.com/2018/04/16/20180416/