1. 简介
官网:https://docs.konghq.com/gateway/3.2.x/
Kong Gateway是一个轻量级、快速、灵活的云原生API网关。
API网关是一个反向代理,它允许您管理、配置和路由到API的请求。
Kong Gateway运行在任何RESTful API之前,并且可以通过模块和插件进行扩展。它旨在运行在分散的架构上,包括混合云和多云部署。
2. 扩展知识
2.1 运行方式
Kong Gateway 是一个运行在 Nginx 中的 Lua 应用程序。Kong Gateway 与OpenResty一起分发,OpenResty 是一组扩展lua-nginx-module 的模块。
这为模块化架构奠定了基础,插件可以在运行时启用和执行。Kong Gateway 的核心是实现数据库抽象、路由和插件管理。插件可以存在于单独的代码库中,并可以注入到请求生命周期的任何地方,只需几行代码。
Kong 提供了许多插件供您在网关部署中使用。您还可以创建自己的自定义插件。有关详细信息,请参阅 插件开发指南、PDK 参考以及使用其他语言( JavaScript、Go和Python )创建插件的指南。
2.2 Konga
Konga不是官方应用程序,并且和Kong没有隶属关系。
官网:https://github.com/pantsel/konga
2.2.1 介绍
Konga是一款基于Kong Admin API的GUI图形化管理界面。
2.2.2 特征
(1)管理所有 Kong Admin API 对象。
(2)从远程源(数据库、文件、API 等)导入消费者。
(3)管理多个 Kong 节点。
(4)使用快照备份、恢复和迁移 Kong 节点。
(5)使用健康检查监控节点和 API 状态。
(6)电子邮件和 Slack 通知。
(7)多个用户。
(8)简单的数据库集成(MySQL、postgresSQL、MongoDB)。
2.3 Kong插件
2.3.1 什么是插件
Kong Gateway 是一个 Lua 应用程序,旨在加载和执行 Lua 或 Go 模块,我们通常称之为插件。Kong 提供了一组与 Kong Gateway 捆绑在一起的标准 Lua 插件。您有权访问的插件集取决于您的安装:开源、企业或在 Kubernetes 上运行的这些 Kong Gateway 选项之一。
自定义插件也可以由 Kong 社区开发,并由插件创建者支持和维护。如果它们发布在 Kong Plugin Hub 上,则称为社区或第三方插件。
3. docker-compose部署kong和konga
3.1 准备yaml
[root@k8s-harbor01 docker-compose]# cat docker-compose.yaml
version: '3'
services:
kong-database:
image: postgres:9.6
restart: always #每次总是启动
networks:
- kong-net
environment:
POSTGRES_USER: kong
POSTGRES_DB: kong
POSTGRES_PASSWORD: kong
ports:
- "5432:5432"
#######################
# 执行数据库迁移
######################
kong-migration:
image: kong:2.5.1-centos
command: "kong migrations bootstrap"
networks:
- kong-net
restart: on-failure
environment:
- KONG_DATABASE=postgres
- KONG_PG_DATABASE=kong
- KONG_PG_PASSWORD=kong
- KONG_PG_HOST=kong-database
links:
- kong-database #连接的是kong-database服务的
depends_on:
- kong-database #依赖于kong-database服务
#####################
# kong gateway
#####################
kong:
image: kong:2.5.1-centos
restart: always
networks:
- kong-net
environment:
KONG_DATABASE: postgres
KONG_PG_HOST: kong-database
KONG_PG_PASSWORD: kong
KONG_PROXY_LISTEN: 0.0.0.0:8000
KONG_PROXY_LISTEN_SSL: 0.0.0.0:8443
KONG_ADMIN_LISTEN: 0.0.0.0:8001
depends_on:
- kong-migration
links:
- kong-database
healthcheck:
test: ["CMD", "curl", "-f", "http://kong:8001"]
interval: 5s
timeout: 2s
retries: 15
ports:
- "8001:8001"
- "8000:8000"
- "8443:8443"
#######################
#以下两个是konga GUI
#######################
konga-prepare:
image: pantsel/konga:0.14.9
command: "-c prepare -a postgres -u postgresql://kong:kong@kong-database:5432/konga" #注意是用户名:密码@数据库服务名称:端口
networks:
- kong-net
restart: on-failure
links:
- kong-database
depends_on:
- kong #依赖kong服务
- kong-database #依赖kong-database服务
konga:
image: pantsel/konga:0.14.9
restart: always
networks:
- kong-net
environment:
DB_ADAPTER: postgres
DB_HOST: kong-database
DB_USER: kong
DB_DATABASE: konga
DB_PASSWORD: kong #必须加上密码,不然会失败
depends_on:
- kong
- kong-database
ports:
- "1337:1337"
networks:
kong-net:
driver: bridge
3.2 部署
[root@k8s-harbor01 docker-compose]# docker-compose up -d
[root@k8s-harbor01 docker-compose]# docker-compose ps -a
Name Command State Ports
------------------------------------------------------------------------------------------------------------------------------------------------
docker-compose_kong-database_1 docker-entrypoint.sh postgres Up 0.0.0.0:5432->5432/tcp,:::5432->5432/tcp
docker-compose_kong-migration_1 /docker-entrypoint.sh kong ... Exit 0
docker-compose_kong_1 /docker-entrypoint.sh kong ... Up (healthy) 0.0.0.0:8000->8000/tcp,:::8000->8000/tcp,
0.0.0.0:8001->8001/tcp,:::8001->8001/tcp,
0.0.0.0:8443->8443/tcp,:::8443->8443/tcp, 8444/tcp
docker-compose_konga-prepare_1 /app/start.sh -c prepare - ... Exit 0
docker-compose_konga_1 /app/start.sh Up 0.0.0.0:1337->1337/tcp,:::1337->1337/tcp
3.3 访问并创建基本用户
3.4 Konga连接Kong配置
konga只是一个图形化界面,所以还需要配置链接到kong,才能进行数据展示和后续的相关操作
4. 常用配置介绍
我是把这个东西当成了一个nginx,方便理解
(1)services:配置要被转发的域名和地址(我们启动的后端服务,这里我自己理解成nginx中的proxy_pass)
(2)routes:配置转发到的域名和地址(我们前端要访问的地址,这里我理解成nginx中的location)
(3)consumers:kong的用户管理,可以创建用户
(4)plugins:kong的插件。
(5)cwetificates:域名的证书,https肯定有证书吧,配置在这
(6)upstreams:负载均衡(跟nginx中的upstreams一个道理)
5. 配置实践:配置service和route让kong代理请求到后端服务
5.1 后端服务准备
这里我随便启动了2个nginx,页面不同,方便识别
[root@k8s-harbor01 docker-compose]# docker ps |egrep '8888|9999'
14ade1ab7e14 10.31.200.104/myserver/nginx "/docker-entrypoint.…" 40 hours ago Up 40 hours 0.0.0.0:9999->80/tcp, :::9999->80/tcp xts-nginx-1
5bfd19e1bd28 10.31.200.104/myserver/nginx "/docker-entrypoint.…" 41 hours ago Up 41 hours 0.0.0.0:8888->80/tcp, :::8888->80/tcp
5.2 配置service
相关配置介绍
属性 | 描述 |
name(必填) | 服务名称 |
tags(可选) | 给服务添加标记 |
url(可选) | 将协议、主机、端口和路径立即设置成简短的属性,这个属性是只写的(admin api从来不“返回”url) |
protocol(必填) | 该协议用于与upstream通信。可以是http(默认)或https |
host(必填) | 后端服务的IP地址,或者upstream名称 |
port(必填) | 端口,对应上面的host |
path(可选) | 向host发起请求时使用请求的路径,默认为空 |
retries(可选) | 在代理失败的情况下,执行的重试次数,默认为5 |
connect_timeout(可选) | 与上游服务器(host)建立连接的超时(以毫秒为单位)。默认为60000(1分钟)。 |
write_timeout(可选) | 两个连续写操作之间的超时(以毫秒为单位),用于向上游服务器(host)发送请求。默认为60000 |
read_timeout(可选) | 两个连续读操作之间的超时(以毫秒为单位),用于向上游服务器(host)发送请求。默认为60000 |
client_certificate(可选) | 与上游服务器(host)进行TLS握手时用作客户端证书的证书(id)。 |
5.3 配置路由
5.3.1 配置路由
5.3.2 路由配置参数说明
属性 | 描述 |
name(可选) | 定义名称 |
tags(可选) | 向路由添加标签 |
host(半可选) | 匹配此路由的域名列表。例如:example.com。必须设置主机、路径或方法中的至少一个。 |
paths(半可选) | 匹配此路由的路径列表。例如:/my-path。必须设置主机、路径或方法中的至少一个。 |
headers(半可选) | 一个或多个由报头名称索引的值列表,如果在请求中存在,将导致此路由匹配。Host头不能与此属性一起使用:hosts应该使用hosts属性指定。 字段值格式示例:x-some-header:foo,bar |
Https redirect status code(可选) | 当Route的所有属性都匹配,除了协议,即如果请求的协议是HTTP而不是HTTPS时,Kong响应的状态码。如果字段设置为301、302、307或308,Kong将注入位置标头。默认为426。 |
Regex priority(可选) | 当多个路由同时使用正则表达式匹配时,用于选择哪条路由解析给定请求的一个数字。当两个路由匹配路径并且具有相同的regex_priority时,将使用较旧的路由(最低的created_at)。注意,非正则表达式路由的优先级是不同的(较长的非正则表达式路由在较短的路由之前被匹配)。默认为0。 |
Methods(半可选) | 匹配此路由的HTTP方法列表。必须设置主机、路径或方法中的至少一个。如GET、POST |
Strip Path(可选) | 当通过其中一个路径匹配Route时,从上游请求URL中去掉匹配的前缀。(默认开启) |
Preserve Host(可选) | 当通过其中一个主机域名匹配路由时,在上游请求头中使用请求主机头。默认设置为false,上游主机报头将是服务主机的报头 |
Protocols(半可选) | 此路由应允许的协议列表。默认情况下,它是[“http”, “http”],这意味着路由接受两者。当设置为[" HTTPS "]时,响应HTTP请求,请求升级到HTTPS。 |
SNIs(半可选) | 使用流路由时匹配此路由的sni列表。当使用tcp或tls协议时,必须设置snis、source或destination中的至少一个。 |
Sources(半可选) | 使用流路由时匹配此路由的传入连接的IP源列表。每个条目都是一个带有字段“ip”(可选的CIDR范围表示法)和/或“port”的对象。当使用tcp或tls协议时,必须设置snis、source或destination中的至少一个。 该字段需要ip:port格式的值。例:192.168.1.2:3000 |
Destinations(半可选) | 使用流路由时匹配此路由的传入连接的IP目的地列表。每个条目都是一个带有字段“ip”(可选的CIDR范围表示法)和/或“port”的对象。当使用tcp或tls协议时,必须设置snis、source或destination中的至少一个。 该字段需要ip:port格式的值。例:192.168.1.2:3000 |
5.3.3 怎么理解
上面的操作全部当成在改nginx配置就行
5.4 访问测试
6. 配置实践:配置upstream,让kong代理请求到后端服务器组
这里的配置都是建立在上面的配置基础上的
6.1 配置upstream
6.2 配置目标主机
6.3 配置service
6.4 访问测试
6.5 理解方式
7. 配置实践:配置插件key-auth向api添加密钥身份验证
这里的配置也是基于上面配置完成后的操作
7.1 添加一个key auth
7.2 创建consumers
7.3 访问测试
7.3.1 不加key访问
7.3.2 加key访问
8. 插件部分生效
官网接口文档:https://docs.konghq.com/gateway/latest/admin-api/#debug-routes/
通过上述UI配置的插件的生效范围都是全局生效的,当然一般我们一个网关可能代理了N个service的入口,如果插件的生效范围只是全局基本上就限制了使用范围,当然kong的设计者考虑的比较周到,是否全局都可,但是此时的konga并没有支持部分生效的UI配置,所以我们只能通过使用官方管理API的方式来创建只对于某个service生效的插件,首先我们需要获取service的ID,接口调用方法都在上面的链接里。
8.1 创建一个新的service和route
8.2 配置upstream
8.3 修改services配置
8.4 获取service ID
8.4.1 方式1:在konga图形化界面获取
8.4.2 方式2:通过kong的api获取
8.5 创建一个只对某个路由生效的auth key
8.5.1 创建指定service.id的auth key
konga不支持这中key的创建,所以必须通过kong api创建
8.6 访问测试
这个时候,再用之前的全局key就不行了
使用指定key访问
这里的value是通用的,所以不用重新设置