Ingress 和 Ingress controller

Kubernetes 中的 Ingress 是一种资源对象,用于定义如何从 Kubernetes 集群外访问到 Kubernetes 集群内的服务,其中包含了具体的访问规则,通常情况下客户端使用 HTTP/HTTPS 协议进行访问。

客户端可按照 Ingress 资源定义的规则,将客户端请求路由到 Kubernetes 集群中的服务或具体的 Pod 中。

以下是一个 Ingress 资源的示例:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: apisix-gateway
spec:rules:- host: apisix.apache.orghttp:paths:- backend:service:name: apisix-gatewayport:number: 80path: /pathType: Exact

上述示例中包含了以下内容:

  • metadata.name:Ingress 资源的名称
  • spec.rules[].host:外部访问使用的域名
  • spec.rules[].http.paths[].backend:定义了 Kubernetes 集群中服务的相关信息
  • spec.rules[].http.paths[].path:定义了外部服务访问 Kubernetes 集群中服务时使用的路径
  • spec.rules[].http.paths[].pathType:定义了外部服务访问 Kubernetes 集群中服务时路径的匹配规则 从上述内容可以看到,Ingress 资源的语义是相对比较简单的。

Ingress 仅仅是 Kubernetes 中的一种资源定义,它本身不具备任何流量处理能力。要让 Ingress 资源生效,则必须要有 controller 来处理这些 Ingress 资源,通常这样的 controller 我们称之为 Ingress controller。

Ingress controller 会持续地监控或监听 Kubernetes 集群中 Ingress 资源的变化,并根据 Ingress 资源中定义的规则,转换为其数据面中的代理规则,并由数据面来实际的承载流量。

在实际的生产环境中,客户端访问的需求是多种多样的。比如最常见的认证、路由重写等能力,通过 Ingress 资源是无法直接进行描述的。那么这些需求要如何满足呢?

Ingress-NGINX 如何支持扩展功能

首先我以 Kubernetes 社区的 Ingress-NGINX controller 为例,介绍如何在其中使用扩展功能。

在 Ingress-NGINX 项目中,可以为 Ingress 资源增加一些 Annotation 来描述其需要使用的扩展能力。比如使用如下配置便可开启 cors 能力。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:annotations:kubernetes.io/ingress.class: nginxnginx.ingress.kubernetes.io/enable-cors: "true"nginx.ingress.kubernetes.io/cors-allow-origin: https://foo.com,https://bar.comnginx.ingress.kubernetes.io/cors-allow-headers: x-foo-1,x-foo-2nginx.ingress.kubernetes.io/cors-allow-methods: GET,POST,PUTname: nginx-ingress
spec:rules:- host: kubernetes.github.iohttp:paths:- path: /ingresspathType: Exactbackend:service:name: nginxport:number: 80

这种方式仅仅需要为 Ingress 资源添加 Annotations 的配置即可,相对简单。但需要注意,使用这种模式需要 Ingress-NGINX controller 已经完成了对该 Annotations 的完整支持,否则该配置是无效的。

如果需要其他的一些 Ingress-NGINX controller 尚未实现的能力,则需要对其进行二次开发。

在 APISIX Ingress 中使用插件

相较于 Ingress-NGINX controller,APISIX Ingress 使用 APISIX 作为数据面,APISIX 是一个高性能的全动态 API 网关。所有的配置变更都是动态进行的,无需重启,所以对业务流量不会造成任何影响。

在 Apache APISIX Ingress 中可以通过使用插件,来满足用户各种流量处理的需求和具体场景。当前有 80+ 插件开箱即用,当然用户也可以开发自定义插件来进行能力的扩展。

目前,在 Apache APISIX 中支持多种方式进行自定义插件的开发:

  • 使用 Lua 进行插件的开发,这类插件会在 APISIX 内部运行;

  • 使用其他语言进行插件的开发,这种机制叫作 Plugin Runner,利用该机制开发的插件属于 external-plugin。 关于 APISIX 插件的开发,可参考官方文档:

  • 插件开发 https://apisix.apache.org/docs/apisix/plugin-develop/

  • External Plugin 开发:https://apisix.apache.org/docs/apisix/external-plugin/ 了解了 APISIX 的插件开发模式后,接下来将介绍 3 种在 APISIX Ingress 中使用 Lua 语言开发插件的方式。

