kong入门

kong是基于openresty开发的一套代理框架,openrestry是对nginx支持了lua扩展。

如果你使用openresty的理由主要是为了编程实现流量(策略)转发,那么应该考虑用kong,而不是基于openresty做网络转发,为什么这么说?

  • kong利用openresty的能力,在请求的各个生命期注册了钩子函数,以便实现kong框架能力。
  • kong自己实现了一套路由与转发逻辑,我们大多数情况只需要向kong添加配置规则即可灵活控制转发。
  • kong在自己的路由和转发环节支持了插件机制,允许我们实现插件回调函数来扩展kong的能力,比如限速。

下面我们简单的体验一下kong的基本使用,尽量涉及到kong生命期的几个核心概念。

安装postgresql

kong的路由和转发配置均需要保存在postgresql数据库中,以便实现kong集群节点间配置共享。

这里下载对应操作系统的RPM源文件:https://yum.postgresql.org/repopackages.php,然后rpm -i安装一下。

在Centos中,执行如下命令安装postgresql 10版本+(kong要求9.5+):

初始化数据库:

修改数据库登录方式(很重要),替换下面3行的最后一列为trust:

启动数据库:

登录postgresql(这个linux用户相当于pg的超级管理员):

创建kong用户与数据库:

验证可以登录:

安装Kong

参考官方:https://konghq.com/install/,选择对应平台,利用apt/yum安装即可。

安装后,cp一份配置文件:

观察一下配置文件中的默认database配置:

不需要对上述配置文件修改,采用默认值即可。

下面的命令,kong会把存储配置的数据表建立出来:

观察kong数据库

先看看数据库的样貌,切回postgres用户,psql超级管理员登录:

列出数据库的命令是\l:

进入数据库的命令是\c kong:

列出所有table的命令是:

查看具体一个表结构(这里以路由规则为例,对应apis表):

启动kong

它默认监听2套端口:

  • 代理流量的:HTTP 8000和HTTPS 8443。
  • 配置kong的:HTTP 8001和HTTPS 8444。

观察kong配置文件

kong是基于openresty的框架,openresty是基于nginx的框架。

kong的nginx配置文件特别简单,主要逻辑都被实现在lua里:

重点在于nginx-kong.conf的这一部分:

从配置上来看:

  • 只有一个upstream处理向后端转发的逻辑,里面也是跑的kong的lua逻辑
  • 只有一个server处理所有请求,kong通过注册请求生命期的多个钩子函数完成请求自定义处理。

这些生命期钩子其实都是openresty暴露出来的,一张图就可以快速了解请求的处理流程:

kong通过注册钩子函数,接管了请求处理的各个阶段。

向kong注册api

kong是代理服务器,所以首先需要定义1个upstream,也就是被调用的上游服务器。

下面我们就做一套代理流量到http://yuerblog.cc的配置。

创建upstream

upstream代表一组上游服务器,首先给它指定一个name创建出来,再向里面添加具体后端列表:

添加target到upstream

给upstream添加1个具体后端实例,称为1个target:

当然可以添加多个target用作负载均衡,同时upstream也可以设置对target的健康检查策略,为了简单就不展开演示了。

创建service指向upstream

kong设计了一个叫做service的概念,用于表示后端被调用服务。

它可以关联到1个upstream做负载均衡,也可以直接关联到1个host,这里我们当然用upstream做演示了。

这个service有自己的name,通过host指向upstream对象。

当流量进入service的时候,其实就是upstream在负责具体工作。

创建route

route就是路由,用于对请求URL进行匹配,每个route会关联1个转发请求的service。

route支持针对请求的header/host等进行匹配,我们只演示一个简单的按host匹配即可:

当kong收到Host为yuerblog-kong.cc域名的HTTP请求的时候,就会匹配该route规则,并且流量交给yuerblog-service这个service做转发处理。

测试

请求kong的8000流量端口,指定Host为yuerblog-kong.cc,将命中route,流量经过service -> upstream -> target发往真实上游服务器。

我们成功得到了应答。

本文就到这里,我们已经体验了Kong的几个关键核心对象,具体每一种对象还有哪些配置项可以参考文档慢慢丰富。

下一篇博客我会单独写一下如何应用官方提供的限速plugin,实现接口限速保护。

相关链接

kong源码导读

如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~