网关Kong

介绍

Kong是一款基于OpenResty(Nginx + Lua模块)编写的高可用、易扩展的,由Mashape公司开源的API Gateway项目。Kong是基于NGINX和Apache Cassandra或PostgreSQL构建的,能提供易于使用的RESTful API来操作和配置API管理系统,它与nginx一样,所以它可以水平扩展多个Kong服务器,还可以使用Lua进行自定义构建,通过前置的负载均衡配置把请求均匀地分发到各个Server,来应对大批量的网络请求。

kong的组件

kong主要有三个组件:

Server: 基于nginx的服务端,用来路由请求与管理网关

Cassandra/PostgreSQL: Kong用来存储数据的数据库

Dashboard(可选): 用来管理空的kong的WebUI,通过发送resetful请求到server端.对kong 进行管理

基于Docker安装

1 创建Docker网络

docker network create kong-net

2 创建数据库

#kong支持2个中数据库,选择其中一个即可

mkdir /data/postgresql  #创建数据目录
chmod 777 /data/postgresql  #授权目录

docker pull postgres:9.6
 
docker run -d --name kong-database \
               --network=kong-net \
               -p 5432:5432 \
               -v /data/postgresql:/var/lib/postgresql/data \
               -e "POSTGRES_USER=kong" \
               -e "POSTGRES_DB=kong" \
               -e "POSTGRES_PASSWORD=kong" \
               --restart=always \
               postgres:9.6

3 初始化数据库

docker pull kong:latest

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

4 启动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 8001:8001 \
     -p 8444:8444 \
     --restart=always \
     kong:latest

5 安装dashboard

kong的dashboard主要有2个选择:

1 pdadmin 该dashboard仅支持2.0以下的kong,而且功能有限

2 konga 支持最新版的kong,功能比较强大,配置也比较简单.

5.1 初始化dashboard的数据库(konga)

docker pull pantsel/konga

#konga支持多种数据库,利用刚刚创建的postgres数据库,记得要更换成postgresIP
docker run --rm pantsel/konga -c prepare -a postgres -u postgresql://kong:kong@192.168.2.143:5432/konga

5.2 运行dashboard

#记得要更换成postgresIP
docker run -d -p 1337:1337 \
        --network kong-net  \
       -e "TOKEN_SECRET=kong"  \
       -e "DB_ADAPTER=postgres" \
       -e "DB_URI=postgresql://kong:kong@192.168.2.143:5432/konga" \
       -e "NODE_ENV=production" \
       --restart=always \
       --name konga  pantsel/konga

6 Kong的重要的三个概念

我们先看一下,在使用Nginx配置反向代理是的结构

upstream xx_name {
    server 192.168.1.1:8080  weight=100;
}

server {
    listen 80;
    server_name: xx.com;    
    
    location /path{
     proxy_pass http://xx_name;
    }
}

Kong是基于Nginx的,所以以下几个概念,都是对应以上的结构.

6.1 upstream

用来定义上图结构中的upstream模块

6.1.1 target

upstream中的后端服务器,既上面结构中的: server 192.168.1.1:8080

6.2 service

用来定义上图结构中的 server模块

6.2.3 route

用来定义 server模块中的: location

7 Kong的常用插件

7.1 限流

7.2 认证

7.2.1 Basic Authentication

7.2.2 Key Authentication

基于APIKey的方式验证,所有请求需要携带以下定义的可以,放置Header中或者QueryString中

7.3 监控

7.3.1 基于Docker 安装Prometheus

#下载镜像
docker pull prometheus

#启动镜像
docker run --name prometheus -d -p 9090:9090 --restart=always prom/prometheus

#进入镜像内部
docker exec -it prometheus sh

#编辑配置文件
vi /etc/prometheus/prometheus.yml

#最后一行
- targets:['kong IP:端口']

#退出容器并重启该重启

docker stop prometheus 

docker start prometheus 

7.3.2 基于Docker安装Grafana

安装完成以后,登录grafana,新添加数据源:Prometheus

Url为我们使用Docker安装的Prometheus的地址

导入Grafana模板: 7424