kong接口的搭建部署
1.简介
kong基于nginx和OpenResty,是一个具有分布式、高性能、高并发、可伸缩、可扩展、提供动态负载均衡、散列负载均衡、动态配置、服务注册、服务发现、服务熔断、健康检测、故障恢复、授权认证、速率限制、缓存处理、指标监控、日志收集、插件扩展、亚毫秒级延迟等特性和功能的微服务抽象层。
kong的内部设计为插拔体系结构,kong采用插件的方式统一收纳管理这些业务通用的功能,是它们之间边界清晰、彼此隔离、互不影响。其实和nginx是一类型的
- 默认情况下kong监听的端口
- 8000:监听来自客户端的HTTP请求流量,并将其路由转发给上游服务器
- 8443:监听传入的HTTPS请求流量,并将其路由转发给上游服务器
- 8001:监听来自Kong Admin API的HTTP请求流量
- 8444:监听来自Kong Admin API的HTTPS请求流量
2.kong的安装部署
2.0 直接安装
- 只需三步
kong下载地址
[root@zhy ~]# yum install epel-release -y
[root@zhy ~]# curl -Lo kong-2.0.0.amd64.rpm $( rpm --eval "https://download.konghq.com/gateway-2.x-centos-%{centos_ver}/Packages/k/kong-2.0.0.el%{centos_ver}.amd64.rpm") ##下载kong安装包
[root@zhy ~]# yum install kong-2.0.0.amd64.rpm --nogpgcheck -y ##安装,关闭gpgcheck
2.1 使用yum仓库安装(下载最新版本)
$ 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
2.2 docker安装kong
2.2.1 安装docker
2.2.2 安装kong
[root@zhy yum.repos.d]# docker pull kong:2.0
[root@zhy yum.repos.d]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
kong 2.0 fc5b7eb60cde 3 months ago 146MB
2.3 k8s安装
3.kong数据库的配置
kong数据库支持PostgreSQL、Cassandra、DB-less(无数据库)三种安装模式。
3.1 PostgreSQL(实验所用数据库)
3.1.1 简介
-
PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统(ORDBMS),是以加州大学计算机系开发的POSTGRES,4.2版本为基础的对象关系型数据库管理系统。POSTGRES的许多领先概念只是在比较迟的时候才出现在商业网站数据库中。PostgreSQL支持大部分的SQL标准并且提供了很多其他现代特性,如复杂查询、外键、触发器、视图、事务完整性、多版本并发控制等。同样,PostgreSQL也可以用许多方法扩展,例如通过增加新的数据类型、函数、操作符、聚集函数、索引方法、过程语言等。另外,因为许可证的灵活,任何人都可以以任何目的免费使用、修改和分发PostgreSQL。
-
PostgreSQL完全免费
-
Postgresql是个全栈数据库,功能强大,扩展性很强
内部集成了一些功能(比如流复制主从备份,数据库备份还原等等一些功能),就算内部没有某些功
能也可以通过安装插件或者集成第三方的软件进行实现(现在一些市面上常用的软件,有点
名气的都提供了对Postgresql的支持,比如Redis,citus,MongoDB,等等一些软件。) -
Postgresql是个多进程多线程数据库
配置文件里面可以配置多线程并行查询(使用多个子进程进行重新) -
Postgresql对ANSI SQL支持很友好
在SQL的标准实现上要比MySQL完善,而且功能实现比较严谨 -
在SQL的标准实现上要比MySQL完善,而且功能实现比较严谨
OLTP(联机事务处理)线上请求处理
详细:
强调支持短时间内大量并发的小型操作(增删改查)能力,
每个查询涉及的数据量都很小(比如几十到几百字节)
强调事务的强一致性(想想银行转账交易,容不得差错)
举例:“双十一”期间,可能有几十万用户在同一秒内下订单。
后台数据库要能够并发的、以近乎实时的速度处理这些订单请求
(如果下了订单,十几分钟还没有反应,用户肯定要骂人了)
OLAP(联机分析处理)后台数据分析处理
详细:
偏向于复杂的只读查询,读取海量数据进行分析计算,查询时间往往很长
举例:“双十一”结束,淘宝的运营人员对订单进行分析挖掘,找出一些市场规律、
分析刷单行为等等。这种分析可能需要读取所有的历史订单进行计算,
耗时几十秒甚至几十分钟都有可能。 -
支持所有主流的多表连接查询的方式(如: “Nest loop”、 “hashjoin” "sort merge join"等)
支持绝大多数的SQL语法(如: with子句) -
PostgresQL对正则表达式支持最强、内置函数也是最丰富的数据库。字段类型还支持数组类型
数据类型支持比较丰富。PostgreSQL不仅支持复杂的SQL,还支持大量的分析函数,非常适合做数据仓库。 -
Postgresql移动数据很方便:能平滑迁移至同属Pg生态的GreenPlum,DeepGreen,HAWK
数据库,数据库数据可以直接移动,只要是同生态圈的数据库可以直接移库 -
Postgresql内部功能处理的很好,性能优化工具度量信息很足。
PostgresQL数据库中有大量的性能视图,可方便地定位问题(比如:可看到正在执行的SQL,
可通过锁视图看到谁在等待、哪条记录被锁定等), PostgresQL中设计了专门的架构和进程
用于收集性能数据,既有物理方面的统计,也有表扫描及素引扫描方面的性能数据。
3.1.2 安装
3.1.2.1 docker下安装
[root@zhy ~]# docker pull postgres:9.6 ##拉取数据库镜像
[root@zhy ~]# mkdir -p /opt/postgres/data ##创建数据存储目录
[root@zhy ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
postgres 9.6 5505f5c4eb7b 2 weeks ago 200MB
kong 2.0 fc5b7eb60cde 3 months ago 146MB
[root@zhy ~]# docker network create kong-net ##创建网络
5cb9b7e248846c80e470588df53e810ffdeec8908f8d3d2077733e8e9a465c61
[root@zhy ~]# docker run -d --name kong-database --network=kong-net -p 5432:5432 -e "POSTGRES_USER=kong" -e "POSTGRES_PASSWORD=kong" postgres:9.6
1996ddd4ff29f6b8d5b43edc575c32a5c73afee3b8936148f9c714a11c63b3af
[root@zhy ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1996ddd4ff29 postgres:9.6 "docker-entrypoint.s…" 4 seconds ago Up 3 seconds 0.0.0.0:5432->5432/tcp kong-database
[root@zhy ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
091c8d7b1f38 bridge bridge local
ab75e0153def host host local
5cb9b7e24884 kong-net bridge local
13ee44bc7ee9 none null local
3.1.2.2 仓库安装
# Install the repository RPM:
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# Install PostgreSQL:
sudo yum install -y postgresql96-server
# Optionally initialize the database and enable automatic start:
sudo /usr/pgsql-9.6/bin/postgresql96-setup initdb
sudo systemctl enable postgresql-9.6
sudo systemctl start postgresql-9.6
3.1.3 准备数据库
#1.创建用户和数据库
[root@zhy ~]# sudo -s -u postgres #创建一个名为 kong 的用户,并且创建一个名为 kong 的数据库。
psql
CREATE USER kong WITH PASSWORD 'kong';
CREATE DATABASE kong OWNER kong;
GRANT ALL PRIVILEGES ON DATABASE kong to kong;
#2.修改配置文件
#设置对外访问策略:
#vim /var/lib/pgsql/9.6(自己的版本号)/data/pg_hba.conf
#或者
#vi /var/lib/pgsql/data/pg_hba.conf
#在最后一行增加: host all all 0.0.0.0/0 md5
[root@zhy kong]# vim /var/lib/pgsql/9.6/data/pg_hba.conf
#pgsql开启远程访问:
[root@zhy kong]# vim /var/lib/pgsql/9.6/data/postgresql.conf
#将 listen_address去掉注释并设置值为 '*' ,即:
#listen_addresses = '*'
[root@zhy kong]# systemctl restart postgresql-9.6.service
3.2 Cassandra
3.2.1 简介
- 其是一个开源的分布式NoSQL数据库系统,支持结构化数据、半结构化数据、非结构化数据存储,具有高可用、高性能、高可靠、可扩展、无单点以及支持多数据中心集群部署等优点,是目前流行的一种分布式数据存储方案。
3.2.2 安装(docker安装)
[root@zhy ~]# docker pull cassandra:3.11
[root@zhy ~]# mkdir -p /opt/cassandra/data
[root@zhy ~]# docker run -d --name cassdra --network=kong-net -p 9042:9042 -e CASSANDRA_BROADCAST_ADDRESS=47.116.106.14 cassandra:3.11
435e8ed120e1924525498bed4a84110852087025cf88d2249172ad45fe4f6722
[root@zhy ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
435e8ed120e1 cassandra:3.11 "docker-entrypoint.s…" 5 seconds ago Up 3 seconds 7000-7001/tcp, 7199/tcp, 9160/tcp, 0.0.0.0:9042->9042/tcp cassdra
1996ddd4ff29 postgres:9.6 "docker-entrypoint.s…" 22 minutes ago Up 22 minutes 0.0.0.0:5432->5432/tcp kong-database
3.3 DB-less(无数据库模式)
3.3.1 简介
通过yaml或json文件直接进行声明式配置即可
优势:
减少过多依赖:所有配置都加载并存储在内存中,不需要数据库的安装和管理
适用于CI/CD场景,配置文件可以保存在Git存储仓库中,方便使用。
3.3.2 使用测试
[root@zhy ~]# docker network create kong-net #创建网络
[root@zhy ~]# docker volume create kong-vol #创建volume
[root@zhy ~]# docker volume inspect kong-vol #查看逻辑卷内容
[
{
"CreatedAt": "2021-08-06T15:42:14+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/kong-vol/_data",
"Name": "kong-vol",
"Options": {},
"Scope": "local"
}
]
[root@zhy ~]# vim /var/lib/docker/volumes/kong-vol/_data/kong.yaml
[root@zhy ~]# cat /var/lib/docker/volumes/kong-vol/_data/kong.yaml
_format_version: "1.1" ##这一句是必须的
services:
- name: my-service
url: https://example.com
plugins:
- name: key-auth
routes:
- name: my-route
paths:
- /
consumers:
- username: my-user
keyauth_credentials:
- key: my-key
[root@zhy ~]# docker run -d --name kong --network=kong-net -v "kong-vol:/usr/local/kong/declarative" -e "KONG_DATABASE=off" -e "KONG_DECLARATIVE_CONFIG=/usr/local/kong/declarative/kong.yml" -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 kong:2.0
2af2ea6d8988cf2329ac352a556cfc9a79cbf9fec7f2bb77b71f9a593a75e2bd
[root@zhy ~]# curl -i http://example.com ##测试是否成功
4.启动Kong
4.1 docker下操作
##1.准备数据库
[root@zhy ~]# docker run --rm --network=kong-net -e "KONG_LOG_LEVEL=debug" -e "KONG_DATABASE=postgres" -e "KONG_PG_HOST=kong-database" -e "KONG_PG_PASSWORD=kong" -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" kong:2.0 kong migrations bootstrap
## 2.启动kong
[root@zhy ~]# docker run -d --name kong --network=kong-net \
-e "KONG_DATABASE=postgres" \ ##数据类型
-e "KONG_PG_HOST=kong-database" \ ##数据库的ip地址
-e "KONG_PG_PORT=5432" \ ##数据库的端口
-e "KONG_PG_PASSWORD=kong" \ ##数据库密码
-e "KONG_PG_DATABASE=kong" \ ##数据库名称可以不要
-e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
-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_LISTEN_SSL=0.0.0.0:8444" \
-p 8000:8000 \ ##容器代理端口到外部的映射
-p 8443:8443 \ ##容器SSL代理端口到外部的映射
-p 8001:8001 \ ##容器管理端口到外部的映射
-p 8444:8444 \ ##容器SSL管理端口到外部的映射
kong:2.0
29b204aa3b97b835f5bfc77824b1ab3e3796b2efce9762ce148ec272fc8f8598
[root@zhy ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
29b204aa3b97 kong:2.0 "/docker-entrypoint.…" 25 seconds ago Up 4 seconds 0.0.0.0:8000-8001->8000-8001/tcp, 0.0.0.0:8443-8444->8443-8444/tcp kong
1996ddd4ff29 postgres:9.6 "docker-entrypoint.s…" About an hour ago Up About an hour 0.0.0.0:5432->5432/tcp
##3.测试是否成功
[root@zhy ~]# curl -i http://localhost:8001/
4.2 通过rpm包(实验所用)
4.2.1 修改配置文件
[root@zhy kong]# cp /etc/kong/kong.conf.default /etc/kong/kong.conf ##复制模板
[root@zhy kong]# vim /etc/kong/kong.conf
#------------------------------------------------------------------------------
# DATASTORE
#------------------------------------------------------------------------------
database = postgres # Determines which of PostgreSQL or Cassandra
pg_host = 10.99.35.231 # Host of the Postgres server.
pg_port = 5432 # Port of the Postgres server.
#pg_timeout = 5000 # Defines the timeout (in ms), for connecting,
# reading and writing.
pg_user = kong # Postgres user.
pg_password = kong # Postgres user's password.
pg_database = kong # The database name to connect to.
#------------------------------------------------------------------------------
# NGINX
#------------------------------------------------------------------------------
proxy_listen = 0.0.0.0:80 , 0.0.0.0:443 ssl ##代理服务器端口调整成80和443,方便使用
admin_listen = 0.0.0.0:8001, 127.0.0.1:8444 ssl ##值改为0.0.0.0是因为后面需要通过此Admin API进行外部访问,而127.0.0.1只能访问本地
4.2.2 启动和停止
#1.启动
[root@opsys-vm12-231 kong]# kong migrations bootstrap -c /etc/kong/kong.conf ##kong初始化数据库
[root@opsys-vm12-231 kong]# kong start -vv ##启动kong,可以看详细信息
[root@opsys-vm12-231 kong]# curl http://10.99.35.231 ##测试是否成功
{"message":"no Route matched with those values"}
[root@opsys-vm12-231 kong]# kong health #也可以检测是否启动成功
nginx.......running
Kong is healthy at /usr/local/kong
#2.停止
[root@opsys-vm12-231 kong]# kong quit -t 10 ##等待10s停止
[root@opsys-vm12-231 kong]# kong stop ##直接停止
5.konga部署
- konga是kong的一个可视化管理后台。
- konga功能:
管理Kong Admin API的所有对象
支持多种数据源的导入(数据库、文件、API等)
管理多个kong集群节点
使用快照来备份还原和迁移kong节点
根据健康检测监控节点和API状态
电子邮件和异常的通知
多个用户的登录和权限管理
多种数据库的存储集成(如mysql、PostgreSQL、MongoDB)
5.1 源码安装
5.1.1 安装git和node.js
[root@zhy ~]# yum install git -y
[root@zhy ~]# git --version ##验证是否安装
[root@zhy ~]# curl --silent --location https://rpm.nodesource.com/setup_10.x | sudo bash
[root@zhy ~]# yum install -y nodejs ##安装nodejs
[root@zhy ~]# node -v #检测是否安装成功
5.1.2 安装konga
[root@zhy ~]# git clone https://github.com/pantsel/konga.git ##克隆konga 源代码
Cloning into 'konga'...
remote: Enumerating objects: 14392, done.
remote: Counting objects: 100% (46/46), done.
remote: Compressing objects: 100% (46/46), done.
remote: Total 14392 (delta 30), reused 0 (delta 0), pack-reused 14346
Receiving objects: 100% (14392/14392), 8.30 MiB | 866.00 KiB/s, done.
Resolving deltas: 100% (10458/10458), done.
[root@zhy ~]# cd konga/ ##进入konga 目录
[root@zhy konga]# npm i ##安装konga,其中i是install的缩写
5.1.3 配置konga
[root@zhy konga]# pwd
/root/konga
[root@zhy konga]# cp .env_example .env
[root@zhy konga]# vim .env ##配置环境变量
[root@zhy konga]# cat .env
PORT=1337 ##端口
NODE_ENV=development ##环境变量
KONGA_HOOK_TIMEOUT=120000 ##等待启动完成的时间(毫秒)
DB_ADAPTER=postgres ##采用的数据库类型
DB_URI=postgresql://localhost:5432/konga ##数据库连接字符串
KONGA_LOG_LEVEL=warn ##日志的级别
5.1.4 启动konga
[root@zhy konga]# npm start ##启动
> kongadmin@0.14.9 start /root/konga
> node --harmony app.js
Using postgres DB Adapter.
Failed to connect to DB { error: Ident authentication failed for user "root"
at Connection.parseE (/root/konga/node_modules/sails-postgresql/node_modules/pg/lib/connection.js:539:11)
at Connection.parseMessage (/root/konga/node_modules/sails-postgresql/node_modules/pg/lib/connection.js:366:17)
at Socket.<anonymous> (/root/konga/node_modules/sails-postgresql/node_modules/pg/lib/connection.js:105:22)
at Socket.emit (events.js:198:13)
at addChunk (_stream_readable.js:288:12)
at readableAddChunk (_stream_readable.js:269:11)
at Socket.Readable.push (_stream_readable.js:224:10)
at TCP.onStreamRead [as onread] (internal/stream_base_commons.js:94:17)
name: 'error',
length: 97,
severity: 'FATAL',
code: '28000',
detail: undefined,
hint: undefined,
position: undefined,
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'auth.c',
line: '308',
routine: 'auth_failed' }
##如果是生产环境,需要完成数据库的迁移,即创建表到数据库
[root@zhy konga]# node ./bin/konga.js prepare --adapter postgres --uri postgresql://localhost:5432/konga
[root@zhy konga]# npm run production
出错解决问题