2.Kong入门与实战 基于Nginx和OpenResty的云原生微服务网关 --- Kong 的安装和基本概念

Posted enlyhua

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2.Kong入门与实战 基于Nginx和OpenResty的云原生微服务网关 --- Kong 的安装和基本概念相关的知识,希望对你有一定的参考价值。

2.1 Kong 的安装部署
	2.1.1 环境介绍 
	2.1.2 直接安装 
		yum install epel-release
		yum install kong-2.0.0.el7.amd64.rpm --nogpgcheck
		kong version

	2.1.3 容器安装 
		docker pull kong:2.0

	2.1.4 Kubernetes 安装 

2.2 Kong 数据库的安装部署 
	kong 数据库支持 PostgreSQL,Cassandra和DB-less(无数据库)三种安装模式。

	2.2.1 PostgreSQL 

	2.2.2 Cassandra 

	2.2.3 DB-less 
		DB-less 模式,此时使用 yaml 或者 json 文件直接进行声明式配置即可。

		DB-less模式与声明式配置相组合,具有以下优势:
			1.减少过多依赖:所有配置都加载在内存中,不需要数据库的安装和管理。
			2.适用于CI/CD场景:配置文件可以保存在git中,方便使用。


		如果需要在这种模式下使用Kong,请先将 /etc/kong/kong.conf 配置文件中的 database 指令设置为 off,或者将环境变量 KONG_DATABASE
	设置为 off,之后再启动 kong:
		export KONG_DATABASE=off
		kong start -c kong.conf


		kong 启动后,通过 curl http://127.0.0.1:8001 命令直接访问 Admin API(管理端口),此时将返回整个 kong 的配置信息,通过查看其中的
	database 是否为 off,可以验证kong是否运行在 DB-less 模式下面。

		curl  http://127.0.0.1:8001/routes,可以看到 data 为空。

		kong config -c kong.conf init  //生成 kong.yml 文件
		kong config -c kong.conf parse kong.yml  //编辑后,检查配置文件是否存在语法错误

		注意:kong.yml 文件生成的路径在当前目录中。

		有两种方法可以将声明性配置加载到 kong 的内存中:通过kong.conf 配置文件和通过Admin API。前者是编辑 kong.conf 配置文件中的 
	declarative_config 指令(或者使用等效的 KONG_DECLARATIVE_CONFIG 环境变量):
		export KONG_DATABASE=off
		export KONG_DECLARATIVE_CONFIG=kong.yml
		kong start -c kong.conf

		后者是使用 Admin API 管理的 /config 端点将声明性配置加载到正在运行的 kong 节点中:
		http://127.0.0.1:8001/config config=@kong.yml


		DB-less 模式下需要注意:
			1.内存缓存要求
				路由,服务等实体的配置必须符合Kong的缓存大小,请参考 kong.conf 中的 mem_cache_size。

			2.没有中央数据库协调
				由于每个节点都是完全独立的配置,所以没有集群传播机制。

			3.只读的Admin API
				因为需要通过文件的形式声明配置,所以只能通过get方法获取api,其他操作都会返回405。

			4.插件的兼容性
				大部分内置插件都可以运行,但有些插件由于需要数据库协调或创建外部内容而无法运行,比如与身份验证插件相关的或者redis限速。


2.3 Kong 基础配置 
	在默认情况下,kong 监听下面端口:
		1. 8000 :监听来自客户端的 http 请求流量,并将其路由转发给上游服务器。
		2. 8443 :监听传入的 https 请求流量,并将其路由转发给上游服务器。
		3. 8001 :监听来自 kong Admin API 的 http 请求流量。
		4. 8444 :监听来自 kong Admin API 的 https 请求流量。

		以 PostgreSQL 为例 :
			 //1.复制一份 kong 的配置文件
			cp /etc/kong/kong.conf.default /etc/kong/kong.conf 

			//2.在postgreSQL 上创建名为 kong 的数据库
			CREATE USER kong; CREATE DATABASE kong OWNER kong;  

			//3.使用vim编辑 kong.conf,定位到 DATASTORE
			database = postgres  -- 数据库类型
			pg_host = 127.0.0.1 
			pg_port = 5432      
			pg_user = kong      
			pg_password = 123456
			pg_database = kong  

			//4.定位到 nginx,打开注释,把代理服务端口8000调整为80,管理服务端口8443调整为443
			//为了方便使用,我们这里把 8000 调整为 80,8443 调整为 443
			proxy_listen = 0.0.0.0:80, 0.0.0.0:443 ssl
			//管理端口保持不变
			admin_listen = 0.0.0.0:8001, 0.0.0.0:443 ssl

2.4 Kong 的启动和停止 
	//kong 需要在启动之前初始化数据库,下面的命令将连接数据库并生成kong所需要的表结构信息
	kong migrations bootstrap

	//启动 kong
	kong start -vv

	//优雅的关闭kong,即等待当前正在进行的请求完成后再关闭,直到所设定的时间超时
	kong quit -t 10 

	//直接停止正在运行的kong
	kong stop

	//重新载入kong
	kong reload

	在重新载入时,会先等当前请求完成后并关闭后,再启动新的工作进程,同时采用之前生成的 /usr/local/kong/.kong_env环境配置文件(注意不是
/etc/kong/kong.conf 文件)。如果需要调整配置文件,建议调整原始的 kong.conf 文件或同时调整这2个文件,不然对环境配置文件进行的所有修改
都将丢失。

