负载均衡详解 - 玩转Kong网关

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了负载均衡详解 - 玩转Kong网关相关的知识,希望对你有一定的参考价值。

参考技术A

KONG为请求多个后端服务提供了多种负载均衡方案:一种是简单的基于DNS,另一种是更加动态的环形均衡器,他在不需要DNS服务器的情况下也允许服务注册。

当使用基于DNS的负载平衡时,后端服务的注册是在Kong之外完成,而Kong只接收来自DNS服务器的更新。如果请求的API被解析为多个IP地址,则已使用包含主机名(而不是IP地址)的upstream_url定义的每个API将自动使用基于DNS的负载平衡,前提是主机名未被解析为upstream名称或你的localhosts文件中的名称。DNS记录ttl设置(生存时间)确定刷新信息的频率。当设置ttl为0时,每个请求将使用自己的dns查询进行解析。显然这会带来性能损失,但更新/更改的延迟将非常低。

A记录包含一个或多个IP地址。因此,当主机名解析为A记录时,每个后端服务都必须有自己的IP地址。因为没有 weight 信息,所有条目在负载平衡器中将被视为同样的权重,平衡器将进行直线循环。来自DNS记录的IP地址的初始选择是随机的。这是为了确保即使当ttl为0时,负载也正确分配。

SRV记录包含所有IP地址的权重和端口信息。可以通过唯一的IP端口号的组合来标识后端服务。因此,单个IP地址可以托管不同端口上相同服务的多个实例。因为权重信息可用,每个条目将在负载平衡器中获得自己的权重,并且它将执行加权循环。

类似地,任何给定的端口信息将被来自DNS服务器的端口信息覆盖。如果一个API的 upstream_url= http://myhost.com:1234/path 并且 myhost.com 被解析为 SRV 记录中的 127.0.0.1:5678,此时的API将会被代理到 http://127.0.0.1:5678/path ,之前的 1234 端口会被重写为 5678 端口。IP地址+端口组合在初始时是随机选择的,这是为了确保服务能被正确分配,即使ttl设置为0。

tip:每当刷新DNS记录时,都会生成列表以正确处理加权。建议将权重保持为彼此的倍数以保证系统的性能。

DNS解析器按顺序开始解析以下记录类型:

1. 最后一个成功的类型优先解析;

2. SRV记录

3. A记录

4. CNAME记录

所以,如果你使用的主机名称中同时含有SRV记录和A记录时,将仅解析SRV实例。如果你想使用A记录,那么你必须得把SRV记录从DNS中删除。如果你只有A记录,则SRV记录查询失败,然后自动指向到A记录,并查询A记录是否存在,依次类推。

使用环形平衡器时,后台服务的添加和删除将由Kong处理,不需要进行DNS更新。KONG将扮演服务注册的角色。可以通过单个HTTP请求添加/删除节点,并可立即启动/停止接收请求流量。

可以通过配置 upstream 和 target 属性来配置环形均衡器。

默认情况下,一个环平衡器将使用一个加权循环的方案。另一种方法是使用基于散列的算法。散列的输入可以是 none , consumer , ip , 或者 header 。当设置为none时,将使用加权循环方案,并且将禁用哈希。

有两种选择,一种主要的和一种备用方案,以防主服务器出现故障(例如,如果主服务器被设置为 consumer ,但是没有经过身份验证)

不同的散列选项:

哈希算法是基于“一致性哈希”,它确保当平衡器通过改变目标(添加、移除、失败或改变权重)来修改时,只有最小的散列损失发生。这将最大优化上游缓存的命中。

一堆原理实在不好理解,下面来几个案例研究下:

这是一个安全部署应用的方法,它通过提供两个版本的应用同时运行。为了部署一个新版本的应用,你需要将当前版本切换到新版本,然后关闭老版本。Blue-green deployment不会使应用停止服务,在必要的情况下允许你快速回滚应用到blue版本。

设置“蓝色”环境,运行版本1的地址服务:

