版本说明
本次学习安装kong在2.1.4版本,konga版本0.14.9
此文档地址获取地址: https://gitee.com/PengFei-io/introduction-and-use-of-kong.git
一、简介
Kong是由Mashape公司开源的可扩展的Api GateWay项目。它运行在调用Api之前,以插件的扩展方式为Api提供了管理。比如,鉴权、限流、监控、健康检查等,Kong是基于lua语言、nginx以及openResty开发的,所有拥有动态路由、负载均衡、高可用、高性能、熔断(基于健康检查)等。Kong提供了许多开箱即用的插件,用户也可以自定义规则使用lua开发插件。
Kong 是在客户端和(微)服务间转发API通信的API网关,通过插件扩展功能。Kong 有两个主要组件:
1、Kong Server :基于nginx的服务器,用来接收 API 请求。
2、Apache Cassandra or Postgresql:用来存储操作数据。
你可以通过增加更多 Kong Server 机器对 Kong 服务进行水平扩展,通过前置的负载均衡器向这些机器分发请求。根据文档描述,两个Cassandra节点就足以支撑绝大多数情况,但如果网络非常拥挤,可以考虑适当增加更多节点。
对于开源社区来说,Kong 中最诱人的一个特性是可以通过插件扩展已有功能,这些插件在 API 请求响应循环的生命周期中被执行。插件使用 Lua 编写,而且Kong还有如下几个基础功能:HTTP 基本认证、密钥认证、CORS( Cross-origin Resource Sharing,跨域资源共享)、TCP、UDP、文件日志、API 请求限流、请求转发以及 nginx 监控。
Kong可运行在某些 Linux 发行版、Mac OS X 和 Docker 中,无论是本地机还是云端服务器皆可运行。
除了免费的开源版本,Mashape 还提供了付费的企业版,其中包括技术支持、使用培训服务以及 API 分析插件。
OpenResty解决的是高并发的痛点。现在服务的后台大部分是java写的,但是用java写出稳定的高并发服务是很复杂的一件事,首先是服务器的选择,web服务器有几个选型,tomcat,apache,weblogic,还有商用webphere. 1、tomcat官方宣称的并发量是1000,厉害点的做点参数调优,也不过3000并发,如果要开发一个并发百万的服务,1000000/3000,需要1000台服务器,想想都不可能。 2、apache的并发比tomcat更不堪,200-300 3、weblogic的并发稍好,平均能达到3000左右,但是也没有达到好一个数量级
但是nginx就不一样了,处理几万的请求很轻松,内存占用也不高,之前我们只是把它用作负载均衡,没想过当做一个web服务器,OpenResty的出现解决了享受nginx高并发优势的拦路虎,因为nginx是使用异步 事件模型,跟传统的编程思想不一样,而lua是用c解释执行的脚本语言(执行效率很高),可以用传统的同步编程思想上,在nginx请求接进来后处理稍复杂的逻辑。
对于高并发的系统来说,都是基于内存的,或者说是基于缓存的,题主说的用mysql支撑高并发是不现实的,mysql的并发量在4000-8000,超过这个量mysql性能就会急剧下降。一次内存读取的时间是几十纳秒,一次缓存读取是几毫秒,大家可能对纳秒比较陌生,一纳秒等于1秒的1000000000分之一,一毫秒等于1秒的1000分之一,请求过来之后直接走内存读取,在需要和数据库交互的时候把数据写入内存,然后再批量入库,快速响应。
web流量也符合二八原则,百分之八十的流量集中在百分之二十的页面,比如电商的首页,产品详情页,使用openResty支撑产品详情页的高并发访问,在处理订购单,购物车等环节用其他的高并发框架处理,比如java的NIO网络框架netty。
java的netty也是处理高并发的利器,不过我做过测试,整体性能可以达到nginx的80%,所以,脏活累活都让nginx做吧,关键业务用netty。
当然,每个人对高并发的理解可能不太一样,有人说1000并发就是高并发了,有人说1万的并发才是高并发,有人说并发百万才是高并发,OpenResty是可以做到百万并发的(当然需要各种调优),现在大部分业务OpenResty都可以胜任,但是像腾讯10亿用户,1亿的并发,OpenResty就搞不定了。
不同的并发量要应对的东西不一样,比如1000并发,用tomcat,springmvc框架加缓存就可以应对,1万的并发在关键节点使用内存处理也很容易,百万并发就需要linux内核调优,socket缓冲区,文件句柄数,内存池,RPS/RFS SMP等优化也可以达到。千万并发就需要考虑用户态协议dpdk了
二、使用k8s部署kong
前置准备
1.k8s环境,Kong完全兼容k8s环境的部署与安装
2.使用相关资源清单进行部署
使用以下三种方式安装Kong
1.资源清单部署,相关yaml文件 可在 https://gitee.com/PengFei-io/introduction-and-use-of-kong.git
中找到
2.Helm方式部署
$ helm repo add kong https://charts.konghq.com
$ helm repo update
# Helm 2
$ helm install kong/kong
# Helm 3
$ helm install kong/kong --generate-name --set ingressController.installCRDs=false
官网链接
: https://charts.konghq.com/
3.Kustomize方式部署
kustomize build github.com/kong/kubernetes-ingress-controller/deploy/manifests/base
Kong for kubernetes官网地址
:
https://docs.konghq.com/2.2.x/kong-for-kubernetes/using-kong-for-kubernetes/
三、Centos环境安装kong
推荐博客,安装的为1.0.2版本kong
https://www.cnblogs.com/langfanyun/p/10298491.html
-
下载rpm安装包
,这里以Centos7.0为例,rpm下载地址https://docs.konghq.com/install/centos/ 或者 https://bintray.com/kong/kong-rpm/centos/view/files/centos/7#files/centos/7
-
安装
如果已经下载了rpm安装包,则执行以下:
$ sudo yum install /path/to/package.rpm --nogpgcheck
如果使用镜像库直接安装则执行:
$ sudo yum update -y
$ sudo yum install -y wget
$ wget https://bintray.com/kong/kong-rpm/rpm -O bintray-kong-kong-rpm.repo
$ export major_version=`grep -oE '[0-9]+\.[0-9]+' /etc/redhat-release | cut -d "." -f1`
$ sed -i -e 's/baseurl.*/&\/centos\/'$major_version''/ bintray-kong-kong-rpm.repo
$ sudo mv bintray-kong-kong-rpm.repo /etc/yum.repos.d/
$ sudo yum update -y
$ sudo yum install -y kong
-
准备安装DB或者声明一个配置文件
kong 可以在有数据库的情况下进行运行,也可以无数据库独立运行,当你使用数据库时,您将使用 kong.conf 配置文件在启动时设置kong的配置属性,并将数据库设置为所有配置实体的存储,例如kong代理到的路由和服务。。如果不使用数据库进行独立运行时,您将使用 kong.conf 其配置属性和 kong.yml 文件将实体指定为声明性配置。
1)使用数据库进行存储kong的信息,如果您使用的是 PostgreSQL,请预配数据库和用户:
配置kong,以便它可以连接到您的数据库。kong支持 PostgreSQL 9.5+ 和 Cassandra 3.x.x 作为数据存储。
create user kong with password '123456';
CREATE DATABASE kong OWNER kong;
2)无数据库下启动kong
如果要在无 DB 模式下运行kong,应首先生成声明性配置文件。以下命令将在当前文件夹中生成一个 kong.yml 文件。它包含有关如何填充它的说明。
$ kong config init
填充 kong.yml 文件后,编辑您的 kong.conf 文件。将数据库选项设置为关闭,declarative_config将选项设置为 kong.yml 文件的路径:
database = off
declarative_config = /path/to/kong.yml
-
启动kong
启动kong时,Nginx 主进程默认以root进程运行,工作进程作为kong运行。如果这不是所需的行为,您可以将 Nginx 主进程切换到在内置的 kong 用户或启动kong之前运行到自定义非root用户。有关详细信息,请参阅以非root用户运行孔。
$ kong start [-c /path/to/kong.conf]
- 校验是否启动成功
> curl -i http://localhost:8001/
***docker安装kong***
- 创建kong网络
```shell
$ docker network create kong-net
-
初始化数据库
$ docker run --rm \ --network=kong-net \ -e "KONG_DATABASE=postgres" \ -e "KONG_PG_HOST=192.168.220.128" \ -e "KONG_PG_USER=kong" \ -e "KONG_PG_PASSWORD=123456" \ kong:2.1.4-centos kong migrations bootstrap
-
启动容器
docker run -d --name kong2.1.4 \ --network=kong-net \ -e "KONG_DATABASE=postgres" \ -e "KONG_PG_HOST=192.168.220.128" \ -e "KONG_PG_USER=kong" \ -e "KONG_PG_PASSWORD=123456" \ -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, 0.0.0.0:8444 ssl" \ -p 8000:8000 \ -p 8443:8443 \ -p 8001:8001 \ -p 8444:8444 \ --restart always \ kong:2.1.4-centos
四、Kong 监听的端口说明:
:8000
kong侦听来自客户端的传入 HTTP 流量,然后转发到您的上游服务。:8443
kong侦听传入的 HTTPS 流量。此端口具有与":8000"端口类似的行为,只不过它仅需要 HTTPS 流量。可以通过配置文件禁用此端口。.:8001
[管理员 API] 用于配置kong侦听。:8444
管理员 API 侦听 HTTPS 流量。
五、停止与重启kong
$ kong stop
$ kong reload
重要
: kong启动后外部主机无法访问8001管理端口
问题的根本原因就是因为nginx监听的端口,kong默认将admin的管理端口只允许服务器本机访问,不允许给外部机器访问,这样`很安全`,但是一方面就会不方便,解决方案如下:
方案1)添加环境变量,因为Kong启动的时候会读取环境变量进行配置,这点在以下内容会介绍
export KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl
方案2)指定kong的启动文件,在启动文件中配置这个值
添加以下内容
admin_listen = 0.0.0.0:8001, 0.0.0.0:8444 ssl
六、安装Kong Dashboard管理界面 非推荐,功能简单
kong仪表板是一个 GUI,将允许您管理您的kong网关设置。以下是kong与kong Dashboard的版本匹配
Kong-Dashboard versions | Kong versions | Node versions |
---|---|---|
1.x.x | >= 0.6, < 0.10 | |
2.x.x | 0.10 | |
3.0.x | >= 0.9, <0.12 | >= 6.0.0 |
3.1.x, 3.2.x | >= 0.9, <0.13 | >= 6.0.0 |
3.3.x, 3.4.x | >= 0.9, <0.14 | >= 6.0.0 |
3.5.x | >= 0.9, <0.15 | >= 6.0.0 |
3.6.x | >= 0.9, <2.0.0 | >= 6.0.0 |
-
安装
- a running Kong gateway. https://getkong.org/install/
- nodejs and npm, or docker
Using npm:
# Install Kong Dashboard
npm install -g kong-dashboard
# Start Kong Dashboard
kong-dashboard start --kong-url http://kong:8001
# Start Kong Dashboard on a custom port
kong-dashboard start \
--kong-url http://kong:8001 \
--port [port]
# Start Kong Dashboard with basic auth
kong-dashboard start \
--kong-url http://kong:8001 \
--basic-auth user1=password1 user2=password2
# See full list of start options
kong-dashboard start --help
Using Docker:
# Start Kong Dashboard
docker run --rm -p 8080:8080 pgbi/kong-dashboard start --kong-url http://kong:8001
# Start Kong Dashboard on a custom port
docker run --rm -p [port]:8080 pgbi/kong-dashboard start --kong-url http://kong:8001
# Start Kong Dashboard with basic auth
docker run --rm -p 8080:8080 pgbi/kong-dashboard start \
--kong-url http://kong:8001
--basic-auth user1=password1 user2=password2
# See full list of start options
docker run --rm -p 8080:8080 pgbi/kong-dashboard start --help
官方链接
: https://github.com/PGBI/kong-dashboard
推荐博客
:https://blog.csdn.net/xiaoliu598906167/article/details/85785420
七、安装 Konga管理界面 推荐使用,功能相对丰富
由于konga管理工具有自己的用户信息,所以会创建相关的DB进行维护,为了统一kong的数据库,所以统一使用Postgresql进行存储,提前创建相关数据库以及用户信息:
create user konga with password 'konga123456';
CREATE DATABASE konga OWNER konga;
grant all privileges on database konga to konga;
Using docker:
- 拉取镜像
版本不要拉取最新,以免不兼容kong
$ docker pull pantsel/konga:0.14.9
- 启动容器
$ docker run -d -p 1337:1337 -e "TOKEN_SECRET=699a85ee59a1" -e "DB_ADAPTER=postgres" -e "DB_HOST=192.168.220.128" -e "DB_PORT=5432" -e "DB_USER=konga" -e "DB_PASSWORD=konga123456" -e "DB_DATABASE=konga" -e "NODE_ENV=development" --name konga pantsel/konga:0.14.9
TOKEN_SECRET
:是创建者随机生成即可
启动后浏览器访问:宿主机IP + 映射端口即可
八、使用案例
成熟的流程:
配置upstream -> 配置target -> 配置服务 -> 配置路由 -> 安装插件[可选]
1.使用管理API将你的服务添加到Kong:
$ curl -i -X POST \
--url http://localhost:8001/services/ \
--data 'name=nginx-service-demo' \
--data 'url=http://192.168.220.130:30001/'
client调用服务名称nginx-service-demo,访问http://192.168.220.130:30001地址
添加成功后,系统将返回如下信息:
HTTP/1.1 201 Created
Date: Tue, 19 Jan 2021 10:07:45 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
Access-Control-Allow-Origin: *
Server: kong/1.0.2
Content-Length: 268
{
"host":"192.168.220.130",
"created_at":1611050865,
"connect_timeout":60000,
"id":"88563cdd-44c1-4c3b-abdd-89073b24f643",
"protocol":"http",
"name":"nginx-service-demo",
"read_timeout":60000,
"port":30001,
"path":"/",
"updated_at":1611050865,
"retries"