Kong入门

Kong简介

Kong是一款基于Nginx_Lua模块写的高可用,易扩展由Mashape公司开源的API Gateway项目。由于Kong是基于Nginx的,所以可以水平扩展多个Kong服务器,通过前置的负载均衡配置把请求均匀地分发到各个Server,来应对大批量的网络请求。

docker方式安装Kong(使用数据库)

1.拉取一个Kong镜像和PostgreSQL数据库

1
2
docker pull kong:1.5.1
docker pull postgres:9.6

2.创建一个Docker网络

kong-net为自定义的网络名称,可以使用任何名称,使容器能够发现彼此并进行通信

1
docker network create kong-net

3.启动PostgreSQL数据库

1
2
3
4
5
6
7
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

4.初始化数据库(迁移数据)

1
2
3
4
5
6
7
8
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:1.5.1 kong migrations bootstrap

5.运行Kong

Http访问端口:8000
Https访问端口:8443
Http管理端口:8001
Https管理端口:8444

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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 127.0.0.1:8001:8001 \
-p 127.0.0.1:8444:8444 \
kong:1.5.1

Kong的使用

以下是一个简单例子,更多API使用参考官网https://docs.konghq.com/getting-started-guide/2.1.x/overview/

1
2
3
4
5
6
7
8
9
10
upstream helloword{
server 192.168.234.131:8080 weight=100;
}

server{

location /hello {
proxy_pass http://helloword;
}
}

配置upstream

1
2
curl -X POST http://localhost:8001/upstreams \
--data "name=helloword"

配置target

1
2
curl -X POST http://localhost:8001/upstreams/helloword/targets \
--data "target=192.168.234.131:8080" --data "weight=100"

配置service

1
2
3
curl -i -X POST http://localhost:8001/services \
--data "name=example_service" \
--data "host=helloword"

配置route

1
2
3
curl -i -X POST http://localhost:8001/services/example_service/routes \
--data "paths[]=/hello" \
--data "service.id=206fa8fc-f89c-40eb-ab4c-3c712a0023b0"

service.id与配置service的id对应

kong-dashboard

下载镜像

1
docker pull pgbi/kong-dashboard

相容性矩阵

Kong-Dashboard versions Kong versions Node versions
1.x.x >= 0.6, < 0.10
2.x.x 0.10
3.0.x >= 0.9, <0.12 >= 6.0.0
3.1.x, 3.2.x >= 0.9, <0.13 >= 6.0.0
3.3.x, 3.4.x >= 0.9, <0.14 >= 6.0.0
3.5.x >= 0.9, <0.15 >= 6.0.0
3.6.x >= 0.9, <2.0.0 >= 6.0.0

Kong Dashboard 3.3.0仅与Kong 0.13部分兼容。它不支持Kong 0.13中引入的新服务和路由对象。

运行

1
2
3
docker run --rm -p 8080:8080 pgbi/kong-dashboard start \
--kong-url http://kong:8001
--basic-auth user=password //设置你的用户名和密码
 --rm表示临时启动,生产环境中可以去掉。

如果出现以下错误:

原因:连接拒绝错误的是因为2个容器(kong 和 kong-dashboard)在默认桥接网络上,这不会执行DNS解析。

需要创建一个用户定义的桥接网络并将这两个容器添加到该网络 。而在上面安装时已经创建该网络,所以执行步骤3就可以,如果安装没有创建该网络,执行以下步骤123

1.创建桥梁网络

1
docker network create kong-net

2.将Kong容器添加到它

1
docker network connect kong-net kong

3.运行kong-dashboard时提供网络信息

1
2
3
docker run --rm --network kong-net -d -p 8080:8080 \
pgbi/kong-dashboard start \
--kong-url http://kong:8001 --basic-auth user=password

参考https://github.com/PGBI/kong-dashboard/issues/156

启动后通过浏览器访问,填写用户名密码即可使用。

Konga

兼容性
从0.14.0开始,Konga仅与Kong 1.x兼容
具体安装过程参考dockerHub https://hub.docker.com/r/pantsel/konga

1.下载镜像

1
docker pull pantsel/konga

2.初始化Konga数据库

1
2
3
docker run --rm --network=kong-net pantsel/konga:latest -c prepare \
-a postgres \
-u postgres://用户名:密码@ip:port/konga
1
2
3
4
5
6
7
docker run --rm --network=kong-net pantsel/konga:latest -c prepare \
-a postgres \
-u postgres://kong:kong@172.18.0.2:5432/konga

docker run --rm --network=kong-net pantsel/konga:latest -c prepare \
-a postgres \
-u postgres://kong:kong@kong-database:5432/konga

以上的ip172.18.0.2是postgreSQL的ip地址,可以使用docker inspect 容器ID命令查看,也可以使用postgresql的自定义的容器名kong-database,否则会出现错误:

第二种可能出现的错误

问题出在postgres的版本上,使用postgres:9.6,参考https://github.com/pantsel/konga/issues/462

成功出现以下信息:

3.启动Konga

1
2
3
4
5
6
7
8
9
10
11
12
13
docker run -p 1337:1337 
--network {{kong-network}} \ // optional
-e "TOKEN_SECRET={{somerandomstring}}" \
-e "DB_ADAPTER=the-name-of-the-adapter" \ // 'mongo','postgres','sqlserver' or 'mysql'
-e "DB_HOST=your-db-hostname" \
-e "DB_PORT=your-db-port" \ // Defaults to the default db port
-e "DB_USER=your-db-user" \ // Omit if not relevant
-e "DB_PASSWORD=your-db-password" \ // Omit if not relevant
-e "DB_DATABASE=your-db-name" \ // Defaults to 'konga_database'
-e "DB_PG_SCHEMA=my-schema"\ // Optionally define a schema when integrating with prostgres
-e "NODE_ENV=production" \ // or 'development' | defaults to 'development'
--name konga \
pantsel/konga
1
2
3
4
5
6
7
8
9
docker run -d -p 1337:1337 \
--network kong-net \
-e "TOKEN_SECRET=P@sswOrd" \
-e "DB_ADAPTER=postgres" \
-e "DB_URI=postgres://kong:kong@kong-database:5432/konga" \
-e "NODE_ENV=production" \
--name konga \
pantsel/konga

注意细节:DB_URI此处使用的是容器名kong-database,也可以换成ip。

之后就可以在浏览器中访问了。

评论