将主机头设置为 address.mydomain.com ,就可以让那Kong代理这个请求转发到定义的两个目标;三分之二的请求将发送到 http://192.168.34.15:80/address (权重=100),1/3将转到 http://192.168.34.16:80/address (权重=50)。

设置“绿色”环境,运行版本2的地址服务:

将主机头设置为 address.mydomain.com ,现在已经给Kong设置了一个新的目标;一半的请求将被发送到 http://192.168.34.17:80/address (权重=100),另外1/2将转到 http://192.168.34.18:80/address (权重=100)。

通常,通过Kong管理API的更改是动态的,并将立即生效。不需要重新加载或重启,在进度请求中不需要删除。

使用环型平衡器,目标权重可以精确地调整,允许一个平滑的、可控的金丝雀环境。

使用一个非常简单的2个目标示例:

通过重复请求,但是每次改变权重,流量将慢慢地路由到另一个目标。例如,将其设置为10%:

同样,通过Kong管理API的更改是动态的,并将立即生效。不需要重新加载或重启,在进度请求中不需要删除。

API网关——Kong实践分享




概述


01

什么是Kong

Kong是一个在Nginx中运行的Lua应用程序,可以通过lua-nginx模块实现,Kong不是用这个模块编译Nginx,而是与OpenRestry一起发布,OpenRestry已经包含了lua-nginx-module,OpenRestry是Nginx的一组扩展功能模块。


02

为什么是Kong

Kong是一个Api Gateway,通过插件的形式提供负载均衡,日志记录,身份验证,速率限制,转换等功能。


Kong可以很轻松扩展功能,模块化,可以运行在任何基础设施上。


API网关——Kong实践分享

 

03

术语

Route:是请求的转发规则,按照Hostname和PATH,将请求转发给Service。

Services:是多个Upstream的集合,是Route的转发目标。

Consumer:是API的用户,里面记录用户的一些信息。

Plugin:是插件,plugin可以是全局的,绑定到Service,绑定到Router,绑定到Consumer。

Certificate:是https证书。

Sni:是域名与Certificate的绑定,指定了一个域名对应的https证书。

Upstream:是负载均衡策略。

Target:是最终处理请求的Backend服务。

 

04

特性

  • 动态负载均衡

  • 基于散列的负载均衡

  • 断路器

  • 健康检查

  • Websockets

  • OAuth2.0

  • 日志记录

  • 安全性

  • Syslog

  • 监控

  • 转发代理

  • 认证

  • 速率限制

  • 故障检测和恢复

……

更多详情参考:https://docs.konghq.com/hub/


05

开源/企业对比

 

API网关——Kong实践分享

API网关——Kong实践分享

API网关——Kong实践分享


 

架构


01

架构图

 

API网关——Kong实践分享

1.1版本以后支持无db模式

 

02

执行流程

加入kong后,每个客户端对API的请求将首先到达Kong,然后被代理到最终API,在请求和响应之间,Kong将执行任何已安装的插件,扩展API功能集,Kong有效的成为每个API的入口点。



部署


Kong支持在任何基础设施上运行,支持docker、packages、vagrant、Homebrew、CloudFormation、AWS、Azure、Kubernetes等。


本次部署基于package方式,部署软件版本。

软件 版本
Kong 1.0.3
Postgresql 9.6
Kong-dashboard 3.5.0

   

 

01

部署Postgresql


   
     
     
   
  1. docker run --name postgres -e POSTGRES_PASSWORD=123456 -p 5432:5432 -d postgres:9.6


02

创建用户及数据库

# 登陆

   
     
     
   
  1. psql -U postgres -h 10.20.1.190 -p 5432


#创建用户

   
     
     
   
  1. create user kong with password kong’;


#创建数据库

   
     
     
   
  1. create database kong owner kong;


#退出控制台

q



03

下载安装包

wget:https://kong.bintray.com/kong-rpm/centos/7/:kong-1.0.3.el7.noarch.rpm

 

04

安装配置

#安装rpm

   
     
     
   
  1. yum install kong-1.0.3.el7.noarch.rpm


