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 上,则称为社区或第三方插件。

kong网关使用mysql_云原生

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 访问并创建基本用户

kong网关使用mysql_docker_02


kong网关使用mysql_kong_03

3.4 Konga连接Kong配置

konga只是一个图形化界面,所以还需要配置链接到kong,才能进行数据展示和后续的相关操作

kong网关使用mysql_云原生_04


kong网关使用mysql_云原生_05

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

kong网关使用mysql_lua_06


kong网关使用mysql_kong_07

5.2 配置service

kong网关使用mysql_docker_08

kong网关使用mysql_kong网关使用mysql_09


kong网关使用mysql_kong网关使用mysql_10


相关配置介绍

属性

描述

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 配置路由

kong网关使用mysql_docker_11


kong网关使用mysql_kong_12


kong网关使用mysql_kong_13


kong网关使用mysql_kong网关使用mysql_14


kong网关使用mysql_lua_15


kong网关使用mysql_kong网关使用mysql_16

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配置就行

kong网关使用mysql_云原生_17

5.4 访问测试

kong网关使用mysql_kong网关使用mysql_18

6. 配置实践:配置upstream,让kong代理请求到后端服务器组

这里的配置都是建立在上面的配置基础上的

6.1 配置upstream

kong网关使用mysql_kong网关使用mysql_19


kong网关使用mysql_kong_20


kong网关使用mysql_docker_21


kong网关使用mysql_kong网关使用mysql_22

6.2 配置目标主机

kong网关使用mysql_lua_23


kong网关使用mysql_docker_24


kong网关使用mysql_docker_25


kong网关使用mysql_docker_26


kong网关使用mysql_kong_27


kong网关使用mysql_kong_28

6.3 配置service

kong网关使用mysql_kong_29


kong网关使用mysql_云原生_30


kong网关使用mysql_lua_31

6.4 访问测试

kong网关使用mysql_lua_32


kong网关使用mysql_kong_33

6.5 理解方式

kong网关使用mysql_lua_34

7. 配置实践:配置插件key-auth向api添加密钥身份验证

这里的配置也是基于上面配置完成后的操作

7.1 添加一个key auth

kong网关使用mysql_lua_35


kong网关使用mysql_kong网关使用mysql_36


kong网关使用mysql_kong网关使用mysql_37


kong网关使用mysql_docker_38

7.2 创建consumers

kong网关使用mysql_云原生_39


kong网关使用mysql_lua_40


kong网关使用mysql_云原生_41


kong网关使用mysql_kong网关使用mysql_42

7.3 访问测试

7.3.1 不加key访问

kong网关使用mysql_kong_43

7.3.2 加key访问

kong网关使用mysql_kong网关使用mysql_44


kong网关使用mysql_云原生_45

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

kong网关使用mysql_kong网关使用mysql_46


kong网关使用mysql_kong_47

8.2 配置upstream

kong网关使用mysql_docker_48


kong网关使用mysql_kong网关使用mysql_49

8.3 修改services配置

kong网关使用mysql_docker_50

8.4 获取service ID

8.4.1 方式1:在konga图形化界面获取

kong网关使用mysql_lua_51

8.4.2 方式2:通过kong的api获取

kong网关使用mysql_lua_52

8.5 创建一个只对某个路由生效的auth key

8.5.1 创建指定service.id的auth key

konga不支持这中key的创建,所以必须通过kong api创建

kong网关使用mysql_kong_53


kong网关使用mysql_docker_54

8.6 访问测试

这个时候,再用之前的全局key就不行了

kong网关使用mysql_docker_55


使用指定key访问
这里的value是通用的,所以不用重新设置

kong网关使用mysql_kong_56