介绍
技术 | 特性 | 适用场景 | 说明 |
---|---|---|---|
Kong | – 基于OpenResty编写 – 高可用 – 易扩展 – 支持Cassandra存储 – 支持PostgreSQL存储 – restfull 方式 管理admin api – 插件化支持 – 集群中的节点通过gossip协议自动发现其它节点 | 网关 | – 官网 – Kong Community Edition (CE) – Github – Docs – Install Kong Community Edition – Quickstart – 入门 – FAQS – Kong插件 |
konga | – 多用户管理 – 管理多个Kong节点 – 电子邮件异常信息通知 – 管理所有Kong Admin API – 使用快照备份,还原和迁移Kong节点 – 使用运行状况检查监控节点和API状态 – 轻松的数据库集成(MySQL、postgresSQL、MongoDB) | Kong GUI | – 官网 – Github – Doc |
Kong dashboard | – 基于node.js | Kong GUI | 官方推荐UI管理工具 – Github |
kongdash | – 支持windows、MacOS、Ubuntu、Fedora | desktop client for Kong Admin API | – 官网 – Github – 下载 |
基本概念
名称 | 说明 |
---|---|
service | upstream services的抽象。 Service的主要属性是它的URL。 服务与路由相关联(服务可以有许多与之关联的路由) |
Route | 路由是进入Kong的入口点,并为要匹配的请求定义规则,并路由到给定的Service。 Route定义匹配客户端请求的规则。每个Route与一个服务相关联,一个服务可能有多个与之关联的路由。匹配给定路由的每个请求都将代理到其关联的服务。 |
upstream service | 这是指位于Kong后面的您自己的API /服务,转发客户端请求。 |
target | – |
consumer | API可能没有用户概念,会出现随意调用的情况。为此Kong提供了一种consumer对象(全局共用),如某API启用了key-auth,没有身份的访问者将无法调用该API。 |
api | 用于表示上游服务的旧实体。不推荐使用。 |
安装Kong
先决条件
安装PostgreSQL
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | $ yum -y install https://download.postgresql.org/pub/repos/yum/11/redhat/rhel-7-x86_64/pgdg-centos11-11-2.noarch.rpm $ yum -y install postgresql11 $ yum -y install postgresql11-server $ /usr/pgsql-11/bin/postgresql-11-setup initdb $ systemctl enable postgresql-11 $ systemctl start postgresql-11 $ su – postgres $ psql $ CREATE USER kong; $ CREATE DATABASE kong OWNER kong; $ alter user kong with encrypted password ‘123456’; \q $ find / -name “postgresql.conf” $ vi /var/lib/pgsql/11/data/postgresql.conf # 修改 listen_addresses项值设定为“*” $ find / -name “pg_hba.conf” $ vi /var/lib/pgsql/11/data/pg_hba.conf # 添加以下内容 host all all 0.0.0.0/0 md5 $ systemctl restart postgresql-11 |
CentOS7中RPM方式安装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | # 下载 $ cd /usr/local $ wget https://bintray.com/kong/kong-rpm/download_file?file_path=centos/7/kong-1.3.0.el7.amd64.rpm # 安装 $ yum localinstall kong-1.3.0.el7.amd64.rpm # 配置kong的配置文件 $ whereis kong $ cd /etc/kong/ $ cp kong.conf.default kong.conf ##### 内容开始 ##### database = postgres pg_host = 10.10.1.179 pg_port = 5432 pg_user = kong pg_password = 123456 pg_database = kong ##### 内容结束 ##### # 初始化kong的数据库 $ kong migrations up -c /etc/kong/kong.conf # 启动kong $ kong start -c /etc/kong/kong.conf # 测试是否安装成功 $ curl -i http://localhost:8001/ |
kong的默认值
项 | 说明 |
---|---|
kong默认的代理地址 | proxy_listen = 0.0.0.0:8000, 0.0.0.0:8443 |
默认的管理地址 | admin_listen = 127.0.0.1:8001, 127.0.0.1:8444 ssl |
安装kong-dashboard
npm安装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | # 安装npm $ yum -y install npm # 安装kong-dashboard $ npm install -g kong-dashboard ##### 启动kong-dashboard ##### # 查看启动选项的完整列表 $ kong-dashboard start –help # 启动Kong Dashboard $ kong-dashboard start –kong-url http://127.0.0.1:8001 # 在自定义端口上启动Kong Dashboard kong-dashboard start \ –kong-url http://kong:8001 \ –port [port] # 使用基本身份验证启动Kong Dashboard kong-dashboard start \ –kong-url http://kong:8001 \ –basic-auth user1=password1 user2=password2 ##### 启动kong-dashboard ##### # 访问kong-dashboard $ curl http://127.0.0.1:8080 |
Docker安装
1 2 3 4 5 6 7 8 9 10 11 12 13 | # 查看启动选项的完整列表 docker run –rm -p 8080:8080 pgbi / kong-dashboard start –help # 启动Kong Dashboard $ docker run –rm -p 8080:8080 pgbi / kong-dashboard start –kong-url http:// kong:8001 # 在自定义端口上启动Kong Dashboard $ docker run –rm -p [port]:8080 pgbi / kong-dashboard start –kong-url http:// kong:8001 # 使用基本身份验证启动Kong Dashboard $ docker run –rm -p 8080:8080 pgbi / kong-dashboard start \ –kong-url http:// kong:8001 –basic-auth user1 = password1 user2 = password2 |
安装konga
先决条件
- 安装node.js 8.0+
- 安装npm
CentOS7安装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | ##### 安装node.js 8+ ###### $ cd /usr/local $ wget https://nodejs.org/dist/v10.14.2/node-v10.14.2-linux-x64.tar.xz $ tar -xJvf node-v10.14.2-linux-x64.tar.xz $ mv node-v10.14.2-linux-x64 node $ vi /etc/profile ##### 在末尾处添加如下 export NODEJS_HOME=/usr/local/node export PATH=$NODEJS_HOME:$PATH ##### 使环境变量生效 $ source /etc/profile $ node –version ##### 安装bower ###### $ npm install bower -g $ bower -v ##### 安装gulp ###### $ npm install gulp -g $ gulp -v ##### 安装grunt ###### $ ##### 安装konga ###### $ git clone https://github.com/pantsel/konga.git $ cd konga $ npm i # 启动 $ npm start $ curl http://localhost:1337 |
Admin API
节点信息
查询节点信息
1 | $ curl http://localhost:8001 |
字段 | 说明 |
---|---|
node_id | 正在运行的kong节点的uuid,当kong启动时随机生成,每次kong重启时这个uuid都会变 |
availabel_on_server | kong节点上安装的plugins的名称 |
enabled_in_cluster | kong节点中启用的插件,即在数据库中生成了对应存储表 |
查询节点状态
1 | $ curl http://localhost:8001/status |
字段 | 说明 |
---|---|
total_requests | 客户端请求总数 |
connections_active | 包括等待连接的活动客户端连接的当前数量 |
connections_accepted | 接受的客户端连接的总数 |
connections_handled | 处理连接的总数。一般来说,除非达到一定的资源限制,否则参数值与接受值相同 |
connections_reading | 当前Kong正在读取请求头的连接数 |
connections_writing | NGINX将响应写入客户端的连接的当前数量 |
connections_waiting | 等待请求的空闲客户端连接的当前数量 |
reachable | 反映数据库连接状态的布尔值。注意,此标志不反映数据库本身的健康状况。 |
Service
添加Service
1 2 | $ curl -i -X POST http://localhost:8001/services -d “name=test.service” -d “url=http://后端服务域名/api” $ curl -i -X POST http://localhost:8001/services -d “name=test.service” -d “protocol=http” -d “host=hxonline.hxsd.cn” -d “path=/api” |
字段 | 说明 |
---|---|
name | 服务名称 |
protocol | 协议:http or https 默认是 http |
host | 后端服务域名 |
port | 后端服务端口 |
path | 后端服务子路径;没有就填 ‘/‘ |
retries | 重试次数:默认 5次 |
connect_timeout | 请求后端服务的超时时间:默认60000 ms |
write_timeout | 写超时时间:默认60000 ms |
read_timeout | 读超时时间:默认60000 ms |
url | 后端服务url地址 |
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 | $ curl -i -X POST \ –url http://localhost:8001/services/ \ –data ‘name=example-service’ \ –data ‘url=http://mockbin.org’ HTTP/1.1 201 Created Date: Thu, 13 Dec 2018 07:36:57 GMT Content-Type: application/json; charset=utf-8 Connection: keep-alive Access-Control-Allow-Origin: * Server: kong/0.14.1 Content-Length: 259 {“host”:”mockbin.org”,”created_at”:1544704617,”connect_timeout”:60000,”id”:”c7be1fbd-c8dc-42a5-9397-a494514db290″,”protocol”:”http”,”name”:”example-service”,”read_timeout”:60000,”port”:80,”path”:null,”updated_at”:1544704617,”retries”:5,”write_timeout”:60000} |
查询所有Service
1 | $ curl -i -X GET http://localhost:8001/services |
示例:
1 2 3 4 5 6 7 8 9 10 | $ curl -i -X GET http://localhost:8001/services/ HTTP/1.1 200 OK Date: Thu, 13 Dec 2018 07:42:02 GMT Content-Type: application/json; charset=utf-8 Connection: keep-alive Access-Control-Allow-Origin: * Server: kong/0.14.1 Content-Length: 282 {“next”:null,”data”:[{“host”:”mockbin.org”,”created_at”:1544704617,”connect_timeout”:60000,”id”:”c7be1fbd-c8dc-42a5-9397-a494514db290″,”protocol”:”http”,”name”:”example-service”,”read_timeout”:60000,”port”:80,”path”:null,”updated_at”:1544704617,”retries”:5,”write_timeout”:60000}]} |
查询某个Service
1 | $ curl -i -X GET http://localhost:8001/services/{服务名称 or 服务id} |
示例:
1 2 3 4 5 6 7 8 9 10 | $ curl -i -X GET http://localhost:8001/services/example-service HTTP/1.1 200 OK Date: Thu, 13 Dec 2018 08:02:24 GMT Content-Type: application/json; charset=utf-8 Connection: keep-alive Access-Control-Allow-Origin: * Server: kong/0.14.1 Content-Length: 247 {“host”:”mockbin.org”,”created_at”:1544704617,”connect_timeout”:60000,”id”:”c7be1fbd-c8dc-42a5-9397-a494514db290″,”protocol”:”http”,”name”:”example-service”,”read_timeout”:60000,”port”:80,”updated_at”:1544704617,”retries”:5,”write_timeout”:60000} |
获取某个路由下的Service
1 2 | $ curl -i -X GET http://localhost:8001/routes/{路由ID}/service $ curl -i -X GET http://localhost:8001/routes/xxxx-xxx-xxx-xx/service |
更新Service
1 | $ curl -i -X PUT http://localhost:8001/services/{服务名称或ID} -d “name=test.service” -d “protocol=http” -d “host=hxonline.hxsd.cn” -d “path=/api” |
删除Service
1 2 | $ curl -i -X DELETE http://localhost:8001/services/{服务名称或ID} $ curl -i -X DELETE http://localhost:8001/services/test.service |
Route
添加Route
1 2 3 4 | $ curl -i -X POST –url http://localhost:8001/routes/ \ -d ‘protocols[]=http&protocols[]=https’ \ -d ‘paths=/test’ \ -d ‘service.id=xxx-xxxx-xxxx-xx’ |
示例:
1 2 3 4 5 6 7 8 9 10 11 12 | $ curl -i -X POST \ –url http://localhost:8001/services/example-service/routes \ –data ‘hosts[]=example.com’ HTTP/1.1 201 Created Date: Thu, 13 Dec 2018 08:06:10 GMT Content-Type: application/json; charset=utf-8 Connection: keep-alive Access-Control-Allow-Origin: * Server: kong/0.14.1 Content-Length: 290 {“created_at”:1544688370,”strip_path”:true,”hosts”:[“example.com”],”preserve_host”:false,”regex_priority”:0,”updated_at”:1544688370,”paths”:null,”service”:{“id”:”c7be1fbd-c8dc-42a5-9397-a494514db290″},”methods”:null,”protocols”:[“http”,”https”],”id”:”076d68f8-47fd-47aa-af48-40e71677aa9c”} |
访问接口:
1 2 3 | $ curl -i -X GET \ –url http://localhost:8000/ \ –header ‘Host: example.com’ |
可以在/etc/hostsname中将example.com地址配置为kong所在的机器的地址:
1 | 10.10.192.35 example.com |
然后就可以通过example.com:8000打开http://mockbin.org。
字段 | 是否必填 | 说明 |
---|---|---|
protocols | 必填 | 协议列表,http、https。设置:protocols[]=http&protocols[]=https |
methods | 半选填 默认是二者都行 | 接受请求的方法:GET 或 POST ,二者都行。设置 methods[]=GET&methods[]=POST |
hosts | 半选填 | 与此路由匹配的域名列表。例如:example.com。用作form-encode, 设置:hosts[]= Foo.com和hosts[]= BAR.com |
paths | 必填 | 与此路由匹配的路径列表。 例如:/test |
strip_path | 选填 | |
preserve_host | 选填 | |
service | 必填 | 与此路由绑定的服务。 设置:service.id= |
获取全部Route
1 | $ curl -i -X GET http://localhost:8001/routes/ |
获取某个Route
1 2 | # xxx-xxx-xxx 路由ID $ curl -i -X GET http://localhost:8001/routes/xxx-xxx-xxx |
获取某Service下的Route
1 | $ curl -i -X GET http://localhost:8001/services/{服务名或服务ID}/routes |
更新Route
可以用 PATCH 和 PUT,PATCH可以修改已存在的路由,PUT 如果路由不存在则新建一个。
1 2 3 4 | # xxx-xxx-xxx 路由ID $ curl -i -X PUT http://localhost:8001/routes/xxx-xxx-xxx \ -d ‘protocols[]=http&protocols[]=https’ \ -d ‘paths=test’ \ |
删除Route
1 2 | # xxx-xxx-xxx 路由ID $ curl -i -X DELETE http://localhost:8001/routes/xxx-xxx-xxx |
配置upstream
1 | $ curl -X POST http://localhost:8001/upstreams –data “name=helloUpstream” |
配置 target
1 | $ curl -X POST http://localhost:8001/upstreams/hello/targets –data “target=localhost:3000” –data “weight=100” |
配置Consumer
添加Consumer
1 2 3 4 5 6 7 8 | # 创建一个consumer $ curl -X POST \ –data “username=oauthadmin” \ –data “custom_id=personapi” \ http://127.0.0.1:8001/consumers/ # 在key-auth插件中为此consumer生成key $ curl -X POST \ http://127.0.0.1:8001/consumers/oauthadmin/key-auth |
配置插件
为 hello 服务添加50次/秒的限流
1 2 3 | $ curl -X POST http://localhost:8001/services/hello/plugins \ –data “name=rate-limiting” \ –data “config.second=50” |
为 hello 服务添加 jwt 插件
1 2 | $ curl -X POST http://localhost:8001/services/login/plugins \ –data “name=jwt” |
将插件安装在路由上
1 2 3 4 5 6 | $ curl -X POST http://localhost:8001/routes/{routeId}/plugins \ –data “name=rate-limiting” \ –data “config.second=50” $ curl -X POST http://localhost:8001/routes/{routeId}/plugins \ –data “name=jwt” |
配置Certificates
1 | $ |
kong与Consul集成
您可以通过指定dns_resolver属性(在kong.conf配置文件中)指向Consul服务器(或通过设置KONG_DNS_RESOLVER=环境变量)使Kong与Consul一起使用。 通过这样做,迫使Kong使用Consul来解析upstream_url API 中的主机名地址。 参考
运维
管理kong
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | # 查看版本 $ kong version # 启动 $ kong start -c /etc/kong/kong.conf # 停止 $ kong stop # 重新加载 $ kong reload # 重启 $ kong restart # 验证配置 $ kong check /etc/kong/kong.conf # 健康检查 $ kong health # 初始化数据库配置 $ kong migrations up -c /etc/kong/kong.conf |
配置集群
配置健康检查
配置断路器
配置监控
插件
认证
Basic Authentication
JWT
Key Authentication
LDAP Authentication
OAuth 2.0 Authentication
OKTA
Upstream HTTP Basic Authentication
安全
Bot Detection
CORS
IP Restriction
Cleafy plugin for Kong
Kong Spec Expose
Kong Upstream JWT
Signal Sciences
Wallarm
流控
ACL
Rate Limiting
Request Termination
Response Rate Limiting
Kong Response Size Limiting
Kong Service Virtualization
Request Size Limiting
分析和监控
Datadog
Prometheus
Zipkin
Moesif API Insights
SignalFx
日志
TCP、UDP、HTTP、File、Syslog、StatsD、Loggly等
常见问题
附录
数据字典
acls
字段名 | 类型 | 默认值 | 说明 |
---|---|---|---|
id | uuid | ||
consumer_id | uuid | ||
group | text | – |
apis
字段名 | 类型 | 默认值 | 说明 |
---|---|---|---|
id | uuid | ||
name | text | ||
upstream_url | text | ||
preserve_host | bool | ||
created_at | timestamp(6) | ||
retries | int2 | 5 | |
https_only | bool | ||
http_if_terminated | bool | ||
hosts | text | ||
uris | text | ||
methods | text | ||
strip_uri | bool | ||
upstream_connect_timeout | int4 | ||
upstream_send_timeout | int4 | ||
upstream_read_timeout | int4 | – |
basicauth_credentials
字段名 | 类型 | 默认值 | 说明 | ||
---|---|---|---|---|---|
id | uuid | ||||
consumer_id | uuid | ||||
username | text | ||||
password | text | ||||
created_at | timestamp(6) | – |
certificates
id | uuid | | |
cert | text | | |
key | text | | |
created_at | timestamptz | | – |
cluster_events
字段名 | 类型 | 默认值 | 说明 |
---|---|---|---|
id | uuid | ||
node_id | uuid | ||
at | timestamp(6) | ||
nbf | timestamp(6) | ||
expire_at | timestamp(6) | ||
channel | text | ||
data | text | – |
consumers
字段名 | 类型 | 默认值 | 说明 |
---|---|---|---|
id | uuid | ||
custom_id | text | ||
username | text | ||
created_at | – |
hmacauth_credentials
字段名 | 类型 | 默认值 | 说明 |
---|---|---|---|
id | uuid | ||
consumer_id | uuid | ||
username | text | ||
secret | text | ||
created_at | timestamp(6) | – |
jwt_secrets
字段名 | 类型 | 默认值 | 说明 |
---|---|---|---|
id | uuid | ||
consumer_id | uuid | ||
key | text | ||
secret | text | ||
created_at | timestamp(6) | ||
algorithm | text | ||
rsa_public_key | text | – |
keyauth_credentials
字段名 | 类型 | 默认值 | 说明 |
---|---|---|---|
id | uuid | ||
consumer_id | uuid | ||
key | text | ||
created_at | timestamp(6) | – |
oauth2_authorization_codes
字段名 | 类型 | 默认值 | 说明 |
---|---|---|---|
id | uuid | ||
code | text | ||
authenticated_userid | text | ||
scope | text | ||
created_at | timestamp(6) | ||
credential_id | uuid | ||
api_id | uuid | ||
service_id | uuid | – |
oauth2_credentials
字段名 | 类型 | 默认值 | 说明 |
---|---|---|---|
id | uuid | ||
name | text | ||
consumer_id | |||
client_id | text | ||
client_secret | text | ||
redirect_uri | text | ||
created_at | timestamp(6) | – |
oauth2_tokens
字段名 | 类型 | 默认值 | 说明 |
---|---|---|---|
id | uuid | ||
credential_id | uuid | ||
access_token | text | ||
token_type | text | ||
refresh_token | text | ||
expires_in | int4 | ||
authenticated_userid | text | ||
scope | text | ||
created_at | timestamp(6) | ||
api_id | uuid | ||
service_id | uuid | – |
plugins
字段名 | 类型 | 默认值 | 说明 |
---|---|---|---|
id | uuid | ||
name | text | ||
api_id | uuid | ||
consumer_id | uuid | ||
config | json | ||
enabled | bool | ||
created_at | timestamp(6) | ||
route_id | uuid | ||
service_id | uuid | – |
ratelimiting_metrics
字段名 | 类型 | 默认值 | 说明 |
---|---|---|---|
id | uuid | ||
identifier | text | ||
period | text | ||
period_date | timestamp(6) | ||
value | int4 | ||
route_id | uuid | ||
service_id | uuid | – |
response_ratelimiting_metrics
字段名 | 类型 | 默认值 | 说明 |
---|---|---|---|
id | uuid | ||
identifier | text | ||
period | text | ||
period_date | timestamp(6) | ||
value | int4 | ||
route_id | uuid | ||
service_id | uuid | – |
routes
字段名 | 类型 | 默认值 | 说明 |
---|---|---|---|
id | uuid | ||
created_at | timestamp(6) | ||
updated_at | timestamp(6) | ||
protocols | text[] | ||
methods | text[] | ||
hosts | text[] | ||
paths | text[] | ||
regex_priority | int8 | ||
strip_path | bool | ||
preserve_host | bool | ||
service_id | uuid | – |
schema_migrations
字段名 | 类型 | 默认值 | 说明 |
---|---|---|---|
id | uuid | ||
migrations | varchar(100)[] | – |
services
字段名 | 类型 | 默认值 | 说明 |
---|---|---|---|
id | uuid | ||
created_at | timestamp(6) | 创建时间 | |
updated_at | timestamp(6) | 更新时间 | |
name | text | ServiceName | |
retries | int8 | 代理失败时要执行的重试次数。默认值为5。 | |
protocol | text | 协议。http/https | |
host | text | The host of the upstream server | |
port | int8 | The upstream server port. Defaults to 80 | |
path | text | The path to be used in requests to the upstream server. Empty by default. | |
connect_timeout | int8 | The timeout in milliseconds for establishing a connection to the upstream server. Defaults to 60000. | |
write_timeout | int8 | The timeout in milliseconds between two successive write operations for transmitting a request to the upstream server. Defaults to 60000. | |
read_timeout | int8 | The timeout in milliseconds between two successive read operations for transmitting a request to the upstream server. Defaults to 60000. |
snis
字段名 | 类型 | 默认值 | 说明 |
---|---|---|---|
id | uuid | ||
name | text | ||
certificate_id | uuid | ||
created_at | timestamp(6) | – |
targets
字段名 | 类型 | 默认值 | 说明 |
---|---|---|---|
id | uuid | ||
target | text | ||
weight | int4 | ||
upstream_id | uuid | ||
created_at | timestamp(6) | – |
ttls
字段名 | 类型 | 默认值 | 说明 |
---|---|---|---|
primary_key_value | text | ||
primary_uuid_value | uuid | ||
table_name | text | ||
primary_key_name | text | ||
expire_at | timestamp(6) | – |
upstreams
字段名 | 类型 | 默认值 | 说明 |
---|---|---|---|
id | uuid | ||
name | text | ||
slots | int4 | ||
created_at | timestamp(6) | ||
healthchecks | json | ||
hash_on | text | ||
hash_fallback | text | ||
hash_on_header | text | ||
hash_fallback_header | text | ||
hash_on_cookie | text | ||
hash_on_cookie_path | text | – |
参考
开源
文档
Kong系列
文章
- 微服务之API网关:Kong:概要与安装
- 微服务网关Kong实践
- API网关之Kong简介
- kong+konga
- KONG API Gateway入门教程
- KONG基础使用
- 【kong系列一】之 API网关 & kong 概述
- kong系列:admin-api使用
- 网关gateway选型
- 基于 Kong 的 OAuth2.0 的设计
- 在kong上配置oauth2来做api的认证
- 基于Kong建立支持OAuth2.0的API网关
- 使用kong0.10.x配置oauth2.0的坑
- 浅谈网关 kong 中的服务(service)与路由(route)
- Enabling OAuth 2.0 On Kong With SSL Termination on Load Balancer
- kong系列:admin-api使用
- Kong整合Consul – Kong最佳实践
- 使用 konga 来管理微服务 API 网关 kong