方式一:纯 CRD 模式

APISIX Ingress controller 支持自己设计的一套 CRD 规范,你可以直接在路由规则中开启插件(无论是内置插件还是自定义插件),例如:

apiVersion: apisix.apache.org/v2beta3
kind: ApisixRoute
metadata:name: httpbin-route
spec:http:- name: rule1match:hosts:- apisix.apache.orgpaths:- /apisix-ingressbackends:- serviceName: apisix-gatewayservicePort: 80plugins:- name: corsenable: trueconfig:allow_origins: http://foo.bar.orgallow_methods: "GET,POST"max_age: 3600expose_headers: x-foo,x-bazallow_headers: x-from-ingressallow_credential: true

通过上述配置可以创建路由规则,并且在此路由中开启 cors 插件。

这是 APISIX Ingress 中最原生支持的方式,这种方式也与 APISIX 更加贴合。同时,用户新增自定义插件后,APISIX Ingress 也无需进行任何二次开发,可直接使用。

方式二:Ingress Annotations 模式

由于 Ingress 资源的语义有限,所以通常情况下我们可以通过 annotations 为资源对象扩展一些信息,这也是最常见的对 Ingress 能力扩展的方式。例如:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:annotations:kubernetes.io/ingress.class: apisixk8s.apisix.apache.org/enable-cors: "true"k8s.apisix.apache.org/cors-allow-origin: https://foo.com,https://bar.comk8s.apisix.apache.org/cors-allow-headers: x-foo-1,x-foo-2k8s.apisix.apache.org/cors-allow-methods: GET,POST,PUTname: apisix-ingress
spec:rules:- host: apisix.apache.orghttp:paths:- path: /apisix-ingresspathType: Exactbackend:service:name: apisix-gatewayport:number: 80

上述配置在 Ingress 资源中增加了 cors 相关的一些信息。APISIX Ingress controller 可以识别这些信息,并将这些信息转换为数据面中 cors 的配置,进而完成对 Ingress 资源的扩展。

但是这种模式下,需要确保在 APISIX Ingress controller 中已经实现了对这些 Annotations 的处理逻辑,如果尚未实现,则需要进行一些二次开发。

如果需要进行二次开发,可参考《如何进行 APISIX Ingress controller 的开发》 。

方式三:CRD + Ingress Annotations 模式

除以上两种方式外,在 APISIX Ingress 中也可以通过 CRD + Ingress Annotations 的方式进行扩展,例如:

apiVersion: apisix.apache.org/v2
kind: ApisixPluginConfig
metadata:name: cors-plugin
spec:plugins:- name: corsenable: trueconfig:allow_origins: http://foo.bar.orgallow_methods: "GET,POST"max_age: 3600expose_headers: x-foo,x-bazallow_headers: x-from-ingressallow_credential: true
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:annotations:kubernetes.io/ingress.class: apisixk8s.apisix.apache.org/plugin-config-name: cors-pluginname: apisix-ingress
spec:rules:- host: apisix.apache.orghttp:paths:- path: /apisix-ingresspathType: Exactbackend:service:name: apisix-gatewayport:number: 80

通过上方的这段配置,可以单独创建名为 cors-plugin 的插件配置,并通过 Ingress 资源的 k8s.apisix.apache.org/plugin-config-name: cors-plugin 对其进行引用。通过这种操作的实际效果与前两个方式基本类似,都会在对应的路由上开启 cors 插件。

在这种模式下,用户的插件配置可以作为独立资源,并且可以被多个 Ingress 资源共享。同时,也无需进行任何二次开发。

总结

本篇主要介绍了 Ingress 资源相关的语义,以及如何对 Ingress 资源进行能力的扩展。在 Ingress-NGINX 中可以通过 Annotations 的方式进行能力的扩展,但在 Apache APISIX Ingress 中可以通过三种模式进行配置。且其中两种对于用户自己开发的自定义插件而言,是无需进行任何二次开发的,进而满足用户更多的场景和需求。

