Qicz’s Thoughts HUB

The creative and technical writing. Do more, challenge more, know more, be more.

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可以充当微服务请求的网关(或侧卡),同时通过插件提供负载平衡、日志记录、身份验证、速率限制、转换等功能。

Different architecture compare

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添加功能。

Kong layer

二、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$ sudo yum install epel-release
2$ sudo yum install kong-2.1.3.*.noarch.rpm --nogpgcheck
2.2、使用repository安装,执行如下命令
1$ sudo yum update -y
2$ sudo yum install -y wget
3$ wget https://bintray.com/kong/kong-rpm/rpm -O bintray-kong-kong-rpm.repo
4$ export major_version=`grep -oE '[0-9]+\.[0-9]+' /etc/redhat-release | cut -d "." -f1`
5$ sed -i -e 's/baseurl.*/&\/centos\/'$major_version''/ bintray-kong-kong-rpm.repo
6$ sudo mv bintray-kong-kong-rpm.repo /etc/yum.repos.d/
7$ sudo yum update -y
8$ sudo yum install -y kong

3、安装PostgreSQL

3.1 安装PostgreSQL

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

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

 1# Install the repository RPM:
 2yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
 3
 4# Install PostgreSQL:
 5yum install -y postgresql12-server
 6
 7# Optionally initialize the database and enable automatic start:
 8/usr/pgsql-12/bin/postgresql-12-setup initdb
 9systemctl enable postgresql-12
10systemctl start postgresql-12

需要获得sudo权限。

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

4、Kong目录结构

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