kong网关

Posted can_chen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kong网关相关的知识,希望对你有一定的参考价值。

1. kong简介

kong网关基于nginx,但是比nginx更加强大,nginx一般用来实现反向代理和负载均衡,但是nginx无法实现动态配置,也就是说如果我们扩展了机器或者添加路由配置,需要手动修改nginx的配置文件并重启nginx才能生效。但是kong是可以实现动态配置的,如果我们在kong中注册service或者添加route,只需要调用kong的API即可,对应的会把相关配置持久化到postgresql数据库,不需要重启kong也能即时生效,实现动态配置。

另外,kong作为API网关,不仅仅能实现nginx具备的反向代理和负载均衡功能,还可以基于插件化实现更多功能,比如身份认证、请求限流、黑白名单配置等,都可以基于kong的插件非常方便的实现。网关一个最大的作用就是可以将一些通用的操作都提取到网关层来实现,让底层的后端服务只需要关注具体的业务即可。

kong虽然基于nginx,但是有些概念却和nginx略有差异,比如kong中有target、upstream、service、route几个概念。

upstream主要是和target做绑定,然后service又和upstream绑定,这样就可以实现负载均衡,比如一个upstream绑定了三台服务器,然后某个service又和这个upstream关联上,那么当请求来到service进行处理时,就会将请求均衡的分发到upstream下的多个target。

kong默认有四个端口,8000、8001、8443、8444。其中8000和8001是http请求的端口(常用);8443和8444是https请求的端口。

  • 8000/8443是外部请求访问的端口,即进行反向代理请求的端口
  • 8001/8444是kong admin的端口,即调用kong的api使用的端口

2. kong常用API

2.1. 举例

以下举例kong的常用API:
(jq命令的作用是将返回结果进行json格式化,可通过yum命令安装jq)

  1. 查看所有的upstream
 curl -XGET localhost:8001/upstreams | jq .

  "next": null,
  "data": [
    
      "hash_on_header": null,
      "name": "ApiServer",
      "algorithm": "round-robin",
      "id": "c6c38821-a08c-4c05-b282-f63c501240a0",
      "hash_on_cookie": null,
      "hash_on_cookie_path": "/",
      "host_header": null,
      "hash_fallback_header": null,
      "tags": null,
      "hash_fallback": "none",
      "healthchecks": 
        "active": 
          "https_verify_certificate": true,
          "http_path": "/",
          "https_sni": null,
          "type": "http",
          "healthy": 
            "successes": 0,
            "http_statuses": [
              200,
              302
            ],
            "interval": 0
          ,
          "unhealthy": 
            "tcp_failures": 0,
            "timeouts": 0,
            "http_failures": 0,
            "http_statuses": [
              429,
              404,
              500,
              501,
              502,
              503,
              504,
              505
            ],
            "interval": 0
          ,
          "timeout": 1,
          "concurrency": 10
        ,
        "passive": 
          "healthy": 
            "successes": 0,
            "http_statuses": [
              200,
              201,
              202,
              203,
              204,
              205,
              206,
              207,
              208,
              226,
              300,
              301,
              302,
              303,
              304,
              305,
              306,
              307,
              308
            ]
          ,
          "unhealthy": 
            "http_statuses": [
              429,
              500,
              503
            ],
            "tcp_failures": 0,
            "timeouts": 0,
            "http_failures": 0
          ,
          "type": "http"
        ,
        "threshold": 0
      ,
      "client_certificate": null,
      "hash_on": "none",
      "sl505
            ],
            "interval": 0
          ,
          "timeout": 1,
          "concurrency": 10
        ,
        "passive": 
          "healthy": 
            "successes": 0,
            "http_statuses": [
              200,
              201,
              202,
              203,
              204,
              205,
              206,
              207,
              208,
              226,
              300,
              301,
              302,
              303,
              304,
              305,
              306,
              307,
              308
            ]
          ,
          "unhealthy": 
            "http_statuses": [
              429,
              500,
              503
            ],
            "tcp_failures": 0,
            "timeouts": 0,
            "http_failures": 0
          ,
          "type": "http"
        ,
        "threshold": 0
      ,
      "client_certificate": null,
      "hash_on": "none",
      "slots": 10000,
      "created_at": 1660789714
    
  ]


  1. 查看某个upstream下关联的target
