为什么 Higress 是 Knative 入口网关的最佳实践?

作者:赵伟基(兆维)

在传统的应用开发中,通常需要管理底层的基础设施、服务器与网络配置等方面的工作。然而在云原生 Serverless 化的浪潮下,这些基础设施的细节被抽象和自动化,开发者无需关注服务器等配置、扩展、监控和维护等工作,可以更专注于应用程序的业务逻辑和功能开发。Serverless 架构的价值在于提供高效、弹性、无服务器管理、服务按需付费、快速部署与迭代、以及高可扩展性等优势,降低开发和运维的复杂性,提高开发效率和应用程序的质量。

Knative Serving 是一款基于 K8s 的 Serverless 开源平台,用于构建和管理现代化、可拓展、流量驱动、无服务器的应用程序。Knative Serving 提供了诸多特性来支持用户部署 Serverless 服务,如基于 HTTP 流量触发 pod 的自动扩缩容、服务版本修订、自动流量管理、故障恢复等。

图片

来源:https://knative.dev/docs/serving/architecture/

Knative 整体架构如上层所示,Controller 和 DomainMapping 等组件等负责管理 KnativeCRD 资源的生命周期,其弹性能力由核心的 Activator、Autoscaler 和 Queue-Proxy 等组件提供。网络和路由能力依赖各类 Ingress Gateway 提供。

本文重点关注 Knative 网络层能力的实现。Knative 网络层能力需要依赖 Knative Ingress CRD 与其他网络层组件实现。目前,Knative 官方提供了基于 Contour、Istio 和 Kourier 等作为其网络层组件,提供有限的网络能力,如基本的路由、认证鉴权和 TLS 等,可以满足基本的路由和安全要求。Higress 是安全、流量和微服务三合一的云原生网关,使用 Higress 作为 Knative 服务的流量入口能够获得更强的流量治理、安全防护、可观测和可扩展能力。

图片

Knative 网络层工作原理

接下来我们以 Net-Istio 为例,介绍 Knative Serving 通过网络层实现服务对外发布的过程。Net-istio 网络层将数据面与控制面进行分离。数据面采用 Envoy,负责处理网络流量。控制面负责管理与配置数据面,支持对网关的动态配置和管理。

图片

当有 KService 被部署的时候,Knative Serving Controller 将解析 Kservice 中的路由项并生成对应的 KIngress 资源。KIngress 是 Knative 的 CRD,其资源中包含了服务对外披露所需的所有信息,示例如下:

apiVersion: networking.internal.knative.dev/v1alpha1
kind: Ingress
metadata:annotations:networking.knative.dev/ingress.class: istio.ingress.networking.knative.dev #指定istio作为网络层name: hellonamespace: default
spec:httpOption: Enable #用于定义是否开启HTTPS重定向rules:- hosts:- hello.default.example.comhttp:paths:- splits: #Split定义了流量按百分比分配分配到不同的服务修订上。- appendHeaders:Knative-Serving-Namespace: defaultKnative-Serving-Revision: hello-00001percent: 100serviceName: hello-00001serviceNamespace: defaultservicePort: 80visibility: ExternalIP  #定义服务是仅集群内可访问还是对外披露。tls:  #指定通过HTTPS协议披露Kservice时使用的证书及密钥。- hosts:- hello.default.example.comsecretName: route-ecbe0df2-101a-4aa4-8cf9-f2e98773fcdfsecretNamespace: default

以 Istio 作为网络层为例,Net-Istio 组件监听集群中的 Kingress资源。每次 Kingress 被创建、删除或者修改的时候,Net-Istio 会同步解析 Kingress 资源,将 KIngress 的路由配置转换为 Istio 的 Virtual Service 和 Gateway 等资源。Istio 监听 VirtualService,并通过 xDS 下发路由配置给数据面 Envoy,从而完成路由配置的传递。

Envoy 接收到这个路由目标集群的 EDS 数据后,根据 Service 关联到的 Endpoint 的 IP 将请求转发给 Activator Pod 或者 Revision Pod。处于冷启动状态或者缩容状态时,Knative Controller 会将 Service 关联到的 Endpoint 设置为 Activator 的 Pod IP;处于稳定态时,Service 关联的 Endpoint 将被设置为用户部署的 Revision Pod IP。

理顺 Knative 网络层的工作原理后,我们可发现在 Knative 网络层中控制面实际承担的功能如下:

  1. 监听并获取 Knative Service 产生的 KIngress 资源。
  2. 将 KIngress 资源映射为数据面 Envoy 配置信息。
  3. 将配置信息披露给其管理的 Envoys。

