使用Kong和Konga管理微服务和API

时间:2022-10-25 07:24:27

1.简介

Nginx凭借优异的性能和简化的配置文件成为占有率最高的 web 服务器,OpenResty 在 Nginx 的基础上适配了 lua 语言使其具备了更好的扩展能力拥有了更多的想像空间,大大降低了后端代码的开发难度。

Kong网关更进一步,提供更成熟的插件和开发的接口机制,更适合微服务环境。通过Konga 的图形界面实现对Kong 网关的配置操作最终实现对Nginx 的替换,实现图形化的管理操作,降低运维操作难度

Kong 的插件机制是其高可扩展性的根源,Kong 可以很方便地为路由和服务提供各种插件,网关所需要的基本特性,Kong 都如数支持:

  • 云原生: 与平台无关,Kong可以从裸机运行到Kubernetes
  • 动态路由: Kong 的背后是 OpenResty+Lua,所以从 OpenResty 继承了动态路由的特性
  • 熔断
  • 健康检查
  • 日志: 可以记录通过 Kong 的 HTTP,TCP,UDP 请求和响应。
  • 鉴权: 权限控制,IP 黑白名单,同样是 OpenResty 的特性
  • SSL: Setup a Specific SSL Certificate for an underlying service or API
  • 监控: Kong 提供了实时监控插件
  • 认证: 如数支持 HMAC, JWT, Basic, OAuth2.0 等常用协议
  • 限流
    REST API: 通过 Rest API 进行配置管理,从繁琐的配置文件中解放
  • 可用性: 天然支持分布式
  • 高性能: 背靠非阻塞通信的 nginx,性能自不用说
  • 插件机制: 提供众多开箱即用的插件,且有易于扩展的自定义插件接口,用户可以使用 Lua 自行开发插件

1.1.参考文档

​nginx配置指南之一 ​​https://blog.51cto.com/waringid/1438852​

nginx操作指南之二 ​​https://blog.51cto.com/waringid/1441632​

nginx增加modsecurity模块 ​​https://blog.51cto.com/waringid/1629905​

也谈nginx的安全限制 ​​https://blog.51cto.com/waringid/1608666​

开源API网关系统(Kong教程)入门到精通 ​​https://www.jianshu.com/p/a68e45bcadb6​

配置详解 - 玩转Kong网关 ​​https://www.jianshu.com/p/f3b1699777d6​

Kong 源码分析 ​​http://cyukang.com/archives/​

Kong 轻量级 UI ​​https://github.com/pocketdigi/kong-admin-ui​

Kong 插件开发指南 ​​https://ms2008.github.io/archives/​

Linux 下 Nginx 服务 Rewrite 和 Proxy_Pass ​​https://www.jianshu.com/p/10ecc107b5ee​

Prometheus 入门与实践 ​​https://www.ibm.com/developerworks/cn/cloud/library/cl-lo-prometheus-getting-started-and-practice/index.html​

k8s 与监控–解读 prometheus 监控 kubernetes 的配置文件 ​​https://segmentfault.com/a/1190000013230914​

etcd 管理,证书配置,扩展,迁移恢复,带证书扩展节点  ​​https://segmentfault.com/a/1190000016010980​

k8s 集群节点更换 ip 或者 k8s 集群添加新节点 ​​https://www.cnblogs.com/chenjw-note/p/11175250.html​

2.konga 操作

2.1.设置连接

登录成功后会有下图所示的画面,在"name"栏中输入 kong 的连接地址。默认情况 kong 和 konga 安装在同一台服务器,输入“http://localhost:8001”即可完成连接。

konga 支持连接多个 kong 。对于不同地址的微服务网关,需要调整非本机 kong 的管理监听配置(安全考虑,kong 默认情况只允许本地网络访问微服务的管理端口)。

使用Kong和Konga管理微服务和API

使用Kong和Konga管理微服务和API

2.2.基础概念

仪表盘

使用Kong和Konga管理微服务和API

使用Kong和Konga管理微服务和API

仪表板显示有关您当前连接的Kong实例,基础数据库和可用插件的基本信息。更多详细信息可在INFO页面中找到。

快照

使用Kong和Konga管理微服务和API

快照功能允许您轻松地跨节点备份,恢复和移动Kong配置。您还可以安排Kong实例的自动快照。

设置

使用Kong和Konga管理微服务和API

设置页面提供了一种配置Konga并为用户帐户设置基本ACL的简单方法。

3.konga 配置反向代理

3.1.场景描述

将​​https://10.3.2.1基于​​​ IP 地址的 URL 访问情况转化为基于域名的访问“​​https://office-gw.myj.lan​​”。

使用Kong和Konga管理微服务和API

该类需求需要通过 kong 配置反向代理的方式实现。

 3.2.增加上游服务器

点击“Upstreams ”进入 konga 的上游服务器(10.3.2.1)配置,通过“Create Upstreams”增加。在“Name”中输入上游代理的名称描述,该名称在后续的服务(service)中会用到,用于关联服务和上游服务器。增加了上游服务描述后通过“Target”增加具体的服务器地址,例如本例中的10.3.2.1。如果要实现多台主机负载均衡的配置,可以通过增加主机并调整策略的方式实现。

使用Kong和Konga管理微服务和API

使用Kong和Konga管理微服务和API

3.3.增加服务

Service服务,通过Kong匹配到相应的请求要转发的地方( 理解nginx 配置文件中server)。

自己定义的上游服务通过 Kong 匹配到相应的请求要转发的地方, Service 可以与下面的 Route 进行关联,一个 Service 可以有很多Route,匹配到的 Route 就会转发到 Service 中,、, 当然中间也会通过 Plugin 的处理,增加或者减少一些相应的 Header 或者其他信息。

