Kong是一个API网关,基于OpenResty可以在其基础上扩展API管理以及相关安全插件,其社区还有好多免费或收费的安全插件

Kong安装部署

Docker部署

创建网络

docker network create kong-net

准备数据库

cassandra和postgres二选一

安装cassandra

docker run -d --name kong-database \
               --network=kong-net \
               -p 9042:9042 \
               cassandra:3

安装postgres

docker run -d --name kong-database \
               --network=kong-net \
               -p 5432:5432 \
               -e "POSTGRES_USER=kong" \
               -e "POSTGRES_DB=kong" \
               -e "POSTGRES_PASSWORD=kong" \
               postgres:9.6

安装Kong

迁移数据

docker run --rm \
     --network=kong-net \
     -e "KONG_DATABASE=postgres" \
     -e "KONG_PG_HOST=kong-database" \
     -e "KONG_PG_USER=kong" \
     -e "KONG_PG_PASSWORD=kong" \
     -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
     kong:latest kong migrations bootstrap

开启Kong

docker run -d --name kong \
     --network=kong-net \
     -e "KONG_DATABASE=postgres" \
     -e "KONG_PG_HOST=kong-database" \
     -e "KONG_PG_USER=kong" \
     -e "KONG_PG_PASSWORD=kong" \
     -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
     -e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \
     -e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \
     -e "KONG_PROXY_ERROR_LOG=/dev/stderr" \
     -e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \
     -e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" \
     -p 8000:8000 \
     -p 8443:8443 \
     -p 0.0.0.0:8001:8001 \
     -p 0.0.0.0:8444:8444 \
     kong:latest

常规RPM包部署

安装PostGreSQL

下载PostGreSQL RPM安装包并安装

wget https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
yum -y install pgdg-redhat-repo-latest.noarch.rpm 
yum install -y postgresql96
yum install -y postgresql96-server

初始化开启服务并登录

/usr/pgsql-9.6/bin/postgresql96-setup initdb
systemctl enable postgresql-9.6
systemctl start postgresql-9.6
su - postgres

创建Kong相关的数据库和账号

psql
CREATE USER kong WITH PASSWORD 'kong';
CREATE DATABASE kong OWNER kong;
GRANT ALL PRIVILEGES ON DATABASE kong to kong;

编辑配置文件,将其监听端口范围放开

sed -i "s|#listen_addresses = 'localhost'|listen_addresses = '*'|g" /var/lib/pgsql/9.6/data/postgresql.conf

修改pg_hba.conf文件,将其# IPv4 local connections:修改成如图所示,主要将ident和peer改为trust

vi /var/lib/pgsql/9.6/data/pg_hba.conf

设置环境变量

vi /etc/profile
export PATH=$PATH:/usr/pgsql-9.6/bin
source /etc/profile

重启服务

systemctl restart postgresql-9.6

安装Kong

下载安装Kong RPM包
注意:实际安装最好安装版本较高的Kong,可能导致KongA对接不上的情况,实测2.3.3可以对接0.14.9的KongA

wget https://kong.bintray.com/kong-community-edition-rpm/centos/7/kong-community-edition-1.1.2.el7.noarch.rpm
yum -y install kong-community-edition-1.1.2.el7.noarch.rpm 

编辑配置文件,主要修改数据库配置相关

cp /etc/kong/kong.conf.default /etc/kong/kong.conf
vi /etc/kong/kong.conf

image-20210316151528439

迁移数据库

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

启动Kong并关闭防火墙,也可以放开相应端口

kong start -c /etc/kong/kong.conf --vv
systemctl stop firewalld

检查状态,两个命令都可以检查

curl -i http://localhost:8001/
kong health

安装KongA

由于KongA依赖NPM、Node.js等,环境比较复杂,推荐用下面的Docker安装,后续安装成功的时候再补充
注意
1.安装启动的时候去除docker的网络且需要在postgresql的配置开放允许Docker实例的IP访问
2.还需要改Kong的配置文件/etc/kong/kong.conf使其admin端口监听0.0.0.0:8001即修改成admin_listen = 0.0.0.0:8001, 0.0.0.0:8444 ssl
3.创建连接的时候需要通过实际IP连接,因为localhost和127.0.0.1都是其本机IP

部署可视化管理工具

注意:KongA和Kong-Dashboard二选一,kong-dashboard不支持Kong 2.0,管理界面最好部署KongA

安装Kong Dashboard

docker run --rm -p 8005:8080 pgbi/kong-dashboard start --kong-url http://localhost:8001

说明参考
https://www.jianshu.com/p/259b38cbaaf6

安装Konga

注意:IP地址需要根据实际情况替换

docker run -p 1337:1337 \
          --network=kong-net  \
          -e "DB_ADAPTER=postgres" \
          -e "DB_HOST=192.168.102.200" \
          -e "DB_PORT=5432" \
          -e "DB_USER=kong" \
          -e "DB_PASSWORD=kong" \
          -e "DB_DATABASE=kong" \
          -e "NODE_ENV=development" \
          --name konga \
          pantsel/konga

部署好之后首先应该创建连接,连接即对应到被管理的Kong

登录及设置部署信息

首次登录之后需要自定义账号和密码
示例账号:kong
示例密码:Kong.01

KongA登录地址:http://192.168.102.200:1337/#!/settings

其它说明

服务:
Service是kong对上游的微服务和API进行管理的组件。
服务的路径属性会传递到上有服务,即会加上路径去请求上有的API接口

路由:
Router所属于Service,是指请求链接到kong后发送到Service,然后Service通过Router代理流量到上游的服务接口,一个Service可以有多个Router。
路由的路径属性是匹配请求过来的路径,即如果请求到Kong的带有/target路径则会匹配,没匹配上的会报"no route..."错误

添加服务
curl -i -X POST --url http://localhost:8001/services/ --data 'name=text-classification' --data 'url=http://ip:port/cls/cls1'

添加路由
curl -i -X POST --url http://localhost:8001/services/text-classification/routes --data 'hosts[]=text-classification.com'

Kong教程,介绍各个插件
https://www.jianshu.com/p/a68e45bcadb6

插件
请求次数频率限制插件
仅仅限制速率,不会拉黑
https://www.jianshu.com/p/8ad7bd643b53

爬虫控制插件
https://www.jianshu.com/p/270ce994822d

配置详解
https://www.jianshu.com/p/f3b1699777d6

Kong插件库
https://docs.konghq.com/hub/

排障参考

如果开启KongA的过程中出现类似如下的错误

iptables failed: iptables --wait -t nat -A DOCKER -p tcp...

解决方案

pkill docker 
iptables -t nat -F 
ifconfig docker0 down
systemctl restart docker

参考链接

https://docs.konghq.com/install/docker/
https://blog.csdn.net/xavi_2010/article/details/107150855
https://www.lyafei.com/archives/244/

KongA
https://www.cnblogs.com/Zzang/p/11574072.html
https://www.cnblogs.com/66li/p/11653408.html
https://hub.docker.com/r/pantsel/konga#installation
https://github.com/pantsel/konga

RPM安装PostGreSQL
https://www.cnblogs.com/netonline/p/7657810.html
RPM安装Kong
https://www.cnblogs.com/langfanyun/p/10298491.html

Last modification:March 31st, 2021 at 03:06 pm
硬币投入口