Knative基于Header进行流量灰度验证

简介: 在 Knative 可以基于流量比例进行灰度发布,但有时候我们需要将确切的请求灰度到指定的版本上进行验证,在 Knative 0.18 版本并结合Kourier网关可以实现基于Header的灰度验证。

导读

在 Knative 可以基于流量比例进行灰度发布,但有时候我们需要将确切的请求灰度到指定的版本上进行验证,通常的做法是在请求的 Header 中设置参数,然后根据Header灰度到指定的版本。那么在Knative 除了基于流量比例灰度,是否还支持基于Header指定版本灰度呢? 答案是可以的。在 Knative 0.18 版本并结合Kourier网关可以实现基于Header的灰度验证。

Knative 中Tag的特性

在 Knative 中创建完成Knative Service 之后会默认生成该服务的访问域名(如:`helloworld.default.example.com`),通过该域名并依据每个Revision版本的流量比例,可以访问到不同的版本。那么如果我们想单独访问某个特定的版本,是否可以呢?Knative 提供了指定某个版本访问的能力,就是对这个版本配置一个Tag。

image.png

Service

Configuration

Route

Revision1

Revision2

Revision3

被打上Tag的Revision版本, 会为这个版本单独生成一个域名(如:test-helloworld.default.example.com),这样我们访问这个域名的话就可以直接访问特定的版本。

一般使用Tag的情况是对未进行线上引流的版本进行功能测试。但这个特性还满足不了实际指定版本灰度验证,因为线上提供服务访问的域名是固定的。因此Knative社区在Tag设置之上提供了设置Header路由策略。

Knative 基于Tag设置Header策略

在 Knative v0.18 版本中可以在请求的Header中加上 Knative-Serving-Tag: {revision-tag}

来指定请求到Tag对应的版本上。

当前 Istio, Contour 以及 Kourier 都已经支持了该特性。开启特性:

  • 阿里云 Knative 已经默认开启。
  • 社区 Knative 默认未开启,执行下面操作即可开启:
kubectl patch cm config-features -n knative-serving -p '{"data":{"tag-header-based-routing":"enabled"}}'

 

通过Header进行灰度验证

前提条件

阿里云 Knative 部署完成之后,当前默认使用Kourier网关。

创建服务

首先我们创建一个helloworld-go的服务,注意这里需要开启tag特性,在Service 的注释中设置:route.serving.knative.aliyun.com/revision-tag: "on"

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: helloworld-go
  annotations:
    route.serving.knative.aliyun.com/revision-tag: "on"
spec:
  template:
    spec:
      containers:
      - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/helloworld-go:73fbdd56

执行部署命令:

kubectl apply -f helloworld.yaml

查看版本信息:

kubectl get revision
NAME                  CONFIG NAME     K8S SERVICE NAME      GENERATION   READY   REASON
helloworld-go-k77jq   helloworld-go   helloworld-go-k77jq   1            True

访问服务:

richard@B-N3TEMD6P-1650 tag-route % curl -H "host: helloworld-go.default.example.com" http://39.106.114.214
Hello World!

升级服务

这里我们通过修改环境变量TARGET,打印不同的输出。同时设置新版本的流量为0,这样请求还是会100%到原版本。

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: helloworld-go
  annotations:
    route.serving.knative.aliyun.com/revision-tag: "on"
spec:
  template:
    spec:
      containers:
      - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/helloworld-go:73fbdd56
        env:
        - name: TARGET
          value: "Knative"
  traffic:
  - latestRevision: true
    percent: 0
  - latestRevision: false
    percent: 100
    revisionName: helloworld-go-k77jq

执行部署命令:

kubectl apply -f helloworld.yaml

查看新版本已经创建出来:

kubectl get revision
NAME                  CONFIG NAME     K8S SERVICE NAME      GENERATION   READY   REASON
helloworld-go-k77jq   helloworld-go   helloworld-go-k77jq   1            True
helloworld-go-zgklc   helloworld-go   helloworld-go-zgklc   2            True

访问服务:

curl -H "host: helloworld-go.default.example.com" http://39.106.114.214
Hello World!

还是原版本信息输出,符合预期。

设置新版本Tag

执行修改 Service 命令:

kubectl edit ksvc helloworld-go

在新版本上设置Tag (tag: demo)

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: helloworld-go
  annotations:
    route.serving.knative.aliyun.com/revision-tag: "on"
spec:
  template:
    spec:
      containers:
      - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/helloworld-go:73fbdd56
        env:
        - name: TARGET
          value: "Knative"
  traffic:
  - latestRevision: false
    percent: 0
    revisionName: helloworld-go-zgklc
    tag: demo
  - latestRevision: false
    percent: 100
    revisionName: helloworld-go-k77jq

访问指定版本(helloworld-go-zgklc):

curl -H "host: demo-helloworld-go.default.example.com" http://39.106.114.214
Hello Knative!

 