不同的 Knative 网络层控制面通过自身机制完成路由配置的转化和传递,实现基本的路由能力。但在更复杂的应用场景下,现有网络层可能无法完全满足诸如安全、认证、可观测、细粒度流量治理与可扩展等方面的需求。一个解决的思路是在 Knative 网络层之上继续集成诸如安全网关、流量网关与可观测平台等组件,但多层网关的设计无疑会占用更多运行资源、增加运维成本。

Higress 适配 Knative Serving 方案

为了拓展 Knative 对各种场景的适应能力,叠加多层网关显然不是最好的选择。Higress 云原生网关作为集安全、流量、微服务三位于一体的下一代云上网关,使用 Higress 作为 Knative 服务的流量入口能够获得更强的流量治理、安全防护、可观测与可拓展能力,在稳定性、安全性上更有保证。目前,Higress 可以通过两种方式适配 Knative Serving,并在控制面能力进行了增强。

方案一:Higress+KIngress

图片

本方案适配 Knative Serving 的工作原理与其他 Knative 网络层类似,包含 KIngress 的监听与更新、路由配置的转换与数据面配置推送等过程。与此同时,Higress 兼容了 Knative Serving 网络层的所有特性,如不同服务修订间的流量划分、TLS、超时、重试、流量打标、自动端点发现等,确保 Knative 服务能够轻松使用 Higress 作为其流量入口。

值得一提的是,在此方案中,Higress 脱离了对其他自定义资源的依赖,只依赖于 Knative Serving 管理的 KIngress 资源与 K8s 集群通用资源如 endpoints,secrets 等,以一种更加“原生”的方式适配了 Knative。

得益于与微服务技术栈的良好集成和 WASM 扩展机制,Higress 能够为 Knative 服务提供诸如认证鉴权、限流、Waf 防护与可观测等更强大的能力。Serverless 服务开发者将无需关注基本能力的实现,只需关注于开发自己的业务逻辑。Higress 推出插件市场,在满足基本的安全、限流、认证鉴权等需求的同时,开放了自定义插件的接口,帮助用户更好的适配自身的 Serverless 应用。

方案二:Higress+IstioCRD

Higress 可以通过自己对 IstioCRD 的兼容能力来代替 Istio 成为 Knative 网关的控制面。具体方案如下图所示。不难看出,本方案是基于 Higress 对 IstioCRD 的兼容能力,通过 net-istio-controller 完成路由配置向 IstioCRD 的转化,Higress Controller 解析 IstioCRD 资源并进行配置的数据面下发,从而完成路由配置的传递。

图片

方案比较

Higress+Kingress 与 Higress+IstioCRD 都可以实现 Knative 网络层的能力,并兼容 Higress 在流量治理、安全防护、可观测和可扩展等方面的大部分能力。Istio 是个优秀的服务网格解决方案,但如果在应用场景中不需要服务网格,IstioCRD 反而会给集群带来额外的复杂度与资源消耗。而 Higress+KIngress 方案脱离了对其他自定义资源的依赖,以一种更加“原生”的方式适配了 Knative 且能力不打折。

Higress 对接 Knative 服务实践

前提条件

  1. 已安装 kubectl [ 1] 、Helm [ 2] 、Knative CLI (kn) [ 3]
  2. 已有 K8s 集群,版本在 Kubernetes v1.24 或以上。为演示方便,本文在本地 K8s 集群上进行实践。
  3. 安装 Knative CRD 与 Knative Serving 组件,详情可参考 Knative 安装指南 [ 4]
  4. 安装 Higress [ 5]

📌注:Higress Controller 部署时会进行 Knative CRD 检查,安装 Higress 前请确认 KnativeCRD 已经安装。

方案一:Higress+KIngress

配置 Knative 与 Higress 的适配项

  1. 配置 Knative 使用 Higress 作为 Ingress :
kubectl patch configmap/config-network \--namespace knative-serving \--type merge \--patch '{"data":{"ingress-class":"higress"}}'
  1. Knative 默认的路由策略是围绕域名展开的,需要设置 Knative 域名:
kubectl edit configmap config-domain -n knative-serving

通过编辑 configmap 中的 data 项来修改默认域名。本实践将默认域名修改为 example.com。该修改生效后,所有的 Knative 服务与路由将自动更新域名。

apiVersion: v1
data:example.com: ""
kind: ConfigMap
  1. 确认 Higress 对 Knative 资源的 RBAC 权限:
kubectl get clusterrole higress-controller-higress-system -o yaml