2.5 Kong 的基础对象 
	kong 的基础对象有8大类:
		1.路由(route)
		2.服务(service)
		3.上游(upstream)
		4.目标(target)
		5.消费者(consumer)
		6.插件(plugin)
		7.证书(certificate)
		8.SNI(Server Name Indication,服务器名称指示)

	2.5.1 路由 
		路由定义了客户端请求与服务之间的匹配规则,它支持精确匹配,模糊匹配以及正则匹配,是请求的入口点。每个路由都与特定的服务相关联,一个
	服务下可以有一个或者多个与之相关联的路由,每个路由匹配到的请求都将被代理到与该路由关联的服务。路由和服务的组合提供了自由,灵活,多变的
	路由机制,基于此,我们可以定义更为具体的(细粒度)的匹配入口。

		注意,一个路由至少需要一个匹配规则和协议。

	2.5.2 服务 
		服务是用于管理上游服务的入口点,用于将客户端的请求流量发送给对应的上游服务器,其主要属性是 protocol,host,port和path。服务于路由
	相关联,一个服务下可以包含多个路由。路由是客户端的入口,定义了匹配客户端请求和服务的规则。具体为客户端请求先于路由做匹配,如果匹配成功,
	kong就将请求代理到该路由相关联的服务。

	2.5.3 上游 
		上游服务表示一个虚拟主机,我们可以对上游服务的多个目标节点进行负载均衡和健康监测。负载均衡支持多种散列(哈希)的目标节点选择策略。
	健康监测有主动和被动两种模式,该机制既可以将探测到的不健康上游服务节点禁用,使之不参与负载,也可以将之启用后重新参与负载。

	2.5.4 目标 
		目标节点代表一个真实的物理服务,通常为ip地址和端口的组合,其中端口用来标识后端上游服务器上的某个具体节点实例。每个上游都可以包含多个
	目标节点地址,在运行过程中可以动态的添加或者删除。此外,每个目标节点还可以设置不同的权重。

		因为上游维护着目标节点变更的历史记录,所以不能随意删除或者修改目标节点。若要禁用目标节点,需要先发布一个权重为0的新目标节点,再使用
	delete 方法将之删除。

	2.5.5 消费者 
		消费者代表一个具体的用户,是客户端请求的发起者。消费者ID可以作为主要数据存储,可以与业务数据库的用户信息相映射,关联,并为身份授权和
	鉴权提供更多的策略。

	2.5.6 插件 
		插件表示在请求/响应生命周期内执行的功能集。通过此机制,可以在kong的服务和路由上添加,配置和扩展自定义功能,例如身份验证。在向服务
	或者路由添加某个插件配置后,客户端对该服务的每个请求都将运行此插件。与此同时,插件也可以应用于某些特定的消费者,或者被配置为全局插件。

		对于每个请求,配置的插件只能运行一次。

		将插件应用到具体有不同配置的不同对象时,其优先级顺序的规则为:插件配置的实体越多,越具体,其优先级越高。

	2.5.7 证书 
		证书对象代表公钥证书,可以选择与之对应的私钥配对。这些对象被kong用来处理加密请求的ssl/tls终端,或在验证客户端/服务的对等证书时
	用作受信任的CA存储。证书可以选择与SNI对象关联,以将证书/密钥对绑定到一个或者多个主机域名上。另外,如果除了主证书之外还需要中间证书,
	应该按照下面的顺序将它们串联起来:先是主证书在顶部,然后是中间证书。

	2.5.8 SNI 
		SNI 表示从域名到证书的多对一映射,用来解决一个服务器使用多个域名和证书的问题。一个证书对象可以同时有多个与之相关联的域名。当Kong
	接收到ssl终端的请求时,将使用与其中的域名属性相关联的SNI来查找对应的泛域名证书对象。

	2.5.9 对象之间的关系
		kong 网关的框架流程为:请求->消费者->路由->插件->上游->目标。

		请求会根据 请求域名,请求路由,请求方法和请求头等条件经过 消费者身份验证,再由路由策略进行路由匹配,匹配成功后会根据插件的优先级
	次序依次运行插件,之后经过服务,再次运行插件(如果有),最后经过上游服务的负载均衡策略,将请求发送至健康的目标节点。

以上是关于2.Kong入门与实战 基于Nginx和OpenResty的云原生微服务网关 --- Kong 的安装和基本概念的主要内容,如果未能解决你的问题,请参考以下文章

7.Kong入门与实战 基于Nginx和OpenResty的云原生微服务网关 --- 日志收集与分析

9.Kong入门与实战 基于Nginx和OpenResty的云原生微服务网关 --- 高级进阶

8.Kong入门与实战 基于Nginx和OpenResty的云原生微服务网关 --- 指标监控与报警

6.Kong入门与实战 基于Nginx和OpenResty的云原生微服务网关 --- Lua 语言

5.Kong入门与实战 基于Nginx和OpenResty的云原生微服务网关 --- Kong 的配置详解

10.Kong入门与实战 基于Nginx和OpenResty的云原生微服务网关 --- 内置插件