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_kong_02

2.2.基础概念

仪表盘

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

使用Kong和Konga管理微服务和API_微服务网关_04

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

快照

使用Kong和Konga管理微服务和API_图形化设置_05

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

设置

使用Kong和Konga管理微服务和API_微服务网关_06

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

3.konga 配置反向代理

3.1.场景描述

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

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

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

 3.2.增加上游服务器

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

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

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

3.3.增加服务

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

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

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

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

使用Kong和Konga管理微服务和API_微服务网关_11

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_nginx_12

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

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

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

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

如果 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_图形化设置_15

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

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

4.3.配置 metrics 访问

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

使用Kong和Konga管理微服务和API_微服务网关_17

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

1、增加上游服务器

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

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

2、配置服务和路由

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

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

3、访问测试

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

4.4.增加监控配置

使用Kong和Konga管理微服务和API_微服务网关_22

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

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

4.5.监控图形展示

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

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_微服务网关_25

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

5.2.配置上游服务器

使用Kong和Konga管理微服务和API_微服务网关_26

使用Kong和Konga管理微服务和API_图形化设置_27

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

5.3.配置服务

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

使用Kong和Konga管理微服务和API_图形化设置_29

对应的需要配置2个 service

5.4.配置路由

使用Kong和Konga管理微服务和API_微服务网关_30

使用Kong和Konga管理微服务和API_图形化设置_31

5.5.配置跳转

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

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

5.6.测试验证

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