API网关Kong学习笔记(二十六): Kong 1.1引入db-less模式,无数据库部署

Tags: kong 

目录

说明

Kong 1.1.x 实现了db-less模式,可以不使用数据库了。DB-less模式中,每个kong都独立工作,不通过数据库共享配置。

部署在Kubernetes中的db-less模式的kong和nginx-ingress的工作模式是一样的:一个controller程序监听kubernetes中的变换,生成配置文件;一个转发代理实时加载最新的配置。

相关笔记

2019-05-06 16:28:56:kong 1.1.x有了一个重大变换,实现了db-less模式,可以不使用数据库了,见笔记二十六:查看全部笔记如果是刚开始学习kong,直接从1.x开始,0.x已经不再维护,0.15是0.x的最后一个版本。

前19篇笔记是刚开始接触kong时记录的,使用的版本是0.14.1,当时对kong一知半解,笔记比较杂乱。第二十篇开始是再次折腾时的笔记,使用的版本是1.0.3,笔记相对条理一些。

从0.x到1.x需要关注的变化有:

  1. 插件全部使用pdk
  2. 0.x中不鼓励使用的特性都被移除了;
  3. 全部使用kong.db,以前独立的dao彻底清除,代码简洁清晰了。

部署

$ kubectl create -f https://raw.githubusercontent.com/Kong/kubernetes-ingress-controller/0.4.x/deploy/single/all-in-one-dbless.yaml

只有一个ingress-kong在运行,该Pod包含两个容器,一个是kong,一个是kong-ingress-controller:

$ ./kubectl.sh -n kong get pod -o wide
NAME                          READY   STATUS    RESTARTS   AGE   IP              NODE          NOMINATED NODE
ingress-kong-9446f846-7q897   2/2     Running   0          25m   172.16.129.70   10.10.64.58   <none>

只有kong-proxy:

$ ./kubectl.sh -n kong  get svc -o wide
NAME         TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE   SELECTOR
kong-proxy   LoadBalancer   172.16.113.243   <pending>     80:30028/TCP,443:31954/TCP   28m   app=kong

通过kong-proxy访问服务:

$ curl -H "host:echo.com" 10.10.64.58:30028

Hostname: echo-7df87d5c6d-s4vhq

Pod Information:
	-no pod information available-

Server values:
	server_version=nginx: 1.13.3 - lua: 10008

Request Information:
	client_address=172.16.129.70
	method=GET
	real path=/
	query=
	request_version=1.1
	request_uri=http://echo.com:8080/
...

CRD等没有变化。

实现

翻阅kong-ingress-controller的代码,使用db-less模式的时候,kong-ingress-controller调用kong 1.1的config接口,将最新配置下发给同一个pod中的kong:

// internal/ingress/controller/kong.go: 121
req, err := http.NewRequest("POST", n.cfg.Kong.URL+"/config",
	bytes.NewReader(json))
if err != nil {
	return errors.Wrap(err, "creating new HTTP request for /config")
}
req.Header.Add("content-type", "application/json")
_, err = client.Do(nil, req, nil)
if err != nil {
	return errors.Wrap(err, "posting new config to /config")
}

分析

Kong的db-less模式和nginx-ingress-controller的部署方式是一样的,每个kong或者nginx自带一个监听kubernetes资源的controller,各自独立工作,构成一个完全松散的集群。

这种部署方式有两个好处:第一,组件更少,组件更少意味着依赖关系更简单,不容易出事故;第二,每个转发pod独立工作,不依赖相同的中心组件,避免了中心组件故障引发大规模故障。

采用哪种部署方式,取决于kong的设计定位:

  1. 把kong设计成独立于kubernetes集群的网关,让它可以同时接入kubernets集群中的服务、多个kubernets集群、集群外的服务
  2. 把kong设计成kubernetes集群的一个组件,只负责代理kubernetes中的服务

第一种定位采用带有数据库的部署方式更好,db-less模式没有中心化的配置中心,归整多个来源的配置会困难一些且易出错,不如全部统一到数据库中,也便于管理员进行全局管控。

第二种定位采用db-less模式更好,这时kubernetes集群就是kong的中心化的配置中心,且是唯一配置管理入口,kong退到kubernetes身后。

db-less的模式更实用、更简单,是以后的趋势。

延伸