导航到服务页面并添加新服务。填写内容如下:

使用Kong和Konga管理微服务和API

使用Kong和Konga管理微服务和API

url 参数是一个简化参数,用于一次性添加protocol,host,port和path。另外不要把Services当作后端的具体API,要把它当作一个大的服务,该服务下面有多个API(endpoint or route)。所以创建服务的时候填上该服务的域名就行了。当然也可以是一个url(带Path的),这样每个API(route)会路由到该path上。

需要注意“Host”的内容要和上游服务器的“Name”保持一致。

3.4.增加路由

Route 路由相当于nginx 配置中的location。

Route 实体定义匹配客户端请求的规则.。每个路由都与一个服务相关联,而服务可能有多个与之相关联的路由。 每一个匹配给定路线的请求都将被提交给它的相关服务。

使用Kong和Konga管理微服务和API

使用Kong和Konga管理微服务和API

路由和服务的组合(以及它们之间的关注点分离)提供了一种强大的路由机制,,可以在 Kong 中定义细粒度的入口,从而引导你的访问到不同 upstream 服务。

这里的 Path 就是具体业务访问的路径(endpoint)。Hosts 不设置会默认采用 Services 里的 Host,但是一旦设置了,客户端请求该 route 的时候必须带上设置的 host,且必须一致。

使用Kong和Konga管理微服务和API

如果 Strip path 设置为 YES,这里的 Path 可以加一个前缀,如:/passport/users,但最终会映射到后端真实的 API /users。Kong 转发到后端服务的时候会把前缀 /passport部分去掉。客户端调用 API 必须和 Routes 里的 Path一致才行(/passport/users),否则会得到404,无法匹配。用户的请求是先匹配 route,然后转发到 service。

4.配置 prometheus 监控

4.1.prometheus 相关

有关监控系统 prometheus 的介绍及配置请参考:

prometheus 配置指南 (待完善)

Prometheus 之 node-exporter 常用指标 (待完善)

4.2.启用监控插件

使用Kong和Konga管理微服务和API

使用Kong和Konga管理微服务和API

选择“Plugins”插件设置,选择“Prometheus” 监控插件并启用。需要主机插件的生效范围,例如下图中的生效范围是全局生效。

4.3.配置 metrics 访问

安全考虑,默认情况下启用“prometheus”监控插件只允许本机的管理端口访问,如下图示。由于 Prometheus 监控服务器是其它的 IP 地址,无法正常访问需要监控的数据指标,因此可以通过增加反向代理的方式通过域名访问解决。

使用Kong和Konga管理微服务和API

目标:将 http://localhost:8001/metrics 的访问改为 http://metrics.myj.lan/metrics,并且只允许指定的 IP 地址访问。

1、增加上游服务器

使用Kong和Konga管理微服务和API

上游服务器的目标地址是 ​​http://localhos:8001​

2、配置服务和路由

使用Kong和Konga管理微服务和API

使用Kong和Konga管理微服务和API

3、访问测试

使用Kong和Konga管理微服务和API

4.4.增加监控配置

使用Kong和Konga管理微服务和API

使用Kong和Konga管理微服务和API

在 prometheus 的配置文件中增加新的服务器资源,如下图。完成配置后重新加载 prometheus 监控服务并确认已正常加载。

4.5.监控图形展示

使用Kong和Konga管理微服务和API

5.nginx 配置迁移

1、将http://yunpan.xxx.com.cn 的访问自动转换为 https://yunpan.xxx.com.cn

2、内部网络不限制访问速度

3、转换location / 和 location /seafhttp 的跳转

思路:通过 kong 网关增加证书域名和 service 及 route 配置完成转换。

5.nginx 配置内容

upstream yunpan.xxx.com.cn {
server 10.2.5.100:8000;
keepalive 6000;
}

server {
listen 80;
server_name yunpan.xxx.com.cn;
rewrite ^(.*) https://$server_name$request_uri permanent;
}

server {
listen 443 ssl;
server_name yunpan.xxx.com.cn;
root html;
index index.html index.htm;
ssl_certificate /root/xxx/214828708690016.pem;
ssl_certificate_key /root/xxx/214828708690016.key;
ssl_session_cache shared:SSL:20m;
ssl_session_timeout 10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";

location / {
root html;
index index.html index.htm;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://yunpan.xxx.com.cn;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Forwarded-Proto https;
proxy_read_timeout 1200s;
client_max_body_size 0;
}

location /seafhttp {
rewrite ^/seafhttp(.*)$ $1 break;
proxy_pass http://192.168.5.100:8082;
client_max_body_size 0;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 36000s;
proxy_read_timeout 36000s;
send_timeout 36000s;
limit_rate 1024k;
}
error_page 404 /50x.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}

5.1.配置证书

使用Kong和Konga管理微服务和API

通过 konga 的界面增加证书配置,在 sni 项目中增加 yunpan.xxx.com.cn 的配置。

5.2.配置上游服务器

使用Kong和Konga管理微服务和API

使用Kong和Konga管理微服务和API

需要配置2个上游服务器,涉及同一个IP的2个不同端口。

5.3.配置服务

使用Kong和Konga管理微服务和API

使用Kong和Konga管理微服务和API

对应的需要配置2个 service

5.4.配置路由

使用Kong和Konga管理微服务和API

使用Kong和Konga管理微服务和API

5.5.配置跳转

使用Kong和Konga管理微服务和API

在2个 route 项中启用 301https 的自动跳转插件。

5.6.测试验证

使用Kong和Konga管理微服务和API