curl -XGET localhost:8001/upstreams/c6c38821-a08c-4c05-b282-f63c501240a0/targets | jq .

  "next": null,
  "data": [
    
      "id": "7d57a020-cec7-49c8-9dc6-387532e98c22",
      "tags": null,
      "target": "192.168.1.1:8080",
      "created_at": 1666681580.184,
      "upstream": 
        "id": "c6c38821-a08c-4c05-b282-f63c501240a0"
      ,
      "weight": 100
    ,
    
      "id": "a64e44c2-50fe-49cb-8cc9-6df0265dd2e6",
      "tags": null,
      "target": "192.168.1.2:8080",
      "created_at": 1660789905.537,
      "upstream": 
        "id": "c6c38821-a08c-4c05-b282-f63c501240a0"
      ,
      "weight": 100
    ,
    
      "id": "4f0f77d6-31cb-4f29-ae93-0f15c443d507",
      "tags": null,
      "target": "192.168.1.3:8080",
      "created_at": 1660789812.133,
      "upstream": 
        "id": "c6c38821-a08c-4c05-b282-f63c501240a0"
      ,
      "weight": 100
    
  ]

  1. 查看所有service
curl -XGET localhost:8001/services | jq .

  "next": null,
  "data": [
    
      "connect_timeout": 10000,
      "tls_verify": null,
      "read_timeout": 10000,
      "name": "CA70B82CCB4E4BE494AC8E3DA6A17084",
      "tags": null,
      "ca_certificates": null,
      "created_at": 1668656595,
      "updated_at": 1668656595,
      "protocol": "http",
      "port": 80,
      "id": "a976b162-1c1f-4200-b2c4-357ab6ece8e6",
      "client_certificate": null,
      "host": "ApiServer",
      "path": "/dataservice/customize/api",
      "write_timeout": 10000,
      "retries": 5,
      "tls_verify_depth": null
    
  ]

  1. 查看某个service信息
curl -XGET localhost:8001/services/a976b162-1c1f-4200-b2c4-357ab6ece8e6 | jq .

  "connect_timeout": 10000,
  "tls_verify": null,
  "read_timeout": 10000,
  "name": "CA70B82CCB4E4BE494AC8E3DA6A17084",
  "tags": null,
  "ca_certificates": null,
  "created_at": 1668656595,
  "updated_at": 1668656595,
  "protocol": "http",
  "port": 80,
  "id": "a976b162-1c1f-4200-b2c4-357ab6ece8e6",
  "client_certificate": null,
  "host": "ApiServer",
  "path": "/dataservice/customize/api",
  "write_timeout": 10000,
  "retries": 5,
  "tls_verify_depth": null

  1. 查看所有route
curl -XGET localhost:8001/routes | jq .

  "next": null,
  "data": [
    
      "protocols": [
        "http",
        "https"
      ],
      "name": "CA70B82CCB4E4BE494AC8E3DA6A17084",
      "snis": null,
      "tags": null,
      "request_buffering": true,
      "response_buffering": true,
      "created_at": 1668656595,
      "updated_at": 1668656595,
      "sources": null,
      "preserve_host": false,
      "destinations": null,
      "strip_path": false,
      "methods": [
        "GET"
      ],
      "id": "dfb4baec-aaa5-4463-992c-fa45bc3c68f4",
      "path_handling": "v0",
      "headers": 
        "API-ID": [
          "CA70B82CCB4E4BE494AC8E3DA6A17084"
        ]
      ,
      "https_redirect_status_code": 426,
      "regex_priority": 0,
      "paths": [
        "/test1"
      ],
      "hosts": null,
      "service": 
        "id": "a976b162-1c1f-4200-b2c4-357ab6ece8e6"
      
    
  ]

  1. 查看某个route信息