#拷贝配置

   
     
     
   
  1. cp /etc/kong/kong.conf.default /etc/kong/kong.conf


#配置

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

  2. pg_host = 10.20.1.190

  3. pg_port = 5432

  4. pg_user = kong

  5. pg_password = kong

  6. pg_database = kong



保存并退出。


05

启动kong

#数据库迁移,初始化表

   
     
     
   
  1. kong migrations bootstrap -c /etc/kong/kong.conf vv


#启动

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


06

部署kong-dashboard

dashboard目前只支持kong版本1.0.3,kong最新版本不支持,使用pgbi/kong-dashboard镜像

#启动dashboard


   
     
     
   
  1. docker run -p 8888:8080 pgbi/kong-dashboard start --kong-url http://10.20.1.190:8001



使用

 

01

upstream

API网关——Kong实践分享


02

target

API网关——Kong实践分享


03

service

API网关——Kong实践分享


04

routers

API网关——Kong实践分享


05

验证

API网关——Kong实践分享


06

插件

1.Base-auth

  • 创建consumer

API网关——Kong实践分享


  • 创建Basic-auth-credential

API网关——Kong实践分享

 

  • 服务开启Basic-auth

API网关——Kong实践分享


  • 验证

未加用户信息,没权限,效果如下:

API网关——Kong实践分享


加入用户信息后,效果如下:

API网关——Kong实践分享




集成

01

Dns SRV

Kong利用Dns轮询访问后端应用。


1.架构图

API网关——Kong实践分享


 

2.检查服务域名

使用Dns做服务发现,查看boms-user-service服务如下:

   
     
     
   
  1. # dig @10.20.11.118 -p 8600 boms-user-service.service.dc1.consul SRV

 

API网关——Kong实践分享


含义解释:

API网关——Kong实践分享


调用服务域名boms-user-service.service.dc1.consul,通过dns解析找到实例ip+port,如上例中10.20.11.118:8081。


3.修改kong配置

vim 编辑kong.conf,增加:

   
     
     
   
  1. dns_resolver: 127.0.0.1:8600


4.kong中使用

在kong中手动增加一个service,host填入服务域名,增加router,即可转发。


5.总结

需要手动在kong中创建服务,并且仅适用consul注册中心。

https://github.com/faizalpribadi/kongsul

 

02

Agent 轮询

1.架构图

 

API网关——Kong实践分享

agent负责监听注册中心,动态调用kong admin API创建upstream、target、service、router等资源。


用户通过boms平台调用admin API修改router信息,实现服务转发功能,在此数据基础之上在启用插件,丰富功能。



开发

01

命令行

https://docs.konghq.com/1.0.x/cli/


02

Admin API

https://docs.konghq.com/1.0.x/admin-api/

例如:

API网关——Kong实践分享

 

03

插件开发

https://docs.konghq.com/1.0.x/pdk/ 插件开发工具包。



参考

  • https://docs.konghq.com Kong官方文档

  • https://docs.konghq.com/hub/kong-inc 插件文档

  • https://www.lijiaocn.com/%E6%8A%80%E5%B7%A7/2017/03/06/dns-srv.html dns-srv 详解

  • https://github.com/faizalpribadi/kongsul

  • https://github.com/YeautyYE/nacos-nginx-template

  • https://github.com/quancheng-ec/eureka-kong-register

 

本文由博云研究院原创发表,转载请注明出处。



相关推荐





加入技术交流群

添加管理员微信ID : ruffylining 

备注姓名-公司-职位,即可入群


以上是关于负载均衡详解 - 玩转Kong网关的主要内容,如果未能解决你的问题,请参考以下文章

KONG API 网关中的负载均衡

9.Kong入门与实战 基于Nginx和OpenResty的云原生微服务网关 --- 高级进阶

开源API网关系统(Kong教程)入门到精通

开源API网关系统(Kong教程)入门到精通

玩转Linux之搭建高可用负载均衡群集综合案例

apigateway-kong负载均衡