Contents

Kong系列之入门(上)

说明:作者Qicz将有可能随时的修订本文的内容,为了保证内容的一致性和严谨性,作者Qicz保留本文的所有权利。未经作者Qicz本人同意,不得转载或者以其他方式使用这些内容。

本文作为kong系列的入门,主要内容如下:

  • Api gateway概述
  • Kong安装
  • Kong.conf

一、Api gateway概述

1、从gateway说起

wikipedia上给gateway了很多定义,gateway是一个入口或者门口,可以说是一个网络间数据或协议交换的物理设备(Router),也可以是设备之前协议转化或数据共享的程序,而这样的程序就是我们这里讨论的重点。

在微服务甚至又出现的宏服务时代,gateway作为一个入口程序,关联着上游服务的数据交互、权限管控、链路跟踪、限流等等,那么kong也在这样的时代背景下应运而生。而且是站在巨人的肩上成长了起来。

这个巨人就是nginx,高性能的代理服务器。

Kong官网 介绍,Kong是一个运行在Nginx中的基于Lua - Nginx模块实现的Lua应用程序。Kong与OpenResty一起发布的,以此替代在Nginx中还需编译Lua - Nginx模块,OpenResty已经包含了lua- Nginx模块。OpenResty不是Nginx的一个分支,而是一组扩展其功能的模块。

Kong是一个基于云的、快速的、可伸缩的分布式微服务抽象层(也称为API网关或API中间件)。2015年作为开源项目发布,其核心价值是高性能和可扩展性。

2、为何选择Kong?

如果您正在为web、移动或物联网构建服务,那们您可能还需要通用功能来运行您的实际软件。Kong可以充当微服务请求的网关(或侧卡),同时通过插件提供负载平衡、日志记录、身份验证、速率限制、转换等功能。

/images/image-20200728111142106.png

Kong的构建遵循以下主要原则:

  • 高性能:亚毫秒级处理延迟,可支持关键任务用例和高吞吐量。
  • 可扩展性:带有可插拔的体系结构,可通过Kong的Plugin SDK扩展Lua或GoLang中的Kong。
  • 可移植性:要在每个平台,每个云上运行,并通过我们的现代Ingress Controller本地支持Kubernetes。

3、功能特性

  • Cloud-Native:与平台无关,Kong可以在任何平台上运行-从裸机到容器-并且可以在本机上的每个云上运行。
  • Kubernetes-Native:使用官方的Ingress Controller通过本地Kubernetes CRD声明性地配置Kong,以路由和连接所有L4 + L7通信。
  • 动态负载平衡:在多个上游服务之间平衡流量。
  • 基于哈希的负载平衡:具有一致的哈希/粘性会话的负载平衡。
  • 断路器:智能跟踪不健康的上游服务。
  • **运行状况检查:**主动和被动监视上游服务。
  • 服务发现:在第三方DNS解析器(例如Consul)中解析SRV记录。
  • 无服务器:直接从Kong调用和保护AWS Lambda或OpenWhisk功能。
  • WebSockets:通过WebSockets与您的上游服务进行通信。
  • gRPC:与gRPC服务进行通信,并通过日志记录和可观察性插件观察流量
  • OAuth2.0:轻松将OAuth2.0身份验证添加到您的API。
  • 记录:通过HTTP,TCP,UDP或磁盘记录对系统的请求和响应。
  • 安全性:ACL,僵尸程序检测,允许/拒绝IP等…
  • Syslog: 系统日志记录.
  • SSL:为基础服务或API设置特定的SSL证书。
  • 监视:实时监视提供关键的负载和性能服务器指标。
  • 转发代理:使Kong连接到透明的中介HTTP代理。
  • 认证:HMAC,JWT,Basic等。
  • 速率限制:基于许多变量的阻止和限制请求。
  • 转换:添加,删除或处理HTTP请求和响应。
  • 缓存:在代理层缓存并提供响应。
  • CLI从命令行控制Kong群集。
  • REST API:Kong可以使用其RESTful API进行操作,以实现最大的灵活性。
  • 地理复制:跨不同区域的配置始终是最新的。
  • 故障检测和恢复:如果您的Cassandra节点之一发生故障,则 Kong不会受到影响。
  • 集群:所有Kong节点自动加入集群,并在各个节点之间更新其配置。
  • 可伸缩性:Kong本质上分布,只需添加节点即可水平扩展
  • 性能:Kong通过扩展和使用NGINX作为核心轻松处理负载。
  • 插件:可扩展的体系结构,用于向Kong和API添加功能。

