K8s使用网关的原因

k8s简化了微服务架构,以Service为单位,代表一个个微服务,但是kubernetes集群整个网络对外是隔离的,在微服务架构下一般需要一个网关作为所有API的入口,Kong可以重构但这么一个角色,为集群统一入口,作为服务消费方和提供方的交互中间件

  • 拥有庞大的插件生态,能轻易扩展kong支持的功能(API认证,流量控制,访问限制)
  • Kong服务本身和Admin管理API都集成在一个进程里,通过端口区分两者,简化了部署的复杂度
  • 配置统一持久化到数据库,所有数据通过数据库共享数据(所有kong节点共享一个数据库)
  • 有成熟的第三方管理UI和Admin管理API对接,从而能可视化管理kong

    API网关

    使用API网关的好处:

  • 聚合接口使得服务对调用者透明,客户端与后端的耦合度降低;

  • 聚合后台服务,节省流量,提高性能,提升用户体验;
  • 提供安全、流控、过滤、缓存、计费、监控等API管理功能

服务提供者经过注册中心注册了域名后,可以对局域网内暴露DNS解析,局域网内的服务都可以通过域名去访问到服务。不过局域网内存在许多的应用,即会存在许多的地址,每次都直接去访问这些服务则十分的不方便。API网关提供了这个局域网对外唯一的入口,介于客户端与服务器端之间,用于对请求进行鉴权限流路由监控等功能
image.png

路由

  • 静态路由策略配置
  • 后端服务的软负载均衡

    软负载均衡:基于系统与应用的负载均衡,能够更好地根据系统与应用的状况来分配负载。但负载能力受服务器本身性能的影响,性能越好,负载能力越大。 硬负载均衡:能够直接通过智能交换机实现,处理能力更强,而且与系统无关,负载性能强更适用于一大堆设备、大访问量、简单应用。但成本高,除设备价格高昂,而且配置冗余.很难想象后面服务器做一个集群,但最关键的负载均衡设备却是单点配置;无法有效掌握服务器及应用状态。

  • 后端服务的心跳检测

  • 参数分流
  • 流量的镜像复制
  • 将给予熔断
  • 服务容错

    限流

  • 支持基于黑白名单的路由规则

  • 负载均衡,支持多种负载均衡策略
  • 请求流量控制,如对请求报文大小进行判断

    鉴权

  • 鉴定请求方的请求权限

  • 实现服务分离

    监控

  • 捕获异常请求

  • 获取长时间请求并分析

    Kong的优势

Kong是适合于多云和混合云的下一代API平台

  • 开源并支持私有部署的一款API网管框架
  • 基于lua语言、nginx以及OpenResty研发
  • 高性能以及强大的扩展性(插件)

image.png

NginxOpenRestryKong这三个项目紧密相连:

  1. Nginx是模块化设计的反向代理软件,C语言开发;
  2. OpenResty是以Nginx为核心的Web开发平台,可以解析执行Lua脚本;
  3. Kong是一个OpenResty应用,一个api gateway。

Nginx 采用了模块化涉及,可以通过开发模块来扩展Nginx的功能。Nginx Module可以编译成.so文件动态加载,也可以直接编译到nginx中,编译nginx时用 --add-module 指定要集成的模块

  1. # 集成lua-nginx-module
  2. ./configure --prefix=/opt/nginx \
  3. --with-ld-opt="-Wl,-rpath,/path/to/luajit-or-lua/lib" \
  4. --add-module=/path/to/ngx_devel_kit \
  5. --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

配置启动

准备配置文件

  1. $ cp kong.conf.default kong.conf

创建kong的数据库:

  1. ./bin/kong migrations up -c ./kong.conf

启动kong:

  1. ./bin/kong start -c ./kong.conf

kong默认的代理地址是:

  1. proxy_listen = 0.0.0.0:8000, 0.0.0.0:8443

默认的管理地址是:

  1. admin_listen = 127.0.0.1:8001, 127.0.0.1:8444 ssl

访问admin接口返回的是json字符串:

  1. $ curl -i http://localhost:8001/
  2. HTTP/1.1 200 OK
  3. Date: Sat, 29 Sep 2018 08:56:51 GMT
  4. Content-Type: application/json; charset=utf-8
  5. Connection: keep-alive
  6. Access-Control-Allow-Origin: *
  7. Server: kong/0.14.1
  8. Content-Length: 5667
  9. {"plugins":{"enabled_in_cluster":[],"availab...

konga

konga是一款开源的kong UI程序,通过konga可以方便地管理kong配置
image.png

基本使用

添加服务

  1. $ curl -X POST http://192.168.1.146:8001/services -d "name=websocket" -d "url=http://eventti-service.sky:8189/echo"

配置路由

  1. 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)

  1. $ curl -i -X POST \
  2. --url http://localhost:8001/services/example-service/plugins/ \
  3. --data 'name=key-auth'
  4. {
  5. "config": {
  6. "anonymous": "",
  7. "hide_credentials": false,
  8. "key_in_body": false,
  9. "key_names": [
  10. "apikey"
  11. ],
  12. "run_on_preflight": true
  13. },
  14. "created_at": 1538218948000,
  15. "enabled": true,
  16. "id": "f25f3952-d0d4-4923-baac-860554fc2fc1",
  17. "name": "key-auth",
  18. "service_id": "ebed2707-e2fb-4694-9e8e-fb66fe9dd7c8"
  19. }

知识链接

  1. 《API网关Kong学习笔记(一):Nginx、OpenResty和Kong入门,基础概念和安装部署》
  2. 灵雀云 - Kong 微服务网关在 Kubernetes 的实践