K8S Ingress 之 Apache APISIX 解析

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
全局流量管理 GTM,标准版 1个月
简介: 在云原生时代,基于主流的云操作系统 Kubernetes ,其常见的外部流量访问方式主要基于以下 NodePort、LoadBalancer 以及 Ingress 等。

    在云原生时代,基于主流的云操作系统 Kubernetes ,其常见的外部流量访问方式主要基于以下 NodePort、LoadBalancer 以及 Ingress 等。

    针对 NodePort 方式,在所有节点(虚拟机)上开放一个特定端口,例如:3000,任何发送到该端口的流量都能够被转发到对应服务。其对应服务 Yaml 文件如下:


apiVersion: v1
kind: Service
metadata:
  name: mydemo-service
spec:
  type: NodePort
  selector:
    app: MyDemoApp
  ports:
      # 默认情况下,为了方便起见,`targetPort` 被设置为与 `port` 字段相同的值。
    - port: 80
      targetPort: 80
      # 可选字段
      # 默认情况下,为了方便起见,Kubernetes 控制平面会从某个范围内分配一个端口号(默认:30000-32767)
      nodePort: 30007

      基于 NodePort 方式,其简要拓扑示意结构如下图所示:

    基于此种拓扑结构,存在以下缺陷,具体如下所示:

    1、每一个端口只能为一种服务提供。

    2、端口范围限制,只能是 30000 - 32767 区间。

    3、如果节点或VM 的 IP 地址发生变化,我们需要通过其他方案能够处理这种情况。

    因此,基于以上原因,通常不建议在生产环境上用这种方式暴露服务。如果我们运行的服务不要求一直可用,或者对成本比较敏感,可尝试可以使用这种方法。这样的应用的最佳例子是 Demo 应用,或者某些临时应用。

     关于 LoadBalancer 方式,在使用支持外部负载均衡器的云提供商的服务时,设置 type 的值为 "LoadBalancer", 将为 Service 提供负载均衡器。负载均衡器是异步创建的,关于被提供的负载均衡器的信息将会通过 Service 的 status.loadBalancer 字段发布出去。其对应服务 Yaml 文件如下:


apiVersion: v1
kind: Service
metadata:
  name: mydemo-service
spec:
  selector:
    app: MyDemoApp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376
  clusterIP: 10.0.171.239
  type: LoadBalancer
status:
  loadBalancer:
    ingress:
      - ip: 192.0.2.127

    基于 LoadBalancer 方式,其简要拓扑示意结构如下图所示:

    基于此种拓扑结构,其最大缺陷是基于云厂商所提供的服务,每一个用 LoadBalancer 暴露的服务都会有它自己的 IP 地址,每个用到的 LoadBalancer 都需要付费。

    作为 Kubernetes集群中服务的入口,Ingress 已经被当前的容器生态完全接纳。Ingress 事实上并不是一种服务类型。相反,它处于多个服务的前端,扮演着“智能路由”或者集群入口的角色。以 Traefik Ingress 为例,其对应服务 Yaml 文件如下:


kind: Ingress
apiVersion: extensions/v1beta1
metadata:
  name: "foo"
  namespace: production
spec:
  rules:
    - host: example.net
      http:
        paths:
          - path: /bar
            backend:
              serviceName: service1
              servicePort: 80
          - path: /foo
            backend:
              serviceName: service1
              servicePort: 80

      基于 Ingress 方式,其参考拓扑图如下所示:

    Ingress 是访问Kubernetes集群的入口,流量按 Ingress 资源指定的规则分发到集群内部的上游服务。针对上述相关组件的详细解析与实践,可参考之前文章,具体链接地址为:Kubernetes Ingress深入解析以及Kubernetes Service解析。除了Kubernetes 默认的NGINX Ingress Controller(基于原生 NGINX)之外, 业界也有不少其他第三方的 Ingress Controller 的实现。这也是本篇文章所要解析的内容。Apache APISIX 作为国内最快毕业的 Apache 顶级项目,实现了Apache APISIX Ingress Controller,为Kubernetes用户提供了功能更为便捷的 Ingress 实现。