/images/image-20200727154809091.png#mid

二、Kong安装

这里重点讲解db模型的Kong安装,db-less的请自行查看官网。

1、环境准备

  • 操作系统 CentOS 7
  • 数据库 PostgreSQL
  • kong版本2.1.3

2、安装Kong

参考地址:https://docs.konghq.com/install/centos/

2.1 使用rpm包安装

下载rpm包 https://bintray.com/kong/kong-rpm/download_file?file_path=centos/7/kong-2.1.3.el7.amd64.rpm

使用命令安装:

1
2
$ sudo yum install epel-release
$ sudo yum install kong-2.1.3.*.noarch.rpm --nogpgcheck
2.2、使用repository安装,执行如下命令
1
2
3
4
5
6
7
8
$ 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

3、安装PostgreSQL

3.1 安装PostgreSQL

安装9.5以上版本即可,这里使用PostgreSQL最新版本。

参考地址:https://www.postgresql.org/download/linux/redhat/

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# Install the repository RPM:
yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

# Install PostgreSQL:
yum install -y postgresql12-server

# Optionally initialize the database and enable automatic start:
/usr/pgsql-12/bin/postgresql-12-setup initdb
systemctl enable postgresql-12
systemctl start postgresql-12

需要获得sudo权限。

3.2 用户角色
1
2
3
4
5
$ su - postgres << EOF
psql << XOF
CREATE USER kong; CREATE DATABASE kong OWNER kong;
XOF
EOF
3.3 导入Kong的数据
1
$ kong migrations bootstrap [-c /path/to/kong.conf]

4、Kong目录结构

4.1 默认安装目录:/usr/local/kong
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
.
├── bin
│   ├── c_rehash
│   └── openssl
├── client_body_temp
├── COPYRIGHT
├── fastcgi_temp
├── include
│   └── openssl
│       ├── aes.h
│       ├── asn1err.h
│       ├── asn1.h
│       ├── asn1_mac.h
│       ├── ...
│       ├── x509v3.h
│       └── x509_vfy.h
├── lib
│   ├── engines-1.1
│   │   ├── afalg.so
│   │   ├── capi.so
│   │   └── padlock.so
│   ├── libcrypto.a
│   ├── libcrypto.so -> libcrypto.so.1.1
│   ├── libcrypto.so.1.1
│   ├── libssl.a
│   ├── libssl.so -> libssl.so.1.1
│   ├── libssl.so.1.1
│   ├── libyaml-0.so.2 -> libyaml-0.so.2.0.7
│   ├── libyaml-0.so.2.0.7
│   ├── libyaml.a
│   ├── libyaml.la
│   ├── libyaml.so -> libyaml-0.so.2.0.7
│   └── pkgconfig
│       ├── libcrypto.pc
│       ├── libssl.pc
│       ├── openssl.pc
│       └── yaml-0.1.pc
├── logs
│   ├── access.log
│   ├── admin_access.log
│   └── error.log
├── nginx.conf
├── nginx-kong.conf
├── nginx-kong-stream.conf
├── pids
│   └── nginx.pid
├── proxy_temp
│   └── 1
│       └── 00
├── scgi_temp
├── ssl
│   ├── admin-kong-default.crt
│   ├── admin-kong-default.key
│   ├── kong-default.crt
│   └── kong-default.key
└── uwsgi_temp
4.2 kong.conf所在目录/etc/kong

5、Kong启动

5.1 直接启动
1
$ kong start [-c /path/to/kong.conf]
5.2 使用systemd启动
Start Kong
1
$ sudo systemctl start kong
Stop Kong
1
$ sudo systemctl stop kong
随系统一起启动
1
$ sudo systemctl enable kong
关闭随系统启动
1
$ sudo systemctl disable kong
Restart Kong
1
$ sudo systemctl restart kong
查看Kong状态
1
$ sudo systemctl status kong