postgresql 集群_Kong系列(一)——Kong集群部署

30e3775de79281983f4628cf36901250.png

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 使用创建时的用户名和密码就可以登录进行管理了

如有兴趣扫码加入QQ群,进行更多的交流。

c82c7382dd40ade45793095af95840b6.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值