curl -XGET localhost:8001/routes/dfb4baec-aaa5-4463-992c-fa45bc3c68f4 | jq .

  "protocols": [
    "http",
    "https"
  ],
  "name": "CA70B82CCB4E4BE494AC8E3DA6A17084",
  "snis": null,
  "tags": null,
  "request_buffering": true,
  "response_buffering": true,
  "created_at": 1668656595,
  "updated_at": 1668656595,
  "sources": null,
  "preserve_host": false,
  "destinations": null,
  "strip_path": false,
  "methods": [
    "GET"
  ],
  "id": "dfb4baec-aaa5-4463-992c-fa45bc3c68f4",
  "path_handling": "v0",
  "headers": 
    "API-ID": [
      "CA70B82CCB4E4BE494AC8E3DA6A17084"
    ]
  ,
  "https_redirect_status_code": 426,
  "regex_priority": 0,
  "paths": [
    "/test1"
  ],
  "hosts": null,
  "service": 
    "id": "a976b162-1c1f-4200-b2c4-357ab6ece8e6"
  

kong网关对于每个请求的处理逻辑是:

基于上述kong命令示例查询出来的关于target、upstream、service、route信息理解kong处理请求的过程。假设现在调用一个请求是:http://localhost:8080/test1,那么首先会根据/test1(route)找到对应的service,即id为a976b162-1c1f-4200-b2c4-357ab6ece8e6的service,由于该service的path还指定了"/dataservice/customize/api",所以请求地址变成:/dataservice/customize/api/test1,然后再根据service绑定的upstream,即ApiServer,找到ApiServer这个upstream绑定的target,对应到后端服务是有三台服务器的,可以实现负载均衡,所以经过kong代理之后的实际请求地址变成http://192.168.1.1:8080/dataservice/customize/api/test1,会由192.168.1.1这台服务器的后端服务进行处理,当然也可能是192.168.1.2192.168.1.3这两台机器。

2.2. GET请求相关API(查看服务、查看路由等)

# 1. 查看所有的upstream
curl -XGET localhost:8001/upstreams

# 2. 查看某个upstream下关联的target
curl -XGET localhost:8001/upstreams/UPSTREAM_ID/targets

# 3. 查看所有service
curl -XGET localhost:8001/services

# 4. 查看某个service详细信息
curl -XGET localhost:8001/services/SERVICE_ID

# 5. 查看所有route
curl -XGET localhost:8001/routes

# 6. 查看某个route详细信息
curl -XGET localhost:8001/routes/ROUTE_ID

# 7. 查看已添加的kong插件
curl -XGET localhost:8001/plugins

# 8. 查看所有消费者
curl -XGET localhost:8001/consumers

# 9. 查看某个消费者详细信息
curl -XGET localhost:8001/consumers/CONSUMER_ID

2.3. POST请求相关API(添加服务、注册路由等)

# 1. 创建upstream
curl -X POST localhost:8001/upstreams --data "name=test-upstream"

# 2. 给某个upstream绑定多个target
curl -X POST localhost:8001/upstreams/test-upstream/targets --data "target=192.168.1.1:8080" --data "weight=100"
curl -X POST localhost:8001/upstreams/test-upstream/targets --data "target=192.168.1.2:8080" --data "weight=100"

# 3. 添加service,并且指定该service关联的target(path参数可选)
curl -X POST localhost:8001/services --data "name=test-service" --data "host=test-upstream" --data "path=/pms"

# 4. 注册route到某个service下
curl -X POST localhost:8001/services/test-service/routes --data "name=test-route" --data "paths[]=/test1"

3. kong添加官方插件

kong官方提供了丰富的插件,基于插件可以实现很多网关层的功能,例如身份认证、请求限流、黑白名单配置等。都可以基于kong的插件快速的实现。
kong插件的作用粒度可以是service、route、consumer或者全局生效。

关于kong官方提供的插件可参考官网:https://docs.konghq.com/hub/

3.1. 配置Basic Auth插件

Basic Auth插件是官方提供的身份认证插件,插件的作用粒度可以是service、route或者全局;即可以配置访问某个service/某个route或者经过kong代理的所有请求都需要进行身份认证。
配置Basic Auth插件可参考官方文档:https://docs.konghq.com/hub/kong-inc/basic-auth/

主要包含以下几个步骤:

  1. 为service/route/全局添加Basic Auth插件
    注意:插件的名称需要从官网的插件库中获取
# 在service上配置插件
curl -X POST http://localhost:8001/services/SERVICE_NAME|SERVICE_ID/plugins \\
    --data "name=basic-auth"  \\
    --data "config.hide_credentials=true"
    
# 在route上配置插件
curl -X POST http://localhost:8001/routes/ROUTE_NAME|ROUTE_ID/plugins \\
  --data "name=basic-auth"  \\
  --data "config.hide_credentials=true"
    
