K8s使用网关的原因
k8s简化了微服务架构,以Service为单位,代表一个个微服务,但是kubernetes集群整个网络对外是隔离的,在微服务架构下一般需要一个网关作为所有API的入口,Kong可以重构但这么一个角色,为集群统一入口,作为服务消费方和提供方的交互中间件。
- 拥有庞大的插件生态,能轻易扩展kong支持的功能(API认证,流量控制,访问限制)
- Kong服务本身和Admin管理API都集成在一个进程里,通过端口区分两者,简化了部署的复杂度
- 配置统一持久化到数据库,所有数据通过数据库共享数据(所有kong节点共享一个数据库)
有成熟的第三方管理UI和Admin管理API对接,从而能可视化管理kong
API网关
使用API网关的好处:
聚合接口使得服务对调用者透明,客户端与后端的耦合度降低;
- 聚合后台服务,节省流量,提高性能,提升用户体验;
- 提供安全、流控、过滤、缓存、计费、监控等API管理功能
服务提供者
经过注册中心
注册了域名后,可以对局域网内暴露DNS解析,局域网内的服务都可以通过域名去访问到服务。不过局域网内存在许多的应用,即会存在许多的地址,每次都直接去访问这些服务则十分的不方便。API网关提供了这个局域网对外唯一的入口,介于客户端与服务器端之间,用于对请求进行鉴权、限流、路由、监控等功能
路由
- 静态路由策略配置
后端服务的软负载均衡
软负载均衡:基于系统与应用的负载均衡,能够更好地根据系统与应用的状况来分配负载。但负载能力受服务器本身性能的影响,性能越好,负载能力越大。 硬负载均衡:能够直接通过智能交换机实现,处理能力更强,而且与系统无关,负载性能强更适用于一大堆设备、大访问量、简单应用。但成本高,除设备价格高昂,而且配置冗余.很难想象后面服务器做一个集群,但最关键的负载均衡设备却是单点配置;无法有效掌握服务器及应用状态。
后端服务的心跳检测
- 参数分流
- 流量的镜像复制
- 将给予熔断
-
限流
支持基于黑白名单的路由规则
- 负载均衡,支持多种负载均衡策略
-
鉴权
鉴定请求方的请求权限
-
监控
捕获异常请求
- 获取长时间请求并分析
Kong的优势
Kong是适合于多云和混合云的下一代API平台
- 开源并支持私有部署的一款API网管框架
- 基于lua语言、nginx以及OpenResty研发
- 高性能以及强大的扩展性(插件)
Nginx
、OpenRestry
、Kong
这三个项目紧密相连:
Nginx
是模块化设计的反向代理软件,C语言开发;OpenResty
是以Nginx
为核心的Web开发平台,可以解析执行Lua脚本;Kong
是一个OpenResty应用,一个api gateway。
Nginx 采用了模块化涉及,可以通过开发模块来扩展Nginx的功能。Nginx Module可以编译成.so
文件动态加载,也可以直接编译到nginx中,编译nginx时用 --add-module
指定要集成的模块
# 集成lua-nginx-module
./configure --prefix=/opt/nginx \
--with-ld-opt="-Wl,-rpath,/path/to/luajit-or-lua/lib" \
--add-module=/path/to/ngx_devel_kit \
--add-module=/path/to/lua-nginx-module
OpenResty 由Nginx、LuaJIT和很多Moudels组成的平台,用来托管完整的web应用,包含业务逻辑,而不只是静态文件服务器和反向代理,它集成了 LuaJit
(一个Lua代码的实时编译器),支持使用lua代码()
自动Kong2.0版开始,可以使用
Go
扩展Kong。为了让Kong运行Go插件,它使用了一个补充程序 go-pluginserver ,此过程的作用是基于与Kong的通信(通过Unix域套接字执行),动态加载Go插件并按需执行其代码。(Kong管理go-pluginserver的生命周期)
kong依赖外部的数据库进行数据管理(kong 1.1.x有了一个重大变换,实现了db-less模式,可以不使用数据库了)
启动kong及配置kong
配置启动
准备配置文件
$ cp kong.conf.default kong.conf
创建kong的数据库:
./bin/kong migrations up -c ./kong.conf
启动kong:
./bin/kong start -c ./kong.conf
kong默认的代理地址是:
proxy_listen = 0.0.0.0:8000, 0.0.0.0:8443
默认的管理地址是:
admin_listen = 127.0.0.1:8001, 127.0.0.1:8444 ssl
访问admin接口返回的是json字符串:
$ curl -i http://localhost:8001/
HTTP/1.1 200 OK
Date: Sat, 29 Sep 2018 08:56:51 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
Access-Control-Allow-Origin: *
Server: kong/0.14.1
Content-Length: 5667
{"plugins":{"enabled_in_cluster":[],"availab...
konga
konga是一款开源的kong UI程序,通过konga可以方便地管理kong配置
基本使用
添加服务
$ curl -X POST http://192.168.1.146:8001/services -d "name=websocket" -d "url=http://eventti-service.sky:8189/echo"
配置路由
curl -X POST http://192.168.1.146:8001/services/websocket/routes -d "paths=/echo"
插件
插件是用来扩展API的,例如为API添加认证、设置ACL、限制速率等、集成oauth、ldap等。
Kong Plugins中列出了已有的所有插件
使用kong插件的方法如下(kong-auth)
$ curl -i -X POST \
--url http://localhost:8001/services/example-service/plugins/ \
--data 'name=key-auth'
{
"config": {
"anonymous": "",
"hide_credentials": false,
"key_in_body": false,
"key_names": [
"apikey"
],
"run_on_preflight": true
},
"created_at": 1538218948000,
"enabled": true,
"id": "f25f3952-d0d4-4923-baac-860554fc2fc1",
"name": "key-auth",
"service_id": "ebed2707-e2fb-4694-9e8e-fb66fe9dd7c8"
}