一、Kong简介
Kong是一个云原生,快速,可扩展的分布式微服务抽象层(也被称为API网关或API中间件),
它的核心价值是高性能和可扩展性,于2015年作为一个开源项目提供;Kong可以充当微服务请求的网关(或辅助工具),同时通过插件提供负载均衡,日志记录,身份验证,速率限制,转换等功能,从而为您提供帮助。
Kong的主要特征:
• Cloud-Native:与平台无关,kong可以从裸机运行到Kubernetes
• 动态负载均衡:在多个上游服务之间平衡流量
• 基于哈希的负载均衡:具有一致的哈希/粘性回话的负载均衡
• 断路器:智能跟踪不健康的上游服务
• 运行状况检查:主动和被动监视上游服务
• 服务发现:在Consul等第三方DNS解析器中解析SRV记录
• 无服务器:直接从Kong调用和保护AWS Ladbda或OpenWhisk记录
• WebSockets:通过WebSockets与您的上游服务器进行通信
• gRPC:与gRPC服务进行通信,并通过日志记录和可观察性插件观察流量
• OAuth2.0:轻松将OAuth2.0身份验证添加到您的API中
• 记录:通过HTTP,TCP,UDP或磁盘记录对系统的请求和响应
• 安全性:ACL,僵尸程序检测,白名单/黑名单IP等
• Syslog:登录到系统日志
• SSL:为基础服务或API设置特定的SSL证书
• 监视:实时监视提供关键的负载和性能服务器指标
• 转发代理:使Kong连接到透明的中介HTTP代理
• 认证:HMAC,JWT,Basic等
• 速率限制:基于许多变量的阻止和限制请求
• 转换:添加,删除或处理HTTP请求和响应
• 缓存:在代理层缓存并提供响应
• CLI:从命令行控制Kong集群
• REST API:Kong可以使用其RESTful API进行操作,以实现最大的灵活性
• 地理复制:跨不同区域的配置始终是最新的
• 故障检测和恢复:如果您的Cassandra节点之一发生故障,则Kong不会受到影响
• 集群:所有Kong节点自动加入集群,并在各个节点之间更新其配置
• 可伸缩性:Kong本质上是分布的,只需要添加节点即可水平扩展
• 性能:Kong通过扩展和使用Nginx作为核心轻松处理负载
• 插件:可扩展的体系结构,用于向Kong和API添加功能
二、Kong部署
系统环境:
• OS版本:CentOS 7.6
• PostgreSQL版本:11
• Node.js版本:12.0.0
• Npm版本:6.9.0
• Git版本:1.8.3
• Kong版本:1.3.0
1)安装PostgreSQL数据库
注意:PostgreSQL数据库的版本必须要大于9.6的版本,不然安装Kong会报数据库不兼容错误
PostgreSQL软件包官网下载地址
yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
yum install postgresql11
yum install postgresql11-server
/usr/pgsql-11/bin/postgresql-11-setup initdb
systemctl enable postgresql-11
systemctl start postgresql-11
ss -tunlp | grep 5432
2)创建数据库与用户
su - postgres
psql
CREATE USER kong;
CREATE DATABASE kong OWNER kong;
alter user kong with encrypted password '123456';
\q
3)修改数据库配置文件
修改PostgreSQL数据库的/var/lib/pgsql/11/data/postgresql.conf配置文件中监听地址为本机所有地址
listen_addresses = '*'
修改PostgreSQL数据库的/var/lib/pgsql/11/data/pg_hba.conf配置文件,添加如下内容
host all all 0.0.0.0/0 md5
重启数据库服务
systemctl restart postgresql-11
ss -tunlp | grep 5432
4)下载并安装Kong
cd /usr/local
wget https://bintray.com/kong/kong-rpm/download_file?file_path=centos/7/kong-1.3.0.el7.amd64.rpm
yum localinstall kong-1.3.0.el7.amd64.rpm
5)修改Kong配置文件
whereis kong
cd /etc/kong/
cp kong.conf.default kong.conf
修改kong.conf配置文件中的如下信息
database = {DB_Name}
pg_host = {DB_Host}
pg_port = {DB_Port}
pg_user = {DB_User}
pg_password = {DB_Password}
pg_database = {DB_DatabaseName}
DB_Name:连接数据库时所用的数据库用户信息,默认为postgres
DB_Host:数据库所在的IP地址信息,例如192.168.172.138
DB_Port:数据库的监听端口信息,默认为5432
DB_User:程序连接数据库时所使用的用户名,例如第二步中所创建的kong用户
DB_Password:用户的密码信息
DB_DatabaseName:程序所使用的数据库库名,例如第二步中所创建的kong数据库
6)初始化Kong的数据库
kong migrations bootstrap
7)启动Kong
ulimit -n 4096
kong start -c /etc/kong/kong.conf
ss -tunlp | grep 8001
Kong默认监听端口说明:
• 8000端口:监听来自客户端的HTTP流量,转发到上游的upstream服务上
• 8443端口:监听HTTPS的流量,功能跟8000一样,可以通过配置文件禁止此端口
• 8001端口:Kong的HTTP监听的API管理接口
• 8444端口:Kong的HTTPS监听的API管理接口
8)访问并测试
curl -i http://localhost:8001/
三、Kong-Dashboard部署
1)部署Node.js环境
cd /usr/local/
wget https://nodejs.org/dist/v12.0.0/node-v12.0.0-linux-x64.tar.xz
tar -xf node-v12.0.0-linux-x64.tar.xz
cd node-v12.0.0-linux-x64
ln -s /usr/local/node-v12.0.0-linux-x64/bin/node /usr/local/bin/node
ln -s /usr/local/node-v12.0.0-linux-x64/bin/npm /usr/local/bin/npm
node -v
npm -v
npm config set registry https://registry.npm.taobao.org
2)安装Kong-Dashboard
npm install -g kong-dashboard
ln -s /usr/local/node-v12.0.0-linux-x64/bin/kong-dashboard /usr/local/bin/kong-dashboard
kong-dashboard start --help
kong-dashboard start --kong-url http://127.0.0.1:8001 --port 8080
ss -tunlp | grep 8080
3)访问并测试
根据启动后的提示信息在浏览器端来访问Kong-Dashboard,访问格式如下
http://{IP}:{PORT}
IP:输入主机的IP地址
PORT:输入启动时提示的端口号,默认为8080

