APISIX Ingress 如何支持自定义插件

news2024/11/23 11:23:13

摘要:本篇主要介绍了 Ingress 资源相关的语义,以及如何对 Ingress 资源进行能力的扩展。

作者:张晋涛,API7.ai 云原生技术专家,Apache APISIX PMC 成员,Apache APISIX Ingress Controller 项目维护者。

Ingress 和 Ingress controller

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

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

3df3234c-7ae7-48de-8dbb-0449226e4f2e.png

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

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: apisix-gateway
spec:
  rules:
  - host: apisix.apache.org
    http:
      paths:
      - backend:
          service:
            name: apisix-gateway
            port:
              number: 80
        path: /
        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: nginx
    nginx.ingress.kubernetes.io/enable-cors: "true"
    nginx.ingress.kubernetes.io/cors-allow-origin: https://foo.com,https://bar.com
    nginx.ingress.kubernetes.io/cors-allow-headers: x-foo-1,x-foo-2
    nginx.ingress.kubernetes.io/cors-allow-methods: GET,POST,PUT
  name: nginx-ingress
spec:
  rules:
  - host: kubernetes.github.io
    http:
      paths:
      - path: /ingress
        pathType: Exact
        backend:
          service:
            name: nginx
            port:
              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+ 插件开箱即用,当然用户也可以开发自定义插件来进行能力的扩展。

output.png

目前,在 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: rule1
   match:
     hosts:
     - apisix.apache.org
     paths:
       - /apisix-ingress
   backends:
   - serviceName: apisix-gateway
     servicePort: 80
   plugins:
   - name: cors
     enable: true
     config:
       allow_origins: http://foo.bar.org
       allow_methods: "GET,POST"
       max_age: 3600
       expose_headers: x-foo,x-baz
       allow_headers: x-from-ingress
       allow_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: apisix
    k8s.apisix.apache.org/enable-cors: "true"
    k8s.apisix.apache.org/cors-allow-origin: https://foo.com,https://bar.com
    k8s.apisix.apache.org/cors-allow-headers: x-foo-1,x-foo-2
    k8s.apisix.apache.org/cors-allow-methods: GET,POST,PUT
  name: apisix-ingress
spec:
  rules:
  - host: apisix.apache.org
    http:
      paths:
      - path: /apisix-ingress
        pathType: Exact
        backend:
          service:
            name: apisix-gateway
            port:
              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: cors
      enable: true
      config:
        allow_origins: http://foo.bar.org
        allow_methods: "GET,POST"
        max_age: 3600
        expose_headers: x-foo,x-baz
        allow_headers: x-from-ingress
        allow_credential: true
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: apisix
    k8s.apisix.apache.org/plugin-config-name: cors-plugin
  name: apisix-ingress
spec:
  rules:
  - host: apisix.apache.org
    http:
      paths:
      - path: /apisix-ingress
        pathType: Exact
        backend:
          service:
            name: apisix-gateway
            port:
              number: 80

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

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

总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/91596.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于C++ 实现简易图书管理系统【100010046】

图书管理系统 基于 C 实现简易图书管理系统 该项目是在学习完 C 语言后,独立完成设计开发的简易图书管理系统 设计的基本要求 基本完成对图书系统的设计,包含基本的功能,无界面设计。 要有明显的分类,对不同的进入者有不同的…

机器学习算法原理归纳总结:回归、聚类、支持向量、推荐、降维与神经网络

机器学习算法原理归纳总结:回归、聚类、支持向量、推荐、降维与神经网络 本文重点参考:唐宇迪博士的课程PPT [特别鸣谢] 完整版资料下载:机器学习算法原理详解代码实战 1.回归算法 2.逻辑回归 3.决策树 决策树实际上是根据样本的特征个数对样…

汇编语言第二章:寄存器

2. 寄存器 寄存器进行信息的存储,对于汇编程序员来说,CPU 中的主要部件是寄存器。8086CPU 有 14 个寄存器,这些寄存器分别是: AX BX CX DX SI DI SP BP IP CS SS DS ES PSW通用寄存器 8086所有的寄存器都是 16 位的&#xff0c…

Android Rust JNI系列教程(二) 创建第一个Rust JNI项目

