Kong 0.13 安装部署
机器准备
节点A:192.168.0.10
节点B:192.168.0.11
节点A,部署一个Kong Node和Postgresql
节点B, 部署一个Kong Node,数据库指向节点A的postgresql
安装
1. 安装数据库postgresql
- 使用docker创建网络
docker network create kong-net
- 将postgresql网络指定为新建的网络*(docker原来使用–link,新版本不建议使用,使用–network将两个容器指定到同一个网络来解决问题)*
docker run -d --name kong-database \
--network=kong-net \
-p 5432:5432 \
-e "POSTGRES_USER=kong" \
-e "POSTGRES_DB=kong" \
postgres:9.6
- 数据库迁移,将kong的数据库创建出来(指定到同一个网络)
docker run --rm \
--network=kong-net \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-database" \
-e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
kong:latest kong migrations up
2. postgresql主备热切换
TODO
为了高可用性,使用postgresql的流复制以及双机热备
3. kong集群
- 节点A部署启动
docker run -d --name kong \
--network=kong-net \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-database" \
-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" \
-e "KONG_ADMIN_LISTEN_SSL=0.0.0.0:8444" \
-p 8000:8000 \
-p 8443:8443 \
-p 8001:8001 \
-p 8444:8444 \
kong:latest
- 节点B部署启动
docker run -d --name kong \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=192.168.0.10" \
-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" \
-e "KONG_ADMIN_LISTEN_SSL=0.0.0.0:8444" \
-p 8000:8000 \
-p 8443:8443 \
-p 8001:8001 \
-p 8444:8444 \
- 添加测试
同步时间默认是5s,可以通过官网集群资料进行修改
节点A添加
curl -i -X POST --url http://localhost:8001/apis/ --data 'name=example-api' --data 'hosts=example.com' --data 'upstream_url=http://mockbin.org'
节点B查询
curl http://localhost:8001/apis/
>>>>>>
{
"total": 1,
"data": [{
"created_at": 1527732097194,
"strip_uri": true,
"id": "41cbfb3b-eaa1-4a6c-ac19-c069f6daeb83",
"hosts": ["example.com"],
"name": "example-api",
"http_if_terminated": false,
"https_only": false,
"retries": 5,
"preserve_host": false,
"upstream_connect_timeout": 60000,
"upstream_read_timeout": 60000,
"upstream_send_timeout": 60000,
"upstream_url": "http:\/\/mockbin.org"
}]
}
节点B添加
curl -i -X POST --url http://localhost:8001/apis/ --data 'name=example-api2' --data 'hosts=example.com' --data 'upstream_url=http://mockbin.org'
节点A查询
curl http://localhost:8001/apis/
>>>>>>
{
"total": 2,
"data": [{
"created_at": 1527732097194,
"strip_uri": true,
"id": "41cbfb3b-eaa1-4a6c-ac19-c069f6daeb83",
"hosts": ["example.com"],
"name": "example-api",
"http_if_terminated": false,
"https_only": false,
"retries": 5,
"preserve_host": false,
"upstream_connect_timeout": 60000,
"upstream_read_timeout": 60000,
"upstream_send_timeout": 60000,
"upstream_url": "http:\/\/mockbin.org"
}, {
"created_at": 1527732578045,
"strip_uri": true,
"id": "29f12209-f45b-45dc-b6e1-f64e855d7387",
"hosts": ["example.com"],
"name": "example-api2",
"http_if_terminated": false,
"https_only": false,
"retries": 5,
"preserve_host": false,
"upstream_connect_timeout": 60000,
"upstream_read_timeout": 60000,
"upstream_send_timeout": 60000,
"upstream_url": "http:\/\/mockbin.org"
}]
}
配置nginx负载Kong集群
对外提供9000端口,通过nginx的负载均衡,根据自身的需求,配置不同的算法,反向代理到kong的集群中
upstream kong {
# 负载均衡算法,根据最少连接数
least_conn;
server 192.168.0.10:8000;
server 192.168.0.11:8000;
}
server {
# 这些端口要修改为实际情况
listen 9100;
#include snippets/ssl-api.example.com.conf;
#include snippets/ssl-params.conf;
# https 因为安全原因,需要禁用 gzip
# 但是在一些场景下,不需要禁用
# gzip off;
gzip on;
# 设置允许压缩的页面最小字节数
gzip_min_length 1000;
gzip_buffers 4 16k;
gzip_http_version 1.1;
# 1~9,默认为1,数值越大,压缩率越高,CPU占用越多,时间越久
gzip_comp_level 3;
gzip_vary on;
# 禁用对 IE 6 使用 gzip 压缩
gzip_disable "MSIE [1-6]\.";
gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/javascript "application/javascript; charset=utf-8" application/xml application/xml+rss application/json "application/json; charset=utf-8" fo
nt/ttf font/otf image/svg+xml;
# 设置最大允许的POST数据量,如果提交的文件超过这个值,会出现413错误
client_max_body_size 20m;
keepalive_timeout 15;
# 不显示 nginx 的版本号
server_tokens off;
## Individual nginx logs
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
# 这里不能用 ^~ 因为后面跟的是字符串不是正则表达式
# 只匹配符合规则的,其他都返回 404
location / {
# 这条命令会将 headers 中的 server 设置为 nginx 代理的后端网站所使用的
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_pass http://kong;
expires -1;
}
# 主页返回 404
location = / {
return 404;
}
}
使用时,将所有额请求都转发到http://192.168.0.10:9100上,然后后续Kong会根据配置进行相应的处理以及相关的插件过滤
Kong-Dashboard辅助工具
安装
要将kong-dashboard和kong放在同一各network中(使用docker)
docker run -d –network kong-net –name kong-dashboard -p 8080:8080 pgbi/kong-dashboard start
–kong-url http://kong:8001
–basic-auth user=password
访问
http://192.168.0.1:8080 使用创建时的用户名和密码就可以登录进行管理了