概念解析

    其实,本质上来讲,Apache APISIX 是一个基于微服务 API 网关,其不仅可以处理南北向的流量,也可以处理东西向的流量即服务之间的流量。Apache APISIX 集成了控制面板和数据面,与其他 API 网关相比,Apache APISIX 的上游、路由、插件全是动态的,修改这些东西时都不用重启。并且 Apache APISIX 的插件也是热加载,可以随时插拔、修改插件。我们来看一下其网络拓扑参考,具体如下所示:

   上面我们解析到 Apache APISIX 是一种 API 网关,其主要基于云原生生态领域,基于Nginx 和 Etcd 实现。那么,基于此种技术,Apache APISIX 能够做些呢,或许这才是核心。截止到目前的版本,其提供以下功能,具体如下:

     1、K8S Nginx Controller 相关功能

     2、替代 Nginx 处理南北向流量

     3、替代 Envoy 处理服务间东西向流量

     4、基于 MQTT 插件作为 IoT 网关

     5、基于 IdP 插件实现零信任网关

     6、处理 L4、L7 层流量,可满足Http、Https、Tcp、Udp、gRPC以及其他

    Apache APISIX Ingress Controller 基于 Apache APISIX, 集成 Kubernetes 的集群管理能力,支持使用 YAML 申明的方式动态配置入口流量的分发规则,绑定插件,并且支持服务发现、配置校验等能力。Apache APISIX Ingress Controller 将配置写入 Apache APISIX,由 Apache APISIX 承载业务流量。

    除此之外,Apache APISIX Ingress Controller 除了覆盖 NGINX Ingress Controller 已有的能力外,还解决了一些 Nginx Ingress Controller 的痛点。具体如下:

    1、配置的动态化加载

    通常情况下,作为接入层的 Ingress Controller ,其承载着服务的入口流量引入,在生产环境中,我们的业务对系统的可靠性有着更高的要求,然而,基于 Apache APISIX Ingress Controller 其能够支持动态配置,即时生效,降低生产事故的意外及风险,有助于提高运维可维护性。

    2、较强的灰度能力

   在实际的业务场景中,有的时候,往往会依据某些特定的需求进行权重调整,结合业务需求按比例进行流量控制,Apache APISIX Ingress Controller 可以支持 Service和 Pod 级别的权重调整,配置清晰而且可读性更强。

    除此,相对于NGINX Ingress Controller 中通过 Annotation 的方式提供 Canary 灰度方案,Apache APISIX Ingress Controller 能够解决其缺陷,从而能够更好的提供灰度策略。

    3、较好的扩展能力

   基于 Apache APISIX 强大的插件能力,Apache APISIX Ingress Controller 通过动态绑定插件来增强功能。Apache APISIX 通过插件封装逻辑,易于管理;完善的文档,易于使用和理解。Apache APISIX Ingress Controller 通过配置即可绑定和解绑插件,无需操作脚本。

设计理念

   通过上述解析,我们可以大概的知晓,Apache APISIX 其设计理念是基于API 网关的数据平面和控制平面分离。控制平面不仅仅能够控制 Apache APISIX ,同时其还能够控制其他组件;数据平面不仅仅能够被自身的控制平面控制,还能被其他组件所控制。由于其基于ETCD 来存储和分发路由数据,默认具备高可用,无单点故障风险。除此之外,其能够友好地支持 Prometheus、SkyWalking 动态追踪、流量复制、故障注入等相关功能。

架构原理

   关于Apache APISIX 架构,其主要分为数据面和控制面,其参考示意图如下所示:

    1、数据平面:以 Nginx 的网络库为基础,(弃用 Nginx 的路由匹配、静态配置和 C 模块),使用 Lua 和 Nginx 动态控制请求流量,通过插件机制来实现各种流量处理和分发的功能:限流限速、日志记录、安全检测、故障注入等,同时支持用户编写自定义插件来对数据面进行扩充。

    2、控制平面:使用 Etcd 来存储和同步网关的配置数据,管理员通过 Admin API 或者 Dashboard 可以在毫秒级别内通知到所有的数据面节点,同时 Etcd 集群也保证了系统的高可用。

    因为 Apache APISIX 使用了 ETCD 作为配置中心,在对应其他组件时会非常方便,可以把 ETCD 直接就当做服务注册发现中心来使用(服务注册、发现),当然同时也支持 Consul、Eureka、Nacos 等服务注册中心。

     接下来,我们来看一下其工作流程,具体如下示意图所示:

    结合上述的架构参考图以及工作流程图,我们再来了解一下 Apache APISIX Ingress Controller 的应用实现场景,具体来说,Apache APISIX Ingress Controller 可以轻松地替换 NGINX Ingress Controller,基于更为便捷的配置方式,动态的调整网关配置。无需 Reload Nginx,配置即会实时生效。

应用场景

   Apache APISIX Ingress 典型的应用场景如下所示:

    基于上述场景,Apache APISIX Ingress 对外提供访问Kubernetes集群的入口,用户通过外部负载均衡器访问到 Apache APISIX Ingress。流量经过 Apache APISIX 路由规则,分发到目标上游服务。

    同时,内部支持通过Kubernetes Service 或者Kubernetes Pod IP + Port 的方式访问上游服务,Apache APISIX Ingress Controller 集成Kubernetes,实现服务自动注册和发现,实时同步Kubernetes状态变更。

    得益于 Apache APISIX 丰富的插件支持,可以通过绑定插件,轻松扩展 Ingress 的能力。比如,限流、熔断、灰度发布、跨域、用量管控、健康检查等。更为甚至可以自定义插件,满足特殊业务场景。比如,配合 Apache APISIX Ingress Controller 的服务发现机制,实现自定义的负载均衡能力。

   最后,我们来看个简单的 Demo 示例,通过 ApisixRoute 定义一个路由,指向端口是 5555 的上游服务。具体 Yaml 文件内容如下:


apiVersion: apisix.apache.org/v1
kind: ApisixRoute
metadata:
  name: demo-route
spec:
  rules:
  - host: demo.apisix.apache.org
    http:
      paths:
      - backend:
          serviceName: foo
          servicePort: 5555
        path: /luga*


    当访问 demo.apisix.apache.org/luga 时,Apache APISIX Ingress 将会把请求转发到上游 foo 服务。我们来定义 Proxy-Rewrite 插件,实现转发给上游服务的同时修改 Host 和 Uri。具体如下:


piVersion: apisix.apache.org/v1
kind: ApisixRoute
metadata:
  name: demo-route
spec:
  rules:
  - host: demo.apisix.apache.org
    http:
      paths:
      - backend:
          serviceName: foo
          servicePort: 5555
        path: /luga*
  plugins:
  - enable: true
    name: proxy-rewrite
    config:
      regex_uri:
      - '^/(.*)'
      - '/extend/$1'
      scheme: http
      host: foo-beta.apisix.apache.org

    目前,基于社区的最新进展,在保证现有功能的稳定迭代的同时,Apache APISIX Ingress 后续也将支持 VM Cluster 的部署方式,作为 VM Ingress,丰富服务注册/发现场景,比如,支持 Consul 等注册中心,与此同时,支持 VM Cluster 与 Kubernetes Cluster 统一配置。至此,关于 Apache APISIX Ingress 相关解析本文到此为止,大家有什么疑问、想法及建议,欢迎留言沟通。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
19天前
|
安全 网络协议 应用服务中间件
AJP Connector:深入解析及在Apache HTTP Server中的应用
【9月更文挑战第6天】在Java Web应用开发中,Tomcat作为广泛使用的Servlet容器,经常与Apache HTTP Server结合使用,以提供高效、稳定的Web服务。而AJP Connector(Apache JServ Protocol Connector)作为连接Tomcat和Apache HTTP Server的重要桥梁,扮演着至关重要的角色
42 2
|
23天前
|
Kubernetes 应用服务中间件 nginx
Kubernetes上安装Metallb和Ingress并部署应用程序
Kubernetes上安装Metallb和Ingress并部署nginx应用程序,使用LoadBalancer类型的KubernetesService
92 3
|
2月前
|
Kubernetes 应用服务中间件 API
【Ingress 秘籍】集群进出流量的总管:揭秘 Kubernetes 中 Ingress 的终极奥秘!
【8月更文挑战第25天】Ingress是Kubernetes中用于管理HTTP与HTTPS流量进入集群的核心功能。作为集群内外通信的桥梁,Ingress通过定义规则将外部请求导向内部服务。本文详细介绍了Ingress的基本概念、配置方法及其实现方式。通过使用不同的Ingress控制器(如Nginx、Traefik等),用户可以根据需要选择最适合的方案。文中还提供了示例代码展示如何创建服务、部署应用及配置Ingress规则。
62 6
|
21天前
|
分布式计算 Java Apache
Apache Spark Streaming技术深度解析
【9月更文挑战第4天】Apache Spark Streaming是Apache Spark生态系统中用于处理实时数据流的一个重要组件。它将输入数据分成小批次(micro-batch),然后利用Spark的批处理引擎进行处理,从而结合了批处理和流处理的优点。这种处理方式使得Spark Streaming既能够保持高吞吐量,又能够处理实时数据流。
53 0
|
2月前
|
Kubernetes 负载均衡 应用服务中间件
在k8S中,ingress是什么?
在k8S中,ingress是什么?
|
2月前
|
API UED 开发者
超实用技巧大放送:彻底革新你的WinForms应用,从流畅动画到丝滑交互设计,全面解析如何在保证性能的同时大幅提升用户体验,让软件操作变得赏心悦目不再是梦!
【8月更文挑战第31天】在Windows平台上,使用WinForms框架开发应用程序时,如何在保持性能的同时提升用户界面的吸引力和响应性是一个常见挑战。本文探讨了在不牺牲性能的前提下实现流畅动画与交互设计的最佳实践,包括使用BackgroundWorker处理耗时任务、利用Timer控件创建简单动画,以及使用Graphics类绘制自定义图形。通过具体示例代码展示了这些技术的应用,帮助开发者显著改善用户体验,使应用程序更加吸引人和易于使用。
65 0
|
2月前
|
Kubernetes 负载均衡 网络协议
在K8S中,DNS组件有什么特性?
在K8S中,DNS组件有什么特性?
|
2月前
|
Kubernetes API 网络安全
在K8S中,ingress该如何使用?
在K8S中,ingress该如何使用?
|
2月前
|
存储 Kubernetes 网络协议
在K8s中,提供的DNS组件是什么?有什么特性?
在K8s中,提供的DNS组件是什么?有什么特性?
|
2月前
|
安全 搜索推荐 数据挖掘
文件解析的终极工具:Apache Tika
文件解析的终极工具:Apache Tika
71 0

热门文章

最新文章

推荐镜像

更多
下一篇
无影云桌面