RBAC 权限列表中应有下列字段,如没有请通过 kubectl edit 命令手动添加:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
rule:...
- apiGroups:- networking.internal.knative.devresources:- ingressesverbs:- get- watch- list
- apiGroups:- networking.internal.knative.devresources:- ingresses/statusverbs:- get- patch- update

完成上述配置后,即可使用 higress 无缝对接 Knative 服务。

Higress 兼容 Knative 网络层特性功能验证

1. 部署 Knative 服务

kn service create hello \
--image ghcr.io/knative/helloworld-go:latest \
--port 8080 \
--env TARGET=World
#Expected Output
Service hello created to latest revision 'hello-00001' is available at URL: 
http://hello.default.${LOADBALANCER_IP}.example.com
#其中${LOADBALANCER_IP}即为Higress Gateway IP,本地k8s集群部署时为空。

2. 验证 Knative AutoScaling

向 Hello 服务发送请求:

#本地部署时,LOADBALANCER_IP为127.0.0.1,此处通过No DNS的方式模拟
curl -H "host: hello.default.example.com" http://${LOADBALANCER_IP}
#Expected Output
Hello World!

通过下列命令观察 AutoScaling 过程:

kubectl get pod -l serving.knative.dev/service=hello -w

可以观察到请求转发到 Hello Service 上时触发了扩容过程,当一段时间没有请求时,Pod 数量自动缩容到 0:

NAME                                      READY   STATUS              RESTARTS   AGE
hello-00001-deployment-689c99c59b-6f5fw   0/2     Pending             0          0s
hello-00001-deployment-689c99c59b-6f5fw   0/2     ContainerCreating   0          0s
hello-00001-deployment-689c99c59b-6f5fw   1/2     Running             0          1s
hello-00001-deployment-689c99c59b-6f5fw   2/2     Running             0          1s
hello-00001-deployment-689c99c59b-6f5fw   2/2     Terminating         0          62s
hello-00001-deployment-689c99c59b-6f5fw   1/2     Terminating         0          91s
hello-00001-deployment-689c99c59b-6f5fw   0/2     Terminating         0          92s

3. 验证 Knative Traffic Splitting

KIngress 定义的 Traffic Splitting 特性负责管理不同 Knative 服务修订(Revision)间的流量划分规则。这个特性可以用于 Knative 服务蓝绿发布与灰度部署。Revision 是应用程序代码和配置的即时快照。每次更改 Knative 服务的配置时,都会创建一个新的修订。当有新修订发布时,Higress 会根据 KIngress 中的路由规则在 Knative 服务的不同版本之间划分流量。

创建 Hello 服务新的修订:

kn service update hello --env TARGET=Knative
#Expected Output   
Service 'hello' created to latest revision 'hello-00002' is available at URL:
http://hello.default.${LOADBALANCER_IP}.example.com

设置不同修订的流量百分比,其中 hello-00001 的流量百分比为 50%,hello-00002 的流量百分比为 50%。

kn service update hello --traffic hello-00001=50  --traffic @latest=50

多次向 Hello 服务发送请求,可以观察到流量被划分到两个不同的 Revision 上,并且比例满足设定的流量比例:

#Expected Output   
Hello Knative!
Hello World!
Hello Knative!
Hello World!

基于 Higress 插件增强 Knative 网络层能力

前文提到,Higress 能够为 Knative 服务提供诸如认证鉴权、限流、Waf 防护与可观测等更强大的能力。在本节实践中我们将结合 Higress 插件市场中的 key-auth 和 key-rate-limit 插件来简要演示 Higress 作为 Knative 网络层能够提供的认证鉴权和限流的能力。

1. 验证 Higress 对 Knative 服务的限流能力

设置限流规则,部署 key-rate-limit 插件。详情可参考基于 Key 限流 [6 ]

apiVersion: extensions.higress.io/v1alpha1
kind: WasmPlugin
metadata:name: key-rate-limitnamespace: higress-system
spec:defaultConfig:_rules_:# 规则二:按域名匹配生效- _match_domain_:- "hello.default.example.com"limit_by_header: x-ca-keylimit_keys:- key: 123456query_per_minute: 2url: oci://higress-registry.cn-hangzhou.cr.aliyuncs.com/plugins/key-rate-limit:1.0.0

上述配置具体含义如下,含请求头 “x-ca-key: 123456” 的请求速率将被限制为每分钟 3 次,1 分钟内超过 3 次的请求无法访问到 Knative 服务,该配置对 Knative 服务域名 “hello.default.example.com” 生效。我们通过如下请求进行验证:

curl -H "Host: hello.default.example.com" http://127.0.0.1 -H "x-ca-key: 123456" 
Hello World!    #正常请求到Knative服务,返回200
curl -H "Host: hello.default.example.com" http://127.0.0.1 -H "x-ca-key: 123456" 
Hello Knative!  #正常请求到Knative服务,返回200
curl -H "Host: hello.default.example.com" http://127.0.0.1 -H "x-ca-key: 123456" 
rate_limited   #触发限流,返回429

2. 验证 Higress 对 Knative 服务的认证鉴权能力

设置认证鉴权的相关规则,部署 key-auth 插件。详情可参考基于 Key 认证 [ 7]

apiVersion: extensions.higress.io/v1alpha1
kind: WasmPlugin
metadata:name: key-authnamespace: higress-system
spec:defaultConfig:consumers:- credential: 2bda943c-ba2b-11ec-ba07-00163e1250b5name: consumer1- credential: c8c8e9ca-558e-4a2d-bb62-e700dcc40e35name: consumer2keys:- apikeyin_query: true_rules_:- _match_domain_:- "hello.default.example.com"allow:- consumer2url: oci://higress-registry.cn-hangzhou.cr.aliyuncs.com/plugins/key-auth:1.0.0

上述配置具体含义如下:在用户组 consumer 中,只有 consumer2 有权访问,该配置对 knative 服务域名 “hello.default.example.com” 生效。我们通过如下请求进行验证:

curl -H "Host: hello.default.example.com" http://127.0.0.1
#请求未提供APIKey,返回401
curl -H "Host: hello.default.example.com" http://127.0.0.1/?apikey=2bda943c-ba2b-11ec-ba07-00163e1250b5
#consumer1不具备访问权限,返回403
curl -H "Host: hello.default.example.com" http://127.0.0.1/?apikey=c8c8e9ca-558e-4a2d-bb62-e700dcc40e35
Hello World!  #consumer2具备访问权限,返回200

方案二:Higress+IstioCRD

除了上述 Higress+KIngress 解析的方法外,Higress 还可以基于自身对 IstioCRD 的兼容能力,通过 IstioCRD 来对接 Knative 服务。具体方式如下:

Step 1. 安装 IstioCRD

helm repo add istio https://istio-release.storage.googleapis.com/charts
helm install istio-base istio/base -n istio-system --create-namespace

启用 IstioCRD 时,需更新 Higress 的部署参数:

helm upgrade higress -n higress-system --set global.enableIstioAPI=true higress.io/higress --reuse-values

Step 2. 安装相关网络层组件

通过运行以下命令安装 Knative Istio Controller(即 net-istio-controller)

kubectl apply -f https://github.com/knative/net-istio/releases/download/knative-v1.10.1/net-istio.yaml

Step 3. 配置 Istio Config 指向 Higress

Knative 社区给出了使用非默认网关的配置,详情参见 Install Istio for Knative-Knative [ 8] 。具体步骤:

修改 config-istio 中的 svc 为 higress-gateway:

kubectl edit configmap config-istio -n knative-serving

添加如下配置:

data:gateway.knative-serving.knative-ingress-gateway: higress-gateway.higress-system.svc.cluster.locallocal-gateway.knative-serving.knative-local-gateway: higress-gateway.higress-system.svc.cluster.local

更新命名空间 Knative-serving 中网关实例 knative-local-gateway 与 knative-ingress-gateway:

kubectl edit gw knative-local-gateway -n knative-serving
kubectl edit gw knative-ingress-gateway -n knative-serving

将网关实例 Knative-local-gateway 与 Knative-ingress-gateway 的 selector 下的 label 替换为 higress-gateway 的 label,higress-gateway 的默认如下:

spec:selector:app: higress-gatewayhigress: higress-system-higress-gateway

上述配置完成后,同样可以通过 Higress 实现 Knative 网络层的基本能力。


阿里云产品评测活动
邀请您参与下一代网关评测,可降低 50% 资源开销,展现技术和架构先进性,参与评测赢取猫超卡、Cherry 机械键盘,优秀文章还能署名发布到阿里开发者和阿里云云原生公众号。

进入链接立即参与:

https://developer.aliyun.com/mission/higress

相关链接:

[1] kubectl

https://kubernetes.io/docs/tasks/tools/

[2] Helm

https://helm.sh/

[3] Knative CLI (kn)https://knative.dev/docs/getting-started/quickstart-install/#install-the-knative-cli

[4] Knative 安装指南

https://knative.dev/docs/install/yaml-install/serving/install-serving-with-yaml/#install-the-knative-serving-component

[5] Higress

https://higress.io/zh-cn/docs/ops/deploy-by-helm/

[6] 基于 Key 限流https://higress.io/zh-cn/docs/plugins/key-rate-limit/