# 在全局上配置插件
curl -X POST http://localhost:8001/plugins/ \\
  --data "name=basic-auth"  \\
  --data "config.hide_credentials=true"
  1. 创建一个消费者
 curl -i -X POST http://localhost:8001/consumers/ \\
   --data "username=Jason"
  1. 在该消费者下创建用户
curl -X POST http://localhost:8001/consumers/Jason/basic-auth \\
  --data "username=test" \\
  --data "password=123456"
  1. 配置完成后,调用相关的API需要带上用户名密码或者在请求头加上Authorization参数

4. kong添加自定义插件

安装kong之后,系统会自带一些内置插件,插件的路径在/usr/local/share/lua/5.1/kong/plugins目录下,每个插件是一个单独的文件夹,插件的开发都是基于lua语言编写实现的。

如果官方的插件不满足我们的需求,我们还可以自己开发插件,自己开发的插件主要就是实现两个脚本,handler.lua和schema.lua,然后放到一个文件夹(文件夹的命名就是自定义插件的名称),并拷贝到/usr/local/share/lua/5.1/kong/plugins目录下,最后调用kong的API将自开发的插件添加到对应的service或者route即可。

自定义插件的开发可以参考官网:https://docs.konghq.com/gateway/latest/plugin-development/

补充关于正向代理和反向代理的区别:

  • 正向代理:对于客户端来说是已知的,对于服务端是透明的。
  • 反向代理:对于服务端来说是已知的,对于客户端是透明的。例如nginx,比如我们访问百度,百度后台是有很多台服务器的,但是对于客户端来说只需要访问www.baidu.com这个地址,然后由nginx帮我们代理到对应的某台百度服务器上,对于服务端来说是可知的,但是对于客户端来说是透明的,客户端只知道请求了百度的地址,不知道具体的请求是被哪台百度服务器处理。

centOS 7 单机安装 kong网关

kong 网关 单机部署

环境:centOS 7;依赖:jdk1.8

安装内容:postgresql数据库, kong 网关,nodeJs和npm,kong Dashboard (可视化管理界面)

版本:postgresql10,kong1.4.0,npm v8.1.0

本次重点主要为后续学习掌握kong配置使用,所以本次安装主要使用yum在线安装。

 


 

一、依赖包安装(若存在则不需再次安装)

1,gcc 编译环境

$ yum install -y gcc gcc-c++

2,pcre 用于nginx正则表达式解析(kong网关内部依赖nginx)

$ yum install -y pcre pcre-devel

3,zlib 提供压缩方式

$ yum install -y zlib zlib-devel

4,openssl 提供算法、加密及ssl功能

$ yum install -y openssl openssl-deve

二、postgreSQL 安装

kong默认使用postgreSQL存储

1,安装

 (1)$ yum install -y https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-latest-x86_64/pgdg-centos10-10-2.noarch.rpm

 (2)$ yum install -y postgresql10-server postgresql10-contrib

 

2,数据库初始化

$ /usr/pgsql-10/bin/postgresql-10-setup initdb

初始化完成后,系统会自动生成(1)Linux用户 postgres 用于管理postgreSQL数据库;(2)postgreSQL数据库用户postgres;(3)postgreSQL数据库实例postgres,postgres用户默认使用该实例。

注意生成得Linux用户postgres用户为默认密码,建重新修改设定

[root@bogon ~]# passwd postgres
Changing password for user postgres.
New password:

3,服务启动

$ systemctl start postgresql-10.service

4,状态查询

$ systemctl status postgresql-10.service

5,postgreSQL数据库配置

为了后续使用方便kong网关使用,建议配置linux用户kong,postgreSQL数据库实例kong及所属用户kong。

(1) 新建 Linux 用户

$ adduser kong

$ passwd kong

(2) postgreSQL配置

需使用管理员用户(postgres)登陆创建用户和数据库实例

[root@bogon ~]# su postgres
bash-4.2$

输入 psql ,进入数据库

bash-4.2$ psql

postgres=#

至此就进入了postgreSQL的命令界面

创建用户:postgres=# create user kong with password ‘kong‘;

创建数据库:postgres=# create database kong owner kong;

授权:postgres=# grant all privileges on database kong to kong;

配置完成,退出