四、Konga部署
Konga程序是Kong的查看与管理UI界面,可以通过Konga观察到当前Kong的所有配置,并且可以对于管理Kong节点情况进行查看、监控和预警,Kong主要是用AngularJS写的,运行于Node.js服务端上。
Konga具有以下特性:
• 多用户管理
• 管理多个Kong节点
• 电子邮件异常信息通知
• 管理所有的Kong Admin API
• 使用快照备份,还原和迁移Kong节点
• 使用运行状况检查监控节点和API状态
• 轻松的数据库集成(MySQL、PostgreSQL、MongDB)
1)克隆Konga代码
cd /usr/local
git clone https://github.com/pantsel/konga.git
2)下载依赖包
cd /usr/local/konga
npm install -g --unsafe-perm node-sass@4.9.0
chown root:root -R /usr/local
npm install --unsafe-perm
3)启动服务
npm start
ss -tunlp | grep 1337
4)访问服务
根据启动后的提示信息在浏览器端来访问Konga,访问格式如下
http://{IP}:{PORT}
IP:输入主机的IP地址
PORT:输入启动时提示的端口号,默认为1337
5)注册账号


6)连接Kong


五、查看节点信息及状态
1)查询节点信息
curl http://localhost:8001
关键字段信息说明:
• node_id:正在运行的kong节点的uuid,当kong启动时随机生成,每次kong重启时uuid会改变
• availabel_on_server:kong节点上安装的plugins的名称
• enabled_in_cluster:kong节点中启用的插件,即在数据库中生成了对应的存储表
2)查询节点状态信息
curl http://localhost:8001/status
关键字段信息说明:
• total_requests:客户端的请求总数
• connections_active:活跃连接数,包括等待连接的活动客户端的当前数量
• connections_accepted:接受的客户端的连接总数
• connections_handled:已处理连接的总数,一般来说,除非达到一定的资源限制,否则参数值与接受值相同
• connections_reading:当前Kong正在读取请求头的连接数
• connections_writing:将响应写入客户端的连接的当前数量
• connections_waiting:等待请求的空闲客户端连接的当前数量
• reachable:反映数据库连接状态的布尔值,注意:此标志不反映数据库本身的健康状况
六、Upstream使用
Upstream是指位于Kong后端的与您API相关的服务,转发客户端的请求,类似于Nginx中配置负载均衡时使用Upstream模块定义的后端服务器集群时的组名。
1)创建Upstream
curl -X POST http://localhost:8001/upstreams --data "name={Upstream_Name}"
Upstream_Name:Upstream的名称
示例:
curl -X POST http://localhost:8001/upstreams --data "name=myUpstream"
2)查看Upstream
curl -X GET http://localhost:8001/upstreams/{Upstream_Name}
Upstream_Name:要查询的Upstream的名称
示例:
curl -X GET http://localhost:8001/upstreams/myUpstream
查看所有的Upstream
curl -X GET http://localhost:8001/upstreams/
3)删除Upstream
curl -X DELETE http://localhost:8001/upstreams/{Upstream_Name}
Upstream_Name:要进行删除操作的Upstream的名称
示例:
curl -X DELETE http://localhost:8001/upstreams/myUpstream
七、Target使用
Target是用来定义实际的后端主机节点的,它必须要与一个Upstream相关联,通过Upstream来访问后端实际的Target定义的后端节点。
1)创建Target
curl -X POST http://localhost:8001/upstreams/{Upstream_Name}/targets \
--data "target={IPaddr}:{Port}" \
--data "weight=100"
Upstream_Name:指明要在哪个Upstream上创建Target
IPaddr:指明后端服务器的IP地址或域名
Port:指明后端服务所监听的端口
Weight:指明此Target被调度的权重大小
示例:
curl -X POST http://localhost:8001/upstream/myUpstream/targets --data "target=localhost:3000" --data "weight=100"
2)查看Target
curl -X GET http://localhost:8001/upstreams/{Upstream_Name}/targets
Upstream_Name:要查看哪个Upstream下的Target
示例:
curl -X GET http://localhost:8001/upstreams/myUpstream/targets
3)删除Target
curl -X DELETE http://localhost:8001/upstreams/{Upstream_Nmae}/targets/{Target_ID}
Upstream_Name:指明要删除哪个Upstream下的Target
Target_ID:指明要删除的TargetID信息
示例:
curl -X DELETE http://localhost:8001/upstreams/myUpstream/targets/91b96cf8-9e18-4587-9db3-a8fcef59012c
八、Service使用
Service是upstream services的抽象,Service的主要属性是它的URL服务要与路由相相关联,一个服务可以有许多与之关联的路由。
1)添加Service
格式语法:
curl -i -X POST http://localhost:8001/services -d "name={Service_Name}" -d "url=http://{IPaddr}"
| 字段 | 说明 |
|---|---|
| name | 服务名称 |
| protocol | 协议:http或https,默认为http |
| host | 后端服务域名或IP |
| port | 后端服务端口,默认为80 |
| path | 后端服务站点访问路径,默认为’/’ |
| retries | 重试次数,默认为5次 |
| connect_timeout | 请求后端服务的超时时间,默认为60000ms,即一分钟 |
| write_timeout | 写超时时间,默认为60000ms |
| read_timeout | 读超时时间,默认为60000ms |
| url | 后端服务的url地址 |
示例:
curl -i -X POST --url http://localhost:8001/services/ \
--data 'name=myservice' \
--data 'protocol=http' \
--data 'host=myUpstream' \
--data 'port=80'
注意:Service与Upstream进行绑定时,host选项要指明Upstream的名称
2)查询Service
查询所有Service
curl -i -X GET http://localhost:8001/services/
查询指定的Service
curl -i -X GET http://localhost:8001/services/{Service_Name}
Service_Name:指明要进行查询的Service的名称
示例:
curl -X GET http://localhost:8001/services/myservice
3)更新Service
curl -i -X PUT http://localhost:8001/services/example-service \
--data "name={Service_Name}" --data "protocol=http" \
--data "path=/" --data "host={Upstream_Name}"
Service_Name:指明要更新哪个Service
Upstream_Name:指明更新所要绑定的Upstream的名称
九、Route使用
Route是用来定义匹配客户端请求的规则的,每个Route与一个Service相关联,一个服务可能有多个与之关联的路由,匹配给定的路由的每个请求都将代理到其关联的服务上。
1)创建Route
curl -i X POST --url http://localhost:8001/routes/ \
--data 'protocols[]=http&protocols[]=https' \
--data 'paths={Path}' \
--data 'service.id={Service_ID}'
--data 'hosts={Daemon_Name}'
Path:指明访问的路径信息
Service_ID:指明要与之关联的ServiceID
Daemon_Name:指定一个主机名或域名信息,将此信息填写为Kong所在的主机上的信息,Kong主机所能解析
示例:
curl -i X POST --url http://localhost:8001/routes/ \
--data 'protocols[]=http&protocols[]=https' \
--data 'paths=/' \
--data 'service.id=0a81cdbd-3399-459c-bf09-9154971b3525'
--data 'hosts=test.com'
2)删除Route
curl -i X DELETE --url http://localhost:8001/routes/{Route_ID}
Route_ID:指明要删除的RouteID信息
示例:
curl -i X DELETE --url http://localhost:8001/routes/27bebac7-6a48-4a87-8eda-1f21f0584c23
访问测试查看:
curl test.com
本文详细介绍了Kong的部署过程,包括Kong、Kong-Dashboard和Konga的安装与配置,以及Kong的节点信息查看、Upstream、Target、Service和Route的使用。Kong是一个高性能、可扩展的云原生API网关,提供负载均衡、身份验证、日志记录等功能。文章还提到了Kong在微服务架构中的重要角色及其主要特性。
6434

被折叠的 条评论
为什么被折叠?