前言 提到JNI,大家都会想到C,C.不过如今rust又给我们增加了一个选项,借助rust的jni库(https://github.com/jni-rs/jni-rs),我们可以很方便的使Android与rust交互.从本章起,我们将逐步地了解使用rust实现一些经典的jni方法. 创建Rust项目 创建工程 在命令行输入命令: cargo…

超算/先进计算的发展与应用是什么?

经过近十年的快速发展,我国在超算领域的实力已达到世界先进水平。1993年,我国第一台高性能计算机“曙光一号并行机”研制成功,打破了国外IT巨头对我国超算技术的垄断。 自此,我国不断加快超级计算机研制步伐。从全球超级计算机TO…

精华推荐 | 【MySQL技术专题】「主从同步架构」全面详细透析MySQL的三种主从复制(Replication)机制的原理和实战开发(原理+实战)

前提概要 随着应用业务数据不断的增大,应用的响应速度不断下降,在检测过程中我们不难发现大多数的请求都是查询操作。此时,我们可以将数据库扩展成主从复制模式,将读操作和写操作分离开来,多台数据库分摊请求&#xff…

NEUQACM双周赛(三)

目录7-1 打字(C)题目描述:输入格式:输出格式:输入样例1:输出样例1:输入样例2:输出样例2:解题思路:7-2 分香肠(C,最大公约数)题目描述:输入格式:输出格式:输入样例:输出样例:解题思路…

节能降耗 | AIRIOT智慧电力综合管理解决方案

电力技术的发展推动各行各业的生产力,与此同时,企业中高能耗设备的应用以及输配电过程中的电能损耗,也在一定程度上加剧了电能供应压力。以工业制造业为例,企业的管理水平、能耗结构、生产组织方式都关系到能源的有效利用率&#…

电子招投标系统nodejs+vue+elementui

前端技术:nodejsvueelementui 前端:HTML5,CSS3、JavaScript、VUE 1、 node_modules文件夹(有npn install产生) 这文件夹就是在创建完项目后,cd到项目目录执行npm install后生成的文件夹,下载了项目需要的依赖项。 2、packag…

电商新模式——链动2+1模式为你带来社交电商新思路

随着流量入口价值的降低,电商 IP 时代的来临,移动社交电商获得了飞速的发展,在运营与营销的过程中,商家们往往为了降低营销成本,主动制造消费理由,通过各类促销、折扣来刺激消费,然而在回归商业…

Web3中文|NFT如何促进教育的发展?

自问世以来,NFT已经被应用于教育、艺术等多个领域。不过,相较于艺术行业,大多数人对NFT在教育界的作用知之甚少。 那么,就让我们来看看它们在课堂内外的影响都有哪些。 得益于区块链技术,NFT可以提高教育质量&#x…

【蓝桥杯选拔赛真题52】Scratch正话反说 少儿编程scratch图形化编程 蓝桥杯选拔赛真题讲解

目录 scratch正话反说 一、题目要求 编程实现 二、案例分析 1、角色分析

Android Rust JNI系列教程(三) Rust与Android互相调用

前言 Rust的JNI流程以及方法实际上和我们常见的C JNI是十分相似的.我们本章将使用Rust实现常见的JNI调用功能.关于更多的用法,可参考官方示例,github地址为https://github.com/jni-rs/jni-rs/blob/master/example/mylib/src/lib.rs. 基本交互功能实现 1. Java传String,返回b…

Java集合复习

文章目录集合概述、collection集合体系特点Collection集合的遍历增强for循环集合概述、collection集合体系特点 集合都是支持泛型的&#xff0c;但是集合只能存储对象&#xff0c;因此集合也叫做对象集合。 public static void main(String[] args) {Collection<String>l…

分布式 | 令人头疼的堆外内存泄露怎么排查?

作者&#xff1a;鲍凤其 爱可生 dble 团队开发成员&#xff0c;主要负责 dble 需求开发&#xff0c;故障排查和社区问题解答。少说废话&#xff0c;放码过来。 本文来源&#xff1a;原创投稿 *爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联…

OpenFace Win10 运行和抽离部分代码

需求&#xff1a;提取出OpenFace中的GazeAnaLyser 中的部分代码往一个写好的接口里面放&#xff0c;主要实现提取面部的所有关键点&#xff0c;估计出视线的功能&#xff1b; 一&#xff0c;openface的安装与使用 在win10上把openface跑起来这个链接够用了&#xff0c;这里主要…

非零基础自学Golang 第5章 流程控制 5.2 循环控制

非零基础自学Golang 文章目录非零基础自学Golang第5章 流程控制5.2 循环控制5.2.1 for循环5.2.2 break 跳出循环5.2.3 continue 继续循环第5章 流程控制 5.2 循环控制 5.2.1 for循环 Go语言中的循环逻辑通过for关键字实现。不同于其他编程语言&#xff0c;Go语言没有while关…

NeurIPS2022 | OmniVL: 用于Image-Language和Video-Language任务的通用模型

原文标题&#xff1a;OmniVL: One Foundation Model for Image-Language and Video-Language Tasks 论文链接&#xff1a;OmniVL: One Foundation Model for Image-Language and Video-Language Tasks | OpenReview 三模态统一的工作。 一、问题提出 旨在设计一个全视觉语言…

正点原子基于库和寄存器建立keil的工程文件简单理解(不是具体步骤)

下载mdk 个人上传免费的pdf:https://download.csdn.net/download/weixin_43794311/87232741&#xff0c;或直接到正点原子官网下载 https://www.keil.com/download/ 两种建立方式的本质理解 库函数是有人基于寄存器已经完成对寄存器的设置&#xff0c;只要根据函数参数意义&…

【Uni-App】vscode 开发uni-app 配置eslint、prettier 实现代码检查和代码自动格式化

目录一&#xff1a;前言二、利用HBuilderX创建uni-app项目三、配置代码检查和代码自动格式化1. 在vscode中打开项目2. 创建package.json3. 添加eslint、prettier相关依赖4. 配置.eslintrc.js5. 配置.prettierrc.json6. 配置.editorconfig7. 配置.eslintignore如果以上还不生效&…