灰度验证

接下来我们看一下基于Header如何灰度验证,很简单只需要在访问helloworld-go.default.example.com域名的时候加上Knative-Serving-Tag即可:

curl -H "host: helloworld-go.default.example.com" -H "Knative-Serving-Tag:demo"  http://39.106.114.214
Hello Knative!

总结

本文介绍了如何在 Knative 中通过在Header中设置Knative-Serving-Tag来实现灰度验证,有兴趣的同学可以体验一下,也欢迎加入 Knative 交流群一起交流:

image.png

目录
相关文章
|
4月前
|
人工智能 运维 安全
加速智能体开发:从 Serverless 运行时到 Serverless AI 运行时
在云计算与人工智能深度融合的背景下,Serverless 技术作为云原生架构的集大成者,正加速向 AI 原生架构演进。阿里云函数计算(FC)率先提出并实践“Serverless AI 运行时”概念,通过技术创新与生态联动,为智能体(Agent)开发提供高效、安全、低成本的基础设施支持。本文从技术演进路径、核心能力及未来展望三方面解析 Serverless AI 的突破性价值。
|
SQL 监控 AliSQL
RDS MySQL最新发布的经济规格,包月仅需18元
RDS基础版经济规格,高性价比,让开发更轻松,学习更高效
1960 15
|
15天前
|
存储 人工智能 自然语言处理
阿里云OpenClaw(原Clawdbot)一键部署指南:零基础秒级启用AI助理
OpenClaw(前身为Clawdbot、Moltbot)是一款具备自然语言理解与任务自动化能力的AI代理工具,能24小时响应指令,处理文件管理、信息查询、跨应用协同等实操任务。阿里云提供的专属一键部署方案,通过预配置镜像与可视化操作,简化了依赖安装、端口配置等复杂流程,零基础用户无需专业技术储备,也能在云服务器上快速启用该服务,打造专属智能助理。本文将详细拆解部署全流程、进阶功能配置及问题排查方案,助力高效落地使用。
562 14
|
14天前
|
人工智能 网络协议 JavaScript
阿里云OpenClaw(Clawdbot)一键部署图文指南:快速拥有专属AI助手!
本文发布于2026年2月,基于阿里云最新官方方案,面向零基础用户,提供OpenClaw(原Clawdbot/Moltbot)一键部署全流程——30分钟即可搭建7×24小时在线、隐私可控的本地化AI智能体,支持文件管理、日程调度、代码编写与跨应用协同,年费仅约68元。
294 2
|
3月前
|
监控 应用服务中间件 API
Agentic 应用时代,Dify 全链路可观测最佳实践
本文讲述 Dify 平台在 Agentic 应用开发中面临的可观测性挑战,从开发者与运维方双重视角出发,系统分析了当前 Dify 可观测能力的现状、局限与改进方向
651 18
Agentic 应用时代,Dify 全链路可观测最佳实践
|
4月前
|
前端开发 Go API
Coze Loop 架构学习指南
本指南系统解析 Coze Loop 架构,涵盖项目结构、DDD 设计、技术栈与学习路径,助你从零掌握 AI Agent 平台开发与贡献。
440 2
|
6月前
|
人工智能 前端开发 数据库
波动跃迁:基于 Knative 加速 AI Agent 应用落地
Knative 提供了基于请求自动弹性、缩容到 0 以及多版本管理的 Serverless 能力,看如何助力 AI Agent 初创企业快速产品落地。
|
存储 人工智能 Cloud Native
科研+ AI :深势科技,全新科研范式引领者
深势科技作为AI for Science的引领者,专注于微观粒子行为研究,推动材料科学和生命科学领域的创新。通过AI技术,深势科技加速了药物研发、纳米药物微流控等技术的发展,显著提升了计算性能和实验效率。与阿里云合作,利用其云原生计算和存储服务,深势科技实现了资源弹性调度和高效管理,大幅提升了研发效率,服务于超过50万科研用户,并计划建设AI for Science超级实验室,推动更多科技创新。
637 0
|
消息中间件 人工智能 自然语言处理
基于事件驱动构建 AI 原生应用
AI 应用在商业化服务的阶段会面临诸多挑战,比如更快的服务交付速度,更实时、精准的结果以及更人性化的体验等,传统架构限制于同步交互,无法满足上述需求,本篇文章给大家分享一下如何基于事件驱动架构应对上述挑战。
1022 228
|
存储 人工智能 数据库
Agno:18.7K Star!快速构建多模态智能体的轻量级框架,运行速度比LangGraph快5000倍!
Agno 是一个用于构建多模态智能体的轻量级框架,支持文本、图像、音频和视频等多种数据模态,能够快速创建智能体并实现高效协作。
3431 22
Agno:18.7K Star!快速构建多模态智能体的轻量级框架,运行速度比LangGraph快5000倍!