postgres=# q
bash-4.2$ exit;
exit
[root@bogon ~]#

 

(3) 配置文件

修改对外访问策略

vi  /var/lib/pgsql/10/data/pg_hba.conf

技术图片
添加上最后一行即可
# TYPE  DATABASE        USER            ADDRESS                 METHOD
 host    all             all           all             trust

使用trust不需要密码

配置文件修改后需重启服务:$ systemctl restart postgresql-10.service

重启后验证: $ psql -U kong -d kong -h 127.0.0.1 -p 5432

技术图片

 

三、Kong 安装

官网下载rpm包:https://docs.konghq.com/install/centos/

根据系统选择对应版本,我使用的是centOS 7,选择 kong-1.4.0.el7.amd64.rpm

新建kong文件夹,将rpm文件传到Linux服务器上。然后执行安装命令

$ yum install  kong-1.4.0.el7.amd64.rpm

修改配置文件(安装后会产生一个kong.conf.default文件,稍作修改即可)

$ cp /etc/kong/kong.conf.default /etc/kong/kong.conf

去掉注释符(#)并根据当前环境修改(我们配置的是单机,要将pg_host改成127.0.0.1)

将之前配置的信息修改填入即可

技术图片

完成后下一步初始化数据库表

kong migrations up -c  /etc/kong/kong.conf

安装如果出现报错,请参考:如果kong版本低于0.15时,kong migrations bootstrap应改为kong migrations up,>=0.15时使用 bootstrap

可将kong migrations up -c  /etc/kong/kong.conf 改为 kong migrations bootstrap -c  /etc/kong/kong.conf 再试。

我安装的版本使用的 是 kong migrations bootstrap -c  /etc/kong/kong.conf  命令。

下一步启动kong服务:kong start

验证:curl 127.0.0.1:8001

若正常会返回一些信息:

技术图片

 

四、nodeJs (安装时间会比较长)

1、wget http://nodejs.org/dist/v8.1.0/node-v8.1.0.tar.gz 

2、yum install gcc openssl-devel gcc-c++ compat-gcc-34 compat-gcc-34-c++

我在安装此步骤中出现报错,提示no packing compat-gcc-34 compat-gcc-34-c++。然后通过rpm包进行了安装

下载地址:http://www.rpmfind.net/linux/rpm2html/search.php?query=compat-gcc&submit=Search+...&system=centOS+7&arch=

下载:compat-gcc-44-4.4.7-8.el7.x86_64.rpm  ,compat-gcc-44-c++-4.4.7-8.el7.x86_64.rpm

rpm -vh compat-gcc-44-4.4.7-8.el7.x86_64.rpm 

rpm -vh compat-gcc-44-c++-4.4.7-8.el7.x86_64.rpm

以上结束后解压tar包,进行配置安装

 

tar -xf node-v7.4.0.tar.gz

 

cd node-v7.4.0

 

./configure --prefix=/usr/local/node

 

make && make install(该步骤时间很长)

 

ln -s /usr/local/node/bin/* /usr/sbin/

 

npm 配置

 

npm set prefix /usr/local
echo -e ‘ export PATH=/usr/local/lib/node_modules:$PATH‘ >> ~/.bashrc
source ~/.bashrc

五、kong Dashboard

 

npm install -g kong-dashboard

 

npm安装时会出现rollbackFailedOptional报错,解决办法:

[root@bogon /]# npm config rm proxy
[root@bogon /]# npm config rm https-proxy
[root@bogon /]# npm install -g cnpm --registry=https://registry.npm.taobao.org

 

开启服务,指定端口号(自己定义)。后续访问通过该端口号

 

kong-dashboard start --kong-url http://localhost:8001 --port 9001

 

 

 

技术图片

 

 

 

访问:http://192.168.60.129:9001/

 

 

 

技术图片

 

至此所有安装完成


人生在世,杂事七八;饭要少吃,事要多知;抽个时间,总结一下;乐在分享,自在提升 

以上是关于kong网关的主要内容,如果未能解决你的问题,请参考以下文章

kong网关怎么获取etcd端口

使用 Kong 和 Nginx 部署 Api 网关

30分钟通过Kong实现.NET网关

Kong网关之Lua-Nginx-Module指令介绍

API网关之Kong简介

API网关——Kong实践分享