说明
如果不知道kong怎么部署,参考Kong API网关搭建部署记录
这里简单描述一下怎么修改官方的YAML文件,不保证
ctrl+c
和ctrl+v
可以直接跑起来!kong-ingress-controller的版本号是
0.5.0
kong的版本号是
1.2
Kong-Ingress-Controller介绍
这里是参考项目文档,简单的翻译一下。
简介
Kong Ingress Controller是一个动态且高度可用的Ingress Controller。
它使用在Kubernetes集群中创建的Ingress资源来配置Kong。
此外,它还可以为Kubernetes中运行的服务配置插件,负载平衡和运行状况检查。
部署方式
kong的ingress-controller是Go编写的程序,作用机制类似于Adapter,将Kubernetes里面的资源对象转换成Kong的配置规则。
支持backed with a database
模式和backed without a database
模式。
DBless模式
运行在DBless模式下,Kong ingress controller会作为sidecar容器与Kong容器一起运行在同一个Pod里面,并且会根据从Kubernetes API Server接收到的信息动态配置Kong。
支持增加kong容器副本数量来实现高可用和负载均衡。
后端数据库模式
运行在基于后端数据库的模式时,ingress controller与kong的控制平面部署在一起,kong的数据平面分开部署。
在下图可以看明显看到kong的控制平面和数据平面是分开的。
高可用
当部署多个kong ingress controller时,多个kong ingress controller之间会选举出leader。同一时间只有leader能配置kong的规则,并且leader失效后会自动选主。
横向扩展
如果是基于后端数据库模式,kong的控制平面和数据平面分开部署,可以单独增加kong的数据平面来实现横向扩展。
规则转换
下图是Kubernetes资源对象怎么转换成Kong配置规则的过程
PS:这个图感觉怪怪的,这哪里有转换过程,不是Kubernetes的Ingress对象模型吗
CRD资源
Kong ingress controller可以配置以下CRD资源对象,实现对kong更加精细的配置管理,官方文档在这里
- KongIngress
- KongPlugin
- KongConsumer
- KongCredential
官方YAML模板
说明
链接在这里YAML模板,下面几个资源对象可以直接套官方
- Namespace
- CustomResourceDefinition
- ServiceAccount
- ClusterRole
- ClusterRoleBinding
其他的资源对象的定义还是有点不适合生产环境,需要改。
基于后端数据库模式部署
说明
Kubernetes集群环境不一定有
ELB
或者SLB
,可以在Ingress节点上部署keepalived+haproxy实现高可用和负载均衡使用外部独立的
PostgreSQL
,部署方式见PostgreSQL10安装部署和初始化,数据库用户kong
,密码kong
kong数据平面
- 通过
nodeSelector
加tolerations
将Pod调度到Kubernetes指定的Ingress节点 - 修改
kong数据平面
运行参数 - 共享宿主机网络栈
- 通过
PostgreSQL数据库
这里使用Service配合Endpoints,将外部PostgreSQL声明为Kubernetes内部的服务。
这样Kubernetes内部的Pod可以通过SVC访问外部PostgreSQL。
1 |
|
Kong Bootstrap Job
- kong-ingress-migrations
1 |
|
Kong数据平面
- kong-proxy TLS证书
可以通过kubectl命令生成Secret
1 | kubectl -n kong create secret tls kong-tls-secret --key ./tls.key --cert ./tls.crt |
- kong-ingress-proxy.yaml
1 |
|
Kong控制平面
- kong-ingress-controller.yaml
1 |
|
基于无数据库模式部署
说明
- 在DBless模式中,每个kong都是独立工作的,由Kong-Ingress-Controller作为sidecar调用kong的config接口来实现配置更新。
- 这样就有点像把kong的配置保存在Kubernetes里面,每个kong都是独立配置,不需要依赖外部数据库,避免因为数据库故障影响所有的kong。
- DBless模式有些限制,可以看这里
KongIngressDBless
- kong-proxy TLS证书
可以通过kubectl命令生成Secret
1 | kubectl -n kong create secret tls kong-tls-secret --key ./tls.key --cert ./tls.crt |
- kong-ingress-controller-dbless-cm.yaml
1 |
|
- kong-ingress-controller-dbless-ds.yaml
1 |
|
CRD资源
关于CRD资源怎么用,在Github上面是有相关的说明文档
KongPlugin
在kong官方网站是有关于Plugin的介绍
开启IP黑白名单
1 | apiVersion: configuration.konghq.com/v1 |
开启prometheus
1 | apiVersion: configuration.konghq.com/v1 |
开启rate-limiting
1 | apiVersion: configuration.konghq.com/v1 |
开启zipkin链路追踪
1 | apiVersion: configuration.konghq.com/v1 |
开启Basic Authentication
这里认证的时候会查找
KongConsumer
和KongCredential
1 | apiVersion: configuration.konghq.com/v1 |
配置Response Header
1 | apiVersion: configuration.konghq.com/v1 |
KongIngress
1 | apiVersion: configuration.konghq.com/v1 |
KongConsumer
示例
1 | apiVersion: configuration.konghq.com/v1 |
KongCredential
示例
1 | apiVersion: configuration.konghq.com/v1 |
Kubernetes Ingress配置
在Ingress里面声明
annotations
属性,可以调用Kong Ingress Controller
定义的CRD资源
1 | apiVersion: extensions/v1beta1 |