之前粗略了解过envoy,个人感觉envoy带后发优势,有全面清晰的接口,是一个更好的转发代理组件。 那么是不是可以参照db-less的做法,为envoy写一个controller,组合成一个网关呢?翻出一直没细看的kubernetes文档——Additional controllers,早就有人这样做了:

项目 数据平面 免费社区版 商业服务 主要贡献者 Release次数/贡献人数
Ambassador envoy yes yes Datawire Inc. 265/77
Contour envoy yes no Heptio 23/57
Gloo envoy yes no solo.io, Inc. 92/18
istio envoy yes no Istio Community 56/367
NGINX Ingress Controller from Nginx nginx yes yes NGINX, Inc 23/41
NGINX Ingress Controller from Kubernetes nginx yes no Kubernetes Community 50/377
kong-ingress-controller Kong(nginx/openresty) yes yes Kong Inc. 13/27
traefik go binary yes yes Containous Inc. 246/367
Voyager haproxy yes no AppsCode Inc. 78/48
jcmoraisjr/haproxy-ingress haproxy yes no jcmoraisj 54/23
citrix-k8s-ingress-controller Citrix’s MPX/VPX/CPX no yes Citrix Systems, Inc. 0/11
F5 BIG-IP Controller for Kubernetes F5 hardware no yes F5 .Inc unknow


详情见:基于Envoy的ApiGateway/Ingress Controller项目梳理(总结)

另外上表中有两个基于nginx的ingress-controller,它们是两个项目:

  1. NGINX Ingress Controller from Nginx是Nginx官方维护的,文档
  2. NGINX Ingress Controller from Kubernetes是Kubernetes社区维护的,文档

参考

  1. Kong 1.1.0 ChangeLog
  2. Additional controllers

kong

  1. API网关Kong学习笔记(二十六): Kong 1.1引入db-less模式,无数据库部署
  2. API网关Kong学习笔记(二十五): 重温 kong ingress controller
  3. API网关Kong学习笔记(二十四): 在kubernetes中启用kong的插件
  4. API网关Kong学习笔记(二十三): Kong 1.0.3的plugin/插件机制的实现
  5. API网关Kong学习笔记(二十二): Kong 1.0.3源代码快速走读
  6. API网关Kong学习笔记(二十一): Kong的开发环境设置(IntelliJ Idea)
  7. API网关Kong学习笔记(二十): Kong 1.0.3的安装部署和与Kubernetes的对接
  8. API网关Kong学习笔记(十九): Kong的性能测试(与Nginx对比)
  9. API网关Kong学习笔记(十八): Kong Ingress Controller的CRD详细说明
  10. API网关Kong学习笔记(十七): Kong Ingress Controller的使用
  11. API网关Kong学习笔记(十六): Kong转发请求的工作过程
  12. API网关Kong学习笔记(十五): KongIngress的定义细节
  13. API网关Kong学习笔记(十四): Kong的Admin API概览和使用
  14. API网关Kong学习笔记(十三): 向数据库中插入记录的过程分析
  15. API网关Kong学习笔记(十二): 插件的目录中schema分析
  16. API网关Kong学习笔记(十一): 自己动手写一个插件
  17. API网关Kong学习笔记(十): Kong在生产环境中的部署与性能测试方法
  18. API网关Kong学习笔记(九): Kong对WebSocket的支持
  19. API网关Kong学习笔记(八): Kong Ingress Controller的实现
  20. API网关Kong学习笔记(七): Kong数据平面Plugin的调用与实现
  21. API网关Kong学习笔记(六): Kong数据平面的事件、初始化与插件加载
  22. API网关Kong学习笔记(五): 功能梳理和插件使用-安全插件使用
  23. API网关Kong学习笔记(四): 功能梳理和插件使用-认证插件使用
  24. API网关Kong学习笔记(三): 功能梳理和插件使用-基本使用过程
  25. API网关Kong学习笔记(二): Kong与Kubernetes集成的方法
  26. API网关Kong学习笔记(一): Nginx、OpenResty和Kong入门,基础概念和安装部署
  27. API网关Kong学习笔记(零): 使用过程中遇到的问题以及解决方法

推荐阅读

Copyright @2011-2019 All rights reserved. 转载请添加原文连接,合作请加微信lijiaocn或者发送邮件: [email protected],备注网站合作

友情链接:  系统软件  程序语言  运营经验  水库文集  网络课程  微信网文  发现知识星球