[7] 基于 Key 认证

https://higress.io/zh-cn/docs/plugins/key-auth/

[8] Install Istio for Knative-Knative

https://knative.dev/docs/install/installing-istio/#configuring-the-installation

[9] github: Higresshttps://github.com/alibaba/higress

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式实时操作系统的设计与开发

时钟管理 在RTOS中,时钟具有非常重要的作用,通过时钟可实现延时任务、周期性触发任务执行、任务有限等待的计时。 大多数嵌入式系统有两种时钟源,分别为实时时钟RTC(Real-Time Clock)和定时器/计数器。 实时时钟一般…

React Antd form.getFieldsValue() 和 form.getFieldsValue(true) 有区别吗?

背景 突然发现 antd 的 getFieldsValue()是可以传一个 true 参数的,如题,React Antd form.getFieldsValue() 和 form.getFieldsValue(true) 有区别吗? 验证 确实不一样 结论 getFieldsValue 提供了多种重载方法: getFieldsValue(name…

开学季,“护眼教室”上线,守护孩子光明未来

在关于教室的记忆里,你是否有着这样的滤镜? “电影”滤镜:模糊又遥远,夜间自习像褪色的胶片。 “眩光”滤镜:灯光亮到出现“光环”,看不了多久眼睛就酸胀。 “频闪”滤镜:头顶的灯仿佛飞速眨眼…

【Go Web 篇】从零开始:构建最简单的 Go 语言 Web 服务器

随着互联网的迅速发展,Web 服务器成为了连接世界的关键组件之一。而在现代编程语言中,Go 语言因其卓越的性能和并发能力而备受青睐。本篇博客将带你从零开始,一步步构建最简单的 Go 语言 Web 服务器,让你对 Go 语言的 Web 开发能力…

接口测试与功能测试的区别~

今天为大家分享的是我们在日常测试工作中, 一定会接触并且目前在企业中是主要测试内容的 功能测试与接口测试 一.功能测试与接口测试的基本概念。 1.1 什么是功能测试呢? 功能测试: 是黑盒测试的一方面, 检查实际软件的功能是否符合用户的需求 功能测试测试的内容包括以下…

linux离线安装rdbtools,需先安装python

离线安装python3 下载python包,下载地址:https://www.python.org/ftp/python/ 我选的是https://www.python.org/ftp/python/3.9.0/Python-3.9.0.tgz 将文件上传至linux服务器,解压 tar -xf Python-3.9.0.tgz cd Python-3.9.0 mkdir /usr/l…

c++ qt--信号与槽(二) (第四部分)

c qt–信号与槽(二) (第四部分) 信号与槽的关系 1.一对一 2.一对多 3.多对一 4.多对多 还可以进行传递 信号->信号->槽 一个信号控制多个槽的例子(通过水平滑块控制两个组件) 1.应用的组件 注意这里最下面的组件进行…

pandas读取excel,再写入excel

需求是这样的,从一个表读取数据,然后每次执行创建一个新表将值写入 读取这个表 写入到这个表 分别对应的是e、h列数据,代码如下: import pandas as pd import openpyxl import datetime dfpd.read_excel(rC:\Users\admin\Deskt…

【IMX6ULL驱动开发学习】12.Linux SPI驱动实战:DAC驱动设计流程

基础回顾: 【IMX6ULL驱动开发学习】10.Linux I2C驱动实战:AT24C02驱动设计流程_阿龙还在写代码的博客-CSDN博客 【IMX6ULL驱动开发学习】11.Linux之SPI驱动_阿龙还在写代码的博客-CSDN博客 一、编写驱动 查看芯片手册,有两种DAC数据格式&a…

一文讲透 JavaScript 应用的演进历程

在不断发展的软件开发领域中,很少有编程语言像JavaScript一样产生深远的影响。它起初只是一种简单的脚本语言,但如今已成为现代Web的驱动力量,改变了应用构建和体验的方式。本文将带你沿着时间线,穿越JavaScript的演进历程&#x…

Spring Boot(Vue3+ElementPlus+Axios+MyBatisPlus+Spring Boot 前后端分离)【六】

😀前言 本篇博文是关于Spring Boot(Vue3ElementPlusAxiosMyBatisPlusSpring Boot 前后端分离)【六】,希望你能够喜欢 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章…

lnmp架构-nginx

6.nginx基础配置 证书 重定向(80重定向到443) 当访问http时 直接到 https 自动索引: 下载方便 Nginx缓存配置 :缓存可以降低网站带宽,加速用户访问 日志轮询 禁用不必要的日志记录 以节省磁盘IO的消耗 监控的信息 监…