APISIX Ingress 如何支持自定义插件相关推荐

  1. 为什么 APISIX Ingress 是比 Traefik 更好的选择?

    本文可以为正在选型 Kubernetes Ingress Controller 产品的用户提供一些帮助. 作者张晋涛,API7.ai 云原生专家,Apache APISIX Committer.Kub ...

  2. AllsitePasswd 全站密码访问插件 支持自定义主题模板

    简介: AllsitePasswd 是一款启用全站密码访问插件,支持自定义主题模板:@呆滞 欢迎 fork,start 说明: 插件默认自带一套模板 用户可以自定义模板,把你的html模板文件放进th ...

  3. TarsGo新版本发布,支持protobuf,zipkin和自定义插件

    本文作者:陈明杰(sandyskies) Tars是腾讯从2008年到今天一直在使用的后台逻辑层的统一应用框架,目前支持C++,Java,PHP,Nodejs,Golang语言.该框架为用户提供了涉及 ...

  4. uniapp微信小程序图片裁剪插件,支持自定义尺寸、定点等比例缩放、拖动、图片翻转、剪切圆形/圆角图片、定制样式

    qf-image-cropper2.0 图片裁剪插件 1.效果预览: 2.平台支持: 1.支持微信小程序(移动端.PC端.开发者工具) 2.H5平台(2.1.0版本起) 3. 支持APP平台(2.1. ...

  5. openstack页面自定义插件使用详解(django、ajax、post)(zTree为例)

    2019独角兽企业重金招聘Python工程师标准>>> 感谢朋友支持本博客,欢迎共同探讨交流,由于能力和时间有限,错误之处在所难免,欢迎指正! 如有转载,请保留源作者博客信息. Be ...

  6. 让VBCommenter支持自定义用户名

        在使用VBCommenter生成XML格式的注释时,发现在<history></history>标签内的用户名是登陆系统的用户名,而我们的用户名一般是一些简称或其它英文 ...

  7. JQuery自定义插件详解之Banner图滚动插件

      前  言 JRedu JQuery是什么相信已经不需要详细介绍了.作为时下最火的JS库之一,JQuery将其"Write Less,Do More!"的口号发挥的极致.而帮助J ...

  8. ionic2/cordova自定义插件集成aar包

    一.准备自定义插件 1. 准备:安装plugman npm install -g plugman 2. 新建组件 plugman create --name MyPlugin --plugin_id ...

  9. foobar插件_如何为 caddy 添写自定义插件

    如何为 caddy 添写自定义插件 项目地址:https://github.com/yhyddr/quicksilver/tree/master/gosample/caddy-plugin 前言 Ca ...

最新文章

  1. opencv机器学习线性回归_全面讲解手推实战机器学习之线性回归
  2. Shell脚本中command not found报错处理
  3. python知识:用turtle绘制樱桃树
  4. eclipse怎么更改tomcat的上下文访问路径
  5. 计算机数控是什么专业,数控是什么专业
  6. [css] 使用css实现彩虹的效果
  7. 【Python学习】 - anaconda中spyder的常用快捷键总结
  8. java虚拟机堆栈工作原理_java虚拟机工作原理?
  9. ElasticSearch原理
  10. 佳能fax_l150如何打印_佳能faxl150说明书下载
  11. 仿新浪邮件输入自动提示jQuery插件
  12. 如何查看磁盘分区情况
  13. android multimedia框架总结,Android Multimedia框架总结(三)MediaPlayer中创建到setDataSource过程...
  14. 基于时空网络的出租车OD需求预测-模型框架(附数据集下载方式)
  15. 通过UIDocumentInteractionController预览和分享史蒂夫•乔布斯传
  16. Matlab 地理(经纬度)坐标 转 笛卡尔(直角)坐标
  17. 王道考研数据结构之------循环单链表
  18. 通用代码:发送短信并显示倒计时
  19. 验证手机号邮箱,多个以英文逗号分隔
  20. express图片上传

热门文章

  1. linux服务器自动压缩图片,Linux下压缩和优化jpg与png图片的方法
  2. 戴尔台式机win7系统u盘插上去没反应
  3. 构造函数内部原理、原型讲解、写法、运用
  4. Android 实现QQ聊天底部+号显示底部菜单
  5. 李永乐数学基础过关660题2阶高等数学选择题
  6. 长城汽车创新科技来袭,解锁汽车智能安全新高度
  7. vue+elementUI 照片墙图片的删除按钮动态显隐
  8. 股市投资必修课十八---内在价值与DCF评估
  9. springMVC 实现的增删查(没有数据库,用session代替)
  10. 自定义数码管IP核,并让NiosⅡ SBT for Eclipse自动抓取驱动文件