Kong安装配置和使用
- 环境查看
系统环境
# cat /etc/redhat-release
Rocky Linux release 9.3 (Blue Onyx)
# uname -a
Linux Rocky9Kong003094 5.14.0-362.18.1.el9_3.0.1.x86_64 #1 SMP PREEMPT_DYNAMIC Sun Feb 11 13:49:23 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
软件环境
# docker version
Client: Docker Engine - Community
Version: 25.0.3
API version: 1.44
Go version: go1.21.6
Git commit: 4debf41
Built: Tue Feb 6 21:14:42 2024
OS/Arch: linux/amd64
Context: default
Server: Docker Engine - Community
Engine:
Version: 25.0.3
API version: 1.44 (minimum version 1.24)
Go version: go1.21.6
Git commit: f417435
Built: Tue Feb 6 21:13:06 2024
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.28
GitCommit: ae07eda36dd25f8a1b98dfbf587313b99c0190bb
runc:
Version: 1.1.12
GitCommit: v1.1.12-0-g51d5e94
docker-init:
Version: 0.19.0
GitCommit: de40ad0
- 安装
Docker安装
创建网络
# docker network create kong-net
运行PostgrlSQL容器
# docker run -d --name kong-database \
--network=kong-net \
-p 5432:5432 \
-e "POSTGRES_USER=kong" \
-e "POSTGRES_DB=kong" \
-e "POSTGRES_PASSWORD=kongpass" \
postgres:13
创建kong数据库
# docker run --rm --network=kong-net \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-database" \
-e "KONG_PG_PASSWORD=kongpass" \
-e "KONG_PASSWORD=test" \
kong/kong-gateway:3.10.0.0 kong migrations bootstrap
设置License
# export KONG_LICENSE_DATA='{"license":{"payload":{"admin_seats":"1","customer":"Example Company, Inc","dataplanes":"1","license_creation_date":"2017-07-20","license_expiration_date":"2017-07-20","license_key":"00141000017ODj3AAG_a1V41000004wT0OEAU","product_subscription":"Konnect Enterprise","support_plan":"None"},"signature":"6985968131533a967fcc721244a979948b1066967f1e9cd65dbd8eeabe060fc32d894a2945f5e4a03c1cd2198c74e058ac63d28b045c2f1fcec95877bd790e1b","version":"1"}}'
运行kong网关
docker run -d --name kong-gateway \
--network=kong-net \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-database" \
-e "KONG_PG_USER=kong" \
-e "KONG_PG_PASSWORD=kongpass" \
-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_GUI_URL=http://localhost:8002" \
-e KONG_LICENSE_DATA \
-p 8000:8000 \
-p 8443:8443 \
-p 8001:8001 \
-p 8444:8444 \
-p 8002:8002 \
-p 8445:8445 \
-p 8003:8003 \
-p 8004:8004 \
kong/kong-gateway:3.10.0.0
以上运行代码需要修改localhost为服务器的ip地址,否则访问8002会出现跨域问题
3. 验证Kong Gateway正在运行
Kong Gateway 在默认端口提供 Admin API8001。 Admin API 可用于查询和控制 Kong Gateway 的状态。以下命令将查询 Admin API,仅获取头部信息:
# curl --head localhost:8001
# 如果Kong运行正常,它将返回一个200的HTTP状态码,内容大致如下
HTTP/1.1 200 OK
Date: Fri, 23 May 2025 03:17:19 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
Access-Control-Allow-Origin: http://192.168.3.94:8002
X-Kong-Admin-Request-ID: 427df532301fb645d29336321f30625a
vary: Origin
Access-Control-Allow-Credentials: true
Content-Length: 25689
X-Kong-Admin-Latency: 7
Server: kong/3.10.0.0-enterprise-edition
Admin API 的根路由提供了有关正在运行的 Kong Gateway 的重要信息,包括网络、安全性和插件信息。完整的配置信息在返回的 JSON 文档的 .configuration 键中。
# curl -s localhost:8001 | jq '.configuration'
你应该会收到一个包含 Kong Gateway 配置信息的大型JSON 响应。
服务和路由
Kong Gateway管理员使用对象模型来定义其所需的流量管理策略。该模型中的两个重要对象是服务和路由。服务和路由已协调的方式进行配置,以定义请求通过系统时所采取的路由路径。
下面图示显示了请求到达路由并转发到服务的过程,响应则走相反的路径
什么是服务
在Kong Gateway中,服务是现有上游应用的抽象。服务可以存储对象集合,如插件配置和策略,并且它们可以与路由关联。
在定义服务时,管理员提供一个名称和上游应用连接信息,连接细节可以作为单个字符串在url字段中提供,或者分别提供protocol、host、port和path的单独值。
服务与上游应用程序具有一对一到多对一的关系,这允许管理员创建复杂的流量管理行为。
什么是路由
路由是上游应用程序内资源的路径。将路由添加到服务中,以便允许访问底层应用程序。在 Kong Gateway 中,路由通常映射到通过 Kong Gateway 应用程序暴露的端点。路由还可以定义匹配请求到相关服务的规则。因此,一个路由可以引用多个端点。基本的路由应该有一个名称、路径或路径,并引用现有的服务。
管理服务
创建服务
要添加新服务,请发送一个POST请求到Kong Gateway的/services管理API路由
curl -i -s -X POST http://localhost:8001/services \
--data name=example_service \
--data url='https://httpbin.konghq.com'
此请求指示Kong Gateway创建一个新的服务,映射到上游 URL https://httpbin.konghq.com
在我们的示例中请求包含两个字符串
- name 服务名称
- url 一个填充host,port和path属性的参数
如果您的请求成功,您将看到 201 Kong Gateway 的响应头,确认您的服务已创建,响应体将类似于:
HTTP/1.1 201 Created
Date: Tue, 27 May 2025 05:40:04 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
Access-Control-Allow-Origin: http://192.168.3.94:8002
X-Kong-Admin-Request-ID: c4f3b97641a1a922eba79a45707d4f57
vary: Origin
Access-Control-Allow-Credentials: true
Content-Length: 385
X-Kong-Admin-Latency: 17
Server: kong/3.10.0.0-enterprise-edition
在创建请求中未明确提供的字段会根据当前 Kong Gateway 配置自动分配默认值。
查看服务配置
当你创建一个服务时。Kong Gateway会为其分配一个唯一的id,如上面的响应搜索。id字段,或在创建时提供的服务名称,可用于在后续中识别该服务。这是服务的url,格式为services/{server name or id}
要查看服务的当前状态,请向服务GET发送请求到服务URL。
curl -X GET http://localhost:8001/services/example_service|jq
成功的请求将在响应体中包含您服务的当前配置,并且看起来类似于以下片段:
{
"name": "example_service",
"connect_timeout": 60000,
"host": "httpbin.konghq.com",
"id": "6ac9689d-442e-4b51-bc12-76314d763c85",
"tags": null,
"retries": 5,
"created_at": 1748324404,
"port": 443,
"protocol": "https",
"write_timeout": 60000,
"enabled": true,
"tls_verify_depth": null,
"ca_certificates": null,
"path": null,
"client_certificate": null,
"updated_at": 1748324404,
"read_timeout": 60000,
"tls_verify": null
}
更新服务
现有的服务配置可以通过向服务URL发送请求动态更新。PATCH
要动态设置服务重试次数从 5 到 6,发送此 PATCH 请求:
curl --request PATCH \
--url localhost:8001/services/example_service \
--data retries=6
响应体包含完整的服务配置,包括更新的值:
{
"name": "example_service",
"connect_timeout": 60000,
"host": "httpbin.konghq.com",
"id": "6ac9689d-442e-4b51-bc12-76314d763c85",
"tags": null,
"retries": 6,
"created_at": 1748324404,
"port": 443,
"protocol": "https",
"write_timeout": 60000,
"enabled": true,
"tls_verify_depth": null,
"ca_certificates": null,
"path": null,
"client_certificate": null,
"updated_at": 1748327009,
"read_timeout": 60000,
"tls_verify": null
}
列出服务
您可以通过向基础GET发送请求来列出所有当前服务/services URL。
curl -X GET http://localhost:8001/services|jq
你还可以通过在浏览器中导航到以下URL来在Kong Manager UI中查看服务配置
管理路由
创建路由
路由定义了如何代理请求。你可以通过向服务URL发送请求来创建与特定服务关联的路由。
在/mock路径上配置新的路由以将流量引导到example_service之前创建的服务:
curl -i -X POST http://localhost:8001/services/example_service/routes \
--data 'paths[]=/mock' \
--data name=example_route
如果路线成功创建,API将返回一个201响应代码和一个响应体,如下所示:
HTTP/1.1 201 Created_route
Date: Tue, 27 May 2025 07:59:03 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
Access-Control-Allow-Origin: http://192.168.3.94:8002
X-Kong-Admin-Request-ID: b90e9a2a64ab70193588ed14444a3774
vary: Origin
Access-Control-Allow-Credentials: true
Content-Length: 485
X-Kong-Admin-Latency: 22
Server: kong/3.10.0.0-enterprise-edition
查看路由配置
就像服务一样,当你创建一个路由时,Kong Gateway会为其分配一个唯一id,如上面响应所示,id字段或者在创建路由时指定路由名称,可以在后续请求用于标识该路由。路由URL可以采用以下两种形式之一
- /services/{service name or id}/routes/
- /routes/{route name or id}
要查看当前example_route路线的状态,请向路线URL发送GET请求:
以下两请求都可以
curl -X GET http://localhost:8001/services/example_service/routes/example_route|jq | jq
curl -X GET http://localhost:8001/routes/example_route | jq
响应体包含你当前的路由配置
{
"protocols": [
"http",
"https"
],
"name": "example_route",
"strip_path": true,
"snis": null,
"id": "9f79e391-9af1-4bd6-afe1-dc3ef29aae54",
"preserve_host": false,
"methods": null,
"tags": null,
"regex_priority": 0,
"sources": null,
"service": {
"id": "6ac9689d-442e-4b51-bc12-76314d763c85"
},
"destinations": null,
"path_handling": "v0",
"paths": [
"/mock"
],
"headers": null,
"request_buffering": true,
"https_redirect_status_code": 426,
"hosts": null,
"created_at": 1748332743,
"updated_at": 1748332743,
"response_buffering": true
}
更新路由
就像服务一样,可以通过向路由URL发送请求动态更新路由。PATCH
标签是可选的字符串集合,可以与路由关联以进行分组和过滤。 您可以通过发送一个 PATCH 请求到 服务端点 并指定一个路由来分配标签。
通过分配一个具有值的标签来更新路线tutorial:
curl --request PATCH \
--url localhost:8001/services/example_service/routes/example_route \
--data tags="tutorial"
如果标签成功应用,响应体包含以下json值
{
"protocols": [
"http",
"https"
],
"name": "example_route",
"strip_path": true,
"snis": null,
"id": "9f79e391-9af1-4bd6-afe1-dc3ef29aae54",
"preserve_host": false,
"methods": null,
"tags": [
"tutorial"
],
"regex_priority": 0,
"sources": null,
"service": {
"id": "6ac9689d-442e-4b51-bc12-76314d763c85"
},
"destinations": null,
"path_handling": "v0",
"paths": [
"/mock"
],
"headers": null,
"request_buffering": true,
"https_redirect_status_code": 426,
"hosts": null,
"created_at": 1748332743,
"updated_at": 1748333432,
"response_buffering": true
}
列出路由
管理员API还支持列出当前所配置的路由
curl http://localhost:8002/routes
此请求返回一个HTTP 200 状态码和一个包含此Kong Gateway实例上所有配置路由的JSON响应体对象数组。您的响应应如下所示:
{
"next": null,
"data": [
{
"protocols": [
"http",
"https"
],
"name": "example_route",
"strip_path": true,
"snis": null,
"id": "9f79e391-9af1-4bd6-afe1-dc3ef29aae54",
"preserve_host": false,
"methods": null,
"tags": [
"tutorial"
],
"regex_priority": 0,
"sources": null,
"service": {
"id": "6ac9689d-442e-4b51-bc12-76314d763c85"
},
"destinations": null,
"path_handling": "v0",
"paths": [
"/mock"
],
"headers": null,
"request_buffering": true,
"https_redirect_status_code": 426,
"hosts": null,
"created_at": 1748332743,
"updated_at": 1748333432,
"response_buffering": true
}
]
}
代理请求
Kong是一个API网关,它从客户端接收请求,并根据当前配置将请求路由到适当的上游应用程序。
现在你可以使用 http://localhost:8000/mock 来访问https://httpbin.konghq.com/
默认情况下,Kong Gateway 的管理 API 监听端口 8001的管理请求,这有时被称为控制平面。客户端使用端口8000进行数据请求,这通常被称为数据平面。
Httpbin 提供了一个/anything 资源,该资源会将关于客户端请求的信息反射回客户端。 通过 Kong Gateway 将请求代理到/anything 资源:
你应该会看到类似于以下的响应:
{
"args": {},
"data": "",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Connection": "keep-alive",
"Host": "httpbin.konghq.com",
"User-Agent": "curl/7.76.1",
"X-Forwarded-Host": "localhost",
"X-Forwarded-Path": "/mock/anything",
"X-Forwarded-Prefix": "/mock",
"X-Kong-Request-Id": "5ac1e51a966386535d5f3e364c9bc40d"
},
"json": null,
"method": "GET",
"origin": "172.18.0.1",
"url": "http://localhost/anything"
}
和使用curl访问原始url是对比
# curl -X GET https://httpbin.konghq.com/anything
{
"args": {},
"data": "",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Host": "httpbin.konghq.com",
"User-Agent": "curl/7.76.1"
},
"json": null,
"method": "GET",
"origin": "172.16.26.50",
"url": "http://httpbin.konghq.com/anything"
}
速率限制
速率控制用于控制发送到上游服务的请求速率。它可以用来防止拒绝服务攻击,限制网络抓取和其他形式的过度网络服务。没有速率限制,客户端客可以无限制地服务你的上游服务,这可能对可用性产生负面影响。
速率限制插件
Kong Gateway 通过使用速率限制插件对客户端施加速率限制。 当启用速率限制时,客户端在可配置的时间段内被限制可以发出的请求数量。 插件支持通过消费者或请求的客户端IP地址来识别客户端
全局速率限制
全局安装插件意味着每个代理请求到Kong网关 都会受到速率限制的控制。
启用速率限制
rate limiting 插件默认安装在 Kong Gateway 上,并且可以通过向POST发送 plugins 对象的管理API发送请求来启用:
curl -i -X POST http://localhost:8001/plugins \
--data name=rate-limiting \
--data config.minute=5 \
--data config.policy=local
此命令已指示Kong Gateway对所有路由和服务的每个客户端IP地址每分钟最多限制5个请求。
Kong Gateway 的policy配置决定了Kong Gateway从哪里检索和增加限制。请参阅完整的插件配置参考解详细信息。
您将看到一个响应,其中包含新的插件配置,包括类似于以下内容的识别信息:
HTTP/1.1 201 Created
Date: Wed, 28 May 2025 01:37:12 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
Access-Control-Allow-Origin: http://192.168.3.94:8002
X-Kong-Admin-Request-ID: 41e5f2570255c25522ef4e34b6665521
vary: Origin
Access-Control-Allow-Credentials: true
Content-Length: 916
X-Kong-Admin-Latency: 16
Server: kong/3.10.0.0-enterprise-edition
验证
在配置了速率限制之后,您可以通过发送超过配置时间限制允许的请求来验证它是否配置正确并且正在工作。
命令行
运行以下命令以快速发送6个模拟请求:
for _ in {1..6}; do curl -s -i localhost:8000/mock/anything; echo; sleep 1; done
在第6次请求后,您应该会收到一个429 “API请求速率限制已超过” 错误:
HTTP/1.1 429 Too Many Requests
Date: Wed, 28 May 2025 01:43:23 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
RateLimit-Reset: 37
Retry-After: 37
RateLimit-Remaining: 0
RateLimit-Limit: 5
X-RateLimit-Limit-Minute: 5
X-RateLimit-Remaining-Minute: 0
Content-Length: 92
X-Kong-Response-Latency: 1
Server: kong/3.10.0.0-enterprise-edition
X-Kong-Request-Id: 55667c1984b7f96c71a61f2370ee2515
{
"message":"API rate limit exceeded",
"request_id":"55667c1984b7f96c71a61f2370ee2515"
}
浏览器
在你的浏览器中 并在1分钟内刷新页面6次。
在第6次请求后,您应该会收到一个429 “API请求速率限制已超过” 错误:
删除速率限制
先获取到速率限制对应的id
curl -X GET http://192.168.3.94:8001/plugins|jq
通过id删除,不能通过name删除
curl -i -X DELETE http://localhost:8001/plugins/ae58100b-8647-4fc0-824e-e19a02d3ee8a
返回如下
HTTP/1.1 204 No Content
Date: Wed, 28 May 2025 01:52:39 GMT
Connection: keep-alive
Access-Control-Allow-Origin: http://192.168.3.94:8002
X-Kong-Admin-Request-ID: fc91cf1cb9e08f74e79a5a12512c5727
vary: Origin
Access-Control-Allow-Credentials: true
X-Kong-Admin-Latency: 15
Server: kong/3.10.0.0-enterprise-edition
服务等级速率限制
Rate Limiting插件可以为特定服务启用。请求与上述相同,但发布到服务URL:
curl -X POST http://localhost:8001/services/example_service/plugins \
--data "name=rate-limiting" \
--data config.minute=5 \
--data config.policy=local
路由级别速率限制
Rate Limiting 插件可以为特定路由启用。请求与上述相同,但发布到路由URL:
curl -X POST http://localhost:8001/routes/example_route/plugins \
--data "name=rate-limiting" \
--data config.minute=5 \
--data config.policy=local
消费者级别速率限制
在 Kong Gateway 中,消费者是一个定义服务使用者的抽象。可以使用消费者级别的速率限制来限制每个消费者的速度。
创建消费者
消费者通过消费者对象在API中创建
curl -X POST http://localhost:8001/consumers/ --data username=jsmith
为消费者启用速率限制
curl -X POST http://localhost:8001/plugins \
--data "name=rate-limiting" \
--data "consumer.username=jsmith" \
--data "config.second=5"
高级速率限制是付费功能
代理缓存
Kong Gateway提供性能的一种方式是通过缓存,Proxy Cache插件 通过基于可配置的响应代码、内容类型和请求方法来缓存响应从而加速性能。 当启用缓存时,上游服务不会被重复的请求所拖累,因为Kong Gateway会以其名义用缓存的结果响应。缓存可以在特定的 Kong Gateway 对象上启用或对所有请求全局启用。
缓存时间(TTL)
TTL控制缓存内容的刷新率,这对于确保客户端不会收到过时内容至关重要。TTL为30秒意味着30秒以上的内容将被视为过期,并将在后续请求中进行刷新。TTL配置应根据上游服务提供的内容类型有所不同。
- 静态数据很少更新,可以有更长的TTL。
- 动态数据应使用较短的TTL,以避免提供过时的数据
启用缓存
全局代理缓存
全局代理缓存代表每个请求到Kong Gateway都有可能被缓存
启用代理缓存
curl -i -X POST http://localhost:8001/plugins \
--data "name=proxy-cache" \
--data "config.request_method=GET" \
--data "config.response_code=200" \
--data "config.content_type=application/json" \
--data "config.cache_ttl=30" \
--data "config.strategy=memory"
如果配置成功,您将收到一个201响应代码。
此 Admin API 请求为所有GET请求配置了一个代理缓存插件,这些请求的结果是200和响应 Content-Type头相等 application/json。cache_ttl插件被指示在30秒后清除值。
最后一种选项config.strategy=memory 指定了缓存响应的底层数据存储。有关strategy的更多信息,可以在参数参考中找到,这是代理缓存插件的文档。
验证
你可以通过发送GET请求并检查返回的标头来验证代理缓存插件是否正常工作。
首先,向/mock路由发送初始请求。代理缓存插件返回以X-Cache开头的状态信息头,因此使用grep来过滤该信息:
curl -i -s -XGET http://localhost:8000/mock/anything|grep X-Cache
在初始请求时,不应有缓存的响应,并且头信息将用 X-Cache-Status: Miss来表示这一点。
X-Cache-Key: 61e325898b0f543220222417b10edd6f1730d8b534b3e0dea73719d72c1cf53c
X-Cache-Status: Miss
在初始请求后的30秒内,重复执行命令以发送相同的请求,头部将表明这是一个缓存Hit:
X-Cache-Key: 61e325898b0f543220222417b10edd6f1730d8b534b3e0dea73719d72c1cf53c
X-Cache-Status: Hit
这些X-Cache-Status头部可以返回以下缓存结果:
状态 | 描述 |
---|---|
Miss | 请求可以在缓存中满足,但在缓存中未找到该资源的条目,并且请求被代理到上游。 |
Hit | 请求已满足。资源在缓存中找到。 |
Refresh | 资源在缓存中被找到,但由于缓存控制行为或达到其硬编码的cache_ttl阈值,无法满足请求。 |
Bypass | 根据插件配置,无法从缓存中满足请求。 |
实体级代理缓存
服务级别
代理缓存插件可以为特定服务启用。请求与上述相同,但请求发送到服务URL:
curl -X POST http://localhost:8001/services/example_service/plugins \
--data "name=proxy-cache" \
--data "config.request_method=GET" \
--data "config.response_code=200" \
--data "config.content_type=application/json" \
--data "config.cache_ttl=30" \
--data "config.strategy=memory"
路由级别
代理缓存插件可以为特定路由启用。请求与上述相同,但请求发送到路由URL:
curl -X POST http://localhost:8001/routes/example_route/plugins \
--data "name=proxy-cache" \
--data "config.request_method=GET" \
--data "config.response_code=200" \
--data "config.content_type=application/json" \
--data "config.cache_ttl=30" \
--data "config.strategy=memory"
消费者级别
在 Kong Gateway 中,消费者 是一个定义服务使用者的抽象概念。 消费者级别的代理缓存可以用于按消费者缓存响应。
创建消费者
curl -X POST http://localhost:8001/consumers/ \
--data username=sasha
启用消费者缓存
curl -X POST http://localhost:8001/consumers/sasha/plugins \
--data "name=proxy-cache" \
--data "config.request_method=GET" \
--data "config.response_code=200" \
--data "config.content_type=application/json" \
--data "config.cache_ttl=30" \
--data "config.strategy=memory"
管理缓存的实体
代理缓存插件支持管理缓存实体的管理端点。管理员可以通过向管理API发送请求来查看、删除缓存实体或清除整个缓存。
要检索缓存的实体,请向 Admin API /proxy-cache 端点提交请求,并提供已知缓存值的 X-Cache-Key 值。此请求必须在 TTL 过期之前提交,否则缓存的实体将已被清除。
例如,使用上面的响应头,将X-Cache-Key的值传递给61e325898b0f543220222417b10edd6f1730d8b534b3e0dea73719d72c1cf53c到管理API:
这里的id是缓存的id不是服务或者路由的id
curl -i http://localhost:8001/proxy-cache/61e325898b0f543220222417b10edd6f1730d8b534b3e0dea73719d72c1cf53c
响应中200 OK将包含缓存实体的全部详细信息。
HTTP/1.1 200 OK
Date: Wed, 28 May 2025 03:14:04 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
Access-Control-Allow-Origin: http://192.168.3.94:8002
X-Kong-Admin-Request-ID: b0268107684aaa682018d15ee934be10
vary: Origin
Access-Control-Allow-Credentials: true
Content-Length: 1142
X-Kong-Admin-Latency: 6
Server: kong/3.10.0.0-enterprise-edition
密钥认证
认证是验证请求者是否有权限访问咨询的过程。
常见的认证方法包括
- 密钥认证
- 基本认证
- OAuth2.0认证
- LDAP认证高级设置
- OpenID connect
认证益处
通过 Kong Gateway 、控制身份验证,除非客户端已成功进行身份验证,否则请求将不会到达上游服务。这意味着上游服务处理已预授权的请求,使其免于身份验证的开销,从而减少计算时间和开发工作量。
启用身份认证
设置消费者和密钥
Kong Gateway 的密钥认证通过使用consumer对象来实现。密钥分配给消费者,客户端应用程序在它们的请求中呈现密钥。
- 创建一个新的消费者
为了本教程的目的,请创建一个新的消费者,并设置用户名 luka:
curl -i -X POST http://localhost:8001/consumers/ \
--data username=luka
您将收到一个201响应,表示消费者已创建。
2. 为消费者分配密钥
一旦配置完成后,调用 Admin API 为新的消费者分配一个密钥。 对于本教程,将密钥值设置为top-secret-key:
curl -i -X POST http://localhost:8001/consumers/luka/key-auth \
--data key=top-secret-key
您将收到一个201响应,表示密钥已创建。
在这个例子中,你显式地将键内容设置为top-secret-key。 如果你不提供key字段,Kong Gateway将为你生成键值。
全局密钥认证
全局安装插件意味着每个对Kong Gateway的代理请求都受到密钥认证的保护。
- 启用密钥认证
Key Authentication 插件默认安装在 Kong Gateway 上,并且可以通过向 Admin API 的 plugins 对象发送 POST 请求来启用:
curl -X POST http://localhost:8001/plugins/ \
--data "name=key-auth" \
--data "config.key_names=apikey"
您将收到一个201响应,表示插件已安装。
上述请求中的key_names配置字段定义了插件在验证请求时查找以读取密钥的字段名称。插件在标头、查询字符串参数和请求体中查找该字段。
2. 发送未认证的请求
尝试在不提供密钥的情况下访问该服务:
curl -i http://localhost:8000/mock/anything
由于您全局启用了密钥认证,您将收到未经授权的响应:
HTTP/1.1 401 Unauthorized
Date: Wed, 28 May 2025 05:51:03 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
WWW-Authenticate: Key
Content-Length: 96
X-Kong-Response-Latency: 1
Server: kong/3.10.0.0-enterprise-edition
X-Kong-Request-Id: 13e6e9611d3ff236d185486cf4891e66
{
"message":"No API key found in request",
"request_id":"13e6e9611d3ff236d185486cf4891e66"
- 发送错误的密钥
curl -i http://localhost:8000/mock/anything \
-H 'apikey:bad-key'
你将收到一个未经授权的响应
{
"message":"Unauthorized",
"request_id":"af68463d61ef863c5486423c4fb18c26"
}
- 发送有效的请求
在 apikey 头中使用有效的密钥发送请求:
curl -i http://localhost:8000/mock/anything \
-H 'apikey:top-secret-key'
您将收到一个200 OK响应。
基于服务的密钥认证
密钥认证插件可以为特定服务启用。请求与上述相同,但POST请求发送到服务URL:
curl -X POST http://localhost:8001/services/example_service/plugins \
--data name=key-auth
基于路由的密钥认证
密钥认证插件可以为特定路由启用。请求与上述相同,但POST请求发送到路由URL:
curl -X POST http://localhost:8001/routes/example_route/plugins \
--data name=key-auth
禁用插件
如果你正在按顺序阅读本入门指南,你将需要在以后的所有请求中使用此 API 密钥。如果你不想继续指定该密钥,请在继续之前禁用该插件。
- 查找密钥插件id
curl -X GET http://localhost:8001/plugins/
您将收到一个包含 id 字段的 JSON 响应,类似于以下片段:
"id": "074f8512-0fac-44b8-8a1f-96f8d99fe098",
- 禁用插件
使用上面获得的插件ID来PATCH该enabled已安装的密钥认证插件中的字段。您的请求将类似于此,替换为正确的插件ID:
curl -X PATCH http://localhost:8001/plugins/75502e0c-6fd1-401d-8985-b98f7923e0aa\
--data enabled=false
- 测试禁用认证
现在您可以在不提供 API 密钥的情况下发送请求:
curl -i http://localhost:8000/mock/anything
你应该收到:
HTTP/1.1 200 OK
因为在上面步骤已经做了全局,服务,路由的3个认证,所以需要禁用三个
在管理页面可以看到
负载均衡
负载均衡是一种将API请求流量分发到多个上游流量的方法。负载均衡通过防止单个资源过载,提高系统整体响应能力和减少故障。
在以下示例中,您将使用部署在两个不同服务器上的应用程序,或上游目标。 Kong Gateway 需要在两个服务器之间进行负载均衡,以便如果其中一个服务器不可用, 它会自动检测问题并将所有流量路由到正常运行的服务器。
上游指的是位于Kong Gateway后面的服务应用,客户端请求会被转发到这些应用。在Kong Gateway 中,上游表示一个虚拟主机名,并且可以用于健康检查、断路器以及在多个目标后端服务之间负载均衡传入的请求。
在本节中,您将重新配置之前创建的服务,(example_service) 使其指向上游而不是特定主机。为了我们的示例,上游将指向两个不同的目标, httpbin.konghq.com 和 httpbun.com。更常见的目标是运行在不同主机系统上的同一后端服务的实例。
启用负载均衡
在本节中,您将创建一个名为example_upstream的上游,并向其中添加两个目标。
- 创建上游
使用 Admin API 创建一个上游名为 example_upstream:
curl -X POST http://localhost:8001/upstreams \
--data name=example_upstream
- 创建上游目标
为 example_upstream创建两个目标。每个请求都会创建一个新的目标,并设置后端服务连接端点:
curl -X POST http://localhost:8001/upstreams/example_upstream/targets \
--data target='httpbun.com:80'
curl -X POST http://localhost:8001/upstreams/example_upstream/targets \
--data target='httpbin.konghq.com:80'
- 更新服务
在服务和路由部分,您创建了example_service,它指向一个显式主机,现在您将修改该服务以指向上游:
curl -X PATCH http://localhost:8001/services/example_service \
--data host='example_upstream'
你现在有一个上游,有两个目标,httpbin.konghq.com 和 httpbun.com,以及一个指向该上游的服务。
4. 验证
通过访问路线来验证您配置的上游是否正常工作 http://localhost:8000/mock 使用网页浏览器或 CLI。
- 网页浏览器:访问 http://localhost:8000/mock 并刷新页面几次,以看到网站从 httpbin 变为 httpbun。
- CLI:执行命令curl -s http://localhost:8000/mock/headers |grep -i -A1 '"host"'多次。您将看到主机名在httpbin和httpbun之间变化。