Serving入门
ServingHelloWorld
Serverless 一个核心思想就是按需分配,那么 Knative 是如何实现按需分配的呢?另外在前面已经了解到 Knative Serving 在没有流量的时候是可以把Pod 缩容到零的。接下来就通过一些例子体验一下 Knative 缩容到零和按需自动扩缩容的能力。
部署 helloworld-go
Knative 官方给出了好几种语言的 Helloworld 示例,这些不同的语言其实只是编译镜像的 Dockerfile 有所不同,做好镜像之后的使用方式没什么差异。本例以 go 的 Hello World 为例进行演示。为了验证方便,阿里云官方已经提前编译好了一份镜像 registry.cn-hangzhou.aliyuncs.com/knative-sample/simple-app:07 , 可以直接使用。
我的学习路径遵照阿里云云原生《Knative 云原生应用开发指南》进行学习,所有资源均由阿里云提供。
首先编写一个 Knative Service 的 yaml 文件 helloworld-go.yaml , 内容如下:
[root@master Knative]# vi helloword-go.yaml
apiVersion: serving.knative.dev/v1
kind: Service
metadata:name: helloworld-go
spec:template:metadata:labels:app: helloworld-goannotations:autoscaling.knative.dev/target: "10"spec:containers:- image: registry.cn-hangzhou.aliyuncs.com/knative-sample/helloworld-go:160e4dc8ports:- name: http1containerPort: 8080env:- name: TARGETvalue: "World"
字段讲解:
apiVersion: serving.knative.dev/v1
指定使用的 Knative Serving API 版本,v1 是稳定版本。
kind: Service
定义资源类型为 Knative Service,Knative 会自动管理此服务的路由、修订版本(Revisions)和自动扩缩。
name: helloworld-go
定义 Knative Service 的名称,在 Kubernetes 集群中唯一标识该服务。通过 kubectl get ksvc 可查看此服务。
template
定义服务的修订版本模板(Revision Template)。每次更新配置时,Knative 会生成新的 Revision(版本),用于灰度发布或回滚。
spec.template.metadata 修订版本元数据
labels
标签(如 app: helloworld-go)用于标识此 Revision,常用于路由或监控筛选。
annotations
注解用于配置 Knative 的扩展行为:
autoscaling.knative.dev/target: "10"
设置自动扩缩的目标并发数。每个 Pod 最多处理10个并发请求,超过时触发扩容。这是 Knative 的核心特性之一。spec.template.spec 容器规格
containers
定义服务运行的容器:
image
容器镜像地址,这里是阿里云镜像仓库中的示例镜像 registry.cn-hangzhou.aliyuncs.com/knative-sample/helloworld-go:160e4dc8。
ports
容器暴露的端口:
name: http1和containerPort: 8080
Knative 默认通过端口 8080 接收 HTTP 流量,必须与此处配置一致。
env
容器环境变量:
name: TARGET和value: "World"
应用程序通过 TARGET 环境变量获取值,返回 Hello {TARGET},这里会返回 Hello World。
注意其中 autoscaling.knative.dev/target:“10”这个 Annotation 是设置每一个 Pod 的可处理并发请求数 10 ,Knative KPA 自动伸缩的时候会根据当前总请求的并发数和 autoscaling.knative.dev/target 自动调整 Pod 的数量,从而达到自动扩缩的目的。
部署Pod:
[root@master Knative]# kubectl apply -f helloword-go.yaml
service.serving.knative.dev/helloworld-go created
[root@master Knative]# kubectl get pods
NAME READY STATUS RESTARTS AGE
helloworld-go-00001-deployment-5479b447b-5vzrl 2/2 Running 0 74s
helloworld已经正常启动,下面进行访问。
访问helloworld
在访问 helloworld-go 之前先来介绍一下在 Knative 模型中流量是怎么进来的。Knative Service 和 Kubernetes 原生的 Deployment 不一样,Knative 不会创建 Loadbalance 的 Service,也不能创建 NodePort 类型的 Service,所以不能通过 SLB 或者 NodePort 访问。只能通过 ClusterIP 访问。而 ClusterIP 是不能直接对外暴露的,所以必须经过 Gateway 才能把用户的流量接入进来。
本例就是使用 Istio 的 Gateway 承接 Knative 的南北流量 ( 进和出 )。如下图所示是 Knative模型中流量的转发路径。用户发起的请求首先会打到 Gateway 上面,然后 Istio 通过 VirtualService 再把请求转发到具体的 Revision 上面。

所以想要访问 Knative 的服务首先要获取 Gateway 的 IP 地址,可以通过如下方式获取 Gateway 的 IP:
[root@master Knative]# kubectl get svc istio-ingressgateway -n istio-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
istio-ingressgateway NodePort 10.106.147.32 <none> 15021:30249/TCP,80:32727/TCP,443:30590/TCP,31400:30239/TCP,15443:31723/TCP 72m
前面也介绍了 Gateway 是通过 VirtualService 来进行流量转发的,这就要求访问者要知道目标服务的名字才行 ( 域名 ),所以要先获取 helloworld-go 的域名 , 注意下面这条命令中的 ${SVC_NAME} 需要替换成 helloworld-go ,这个名字必须要和 Knative Service 的名字一致,因为每一个 Service 都有一个唯一的名字。
[root@master Knative]# kubectl get route helloworld-go -o jsonpath='{.status.url}'
http://helloworld-go.default.example.com
[root@master Knative]# kubectl get route helloworld-go -o jsonpath='{.status.url}' | awk -F/ '{print $3}'
helloworld-go.default.example.com
#两个命令的区别在于是否是纯URL方式显示
至此已经拿到 IP 地址和 Hostname,可以通过 curl 直接发起请求:
[root@master Knative]# curl -H "Host:helloworld-go.default.example.com" "http://10.106.147.32"
Hello World!
访问成功。
缩容到零
刚刚部署完 Service 的时候 Knative 默认会创建出一个 Pod 提供服务,如果你超过 90 秒没有访问 helloworld-go 这个服务那么这个 Pod 就会自动删除,此时就是缩容到零了。现在看一下 Pod 情况 , 你可能会发现没有 Pod。
[root@master Knative]# kubectl get pods
No resources found in default namespace.
当我们再次访问:
[root@master Knative]# time curl -H "Host:helloworld-go.default.example.com" "http://10.108.241.97"
Hello World!real 0m2.728s
user 0m0.004s
sys 0m0.006s
“real 0m2.728s”意思意思是 curl 请求执行一共消耗了 2.728s,也就是说Knative 从零到 1 扩容 + 启动容器再到服务响应请求总共消耗了 2.728s。可以看出来这个速度还是很快的。再看一下 pod 数量,你会发现此时 Pod 自动扩容出来了。并且 Pod 数量为零时发起的请求并没有拒绝链接。
[root@master Knative]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
helloworld-go-00001-deployment-67857f6664-wf6hm 2/2 Running 0 4s 10.244.166.152 node1 <none> <none>
按需分配,自动扩缩
接下来再测试一下 Knative 按需扩容的功能。使用社区提供的 hey 进行测试。hey 有 Windows、Linux 和 Mac 的二进制可以在这里下载。安装hey:
[root@master ~]# wget https://hey-release.s3.us-east-2.amazonaws.com/hey_linux_amd64
[root@master ~]# chmod +x hey_linux_amd64
[root@master ~]# mv hey_linux_amd64 /usr/local/bin/
[root@master ~]# mv /usr/local/bin/hey_linux_amd64 /usr/local/bin/hey
使用这个命令测试之前需要在本机进行 Host 绑定,对于 helloworld-go 来说要把 helloworld-go 的域名绑定到 Istio Gateway 的 IP 上,/etc/hosts 添加如下配置:
[root@master ~]# vi /etc/hosts
10.108.241.97 helloworld-go.default.example.com
进行测试:
hey -z 30s -c :
● -z 30s 持续测试 30s
● -c 50 保持每秒 50 个请求
[root@master ~]# hey -z 30s -c 50 "http://helloworld-go.default.example.com/" && kubectl get pods Summary:Total: 30.0115 secsSlowest: 2.1634 secsFastest: 0.0025 secsAverage: 0.0197 secsRequests/sec: 2539.9240Total data: 990951 bytesSize/request: 13 bytesResponse time histogram:0.003 [1] |0.219 [76176] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■0.435 [0] |0.651 [0] |0.867 [0] |1.083 [0] |1.299 [0] |1.515 [0] |1.731 [0] |1.947 [0] |2.163 [50] |Latency distribution:10% in 0.0089 secs25% in 0.0114 secs50% in 0.0154 secs75% in 0.0212 secs90% in 0.0324 secs95% in 0.0421 secs99% in 0.0582 secsDetails (average, fastest, slowest):DNS+dialup: 0.0000 secs, 0.0025 secs, 2.1634 secsDNS-lookup: 0.0000 secs, 0.0000 secs, 0.0033 secsreq write: 0.0000 secs, 0.0000 secs, 0.0225 secsresp wait: 0.0195 secs, 0.0023 secs, 2.1546 secsresp read: 0.0001 secs, 0.0000 secs, 0.0153 secsStatus code distribution:[200] 76227 responsesNAME READY STATUS RESTARTS AGE
helloworld-go-00001-deployment-67857f6664-2trps 2/2 Running 0 37s
helloworld-go-00001-deployment-67857f6664-p4znc 2/2 Running 0 40s
helloworld-go-00001-deployment-67857f6664-s7spf 2/2 Running 0 37s
helloworld-go-00001-deployment-67857f6664-sv8hc 2/2 Running 0 37s
helloworld-go-00001-deployment-67857f6664-zqhgn 2/2 Running 0 37s
回想一下刚才 helloworld-go.yaml 文 件 配 置, 已 经 设 置 了 autoscaling.knative.dev/target:“10”这个 Annotation。这表示每一个 Pod 能够接受并发 10个请求,而刚才并发请求数设置的是 50 所以理论上应该会创建出来 5 个 Pod!!
所以,我们的配置文件是生效且正常运行的哦。

可以看到此时 Knative 自动扩容出来了 5 个 Pod 处理请求。
置, 已 经 设 置 了 autoscaling.knative.dev/target:“10”这个 Annotation。这表示每一个 Pod 能够接受并发 10个请求,而刚才并发请求数设置的是 50 所以理论上应该会创建出来 5 个 Pod!!
相关文章:
Serving入门
ServingHelloWorld Serverless 一个核心思想就是按需分配,那么 Knative 是如何实现按需分配的呢?另外在前面已经了解到 Knative Serving 在没有流量的时候是可以把Pod 缩容到零的。接下来就通过一些例子体验一下 Knative 缩容到零和按需自动扩缩容的能力…...
硬件操作指南——ATK-MD0430 V20
使用CC2530控制正点原子ATK-MD0430 V20显示的完整指南 本文将详细介绍如何使用CC2530单片机控制正点原子ATK-MD0430 V20显示屏,包括IAR开发环境的配置、硬件连接、程序编写和调试等完整步骤。 一、开发环境准备 1. IAR开发环境安装与配置 首先需要安装IAR Embed…...
【HDFS入门】HDFS数据冗余与容错机制解析:如何保障大数据高可靠存储?
目录 1 HDFS冗余机制设计哲学 1.1 多副本存储策略的工程权衡 1.2 机架感知的智能拓扑算法 2 容错机制实现原理 2.1 故障检测的三重保障 2.2 数据恢复的智能调度 3 关键场景容错分析 3.1 数据中心级故障应对 3.2 数据损坏的校验机制 4 进阶优化方案 4.1 纠删码技术实…...
UE学习记录part19
231 insect: insect enemy type 创建dead动画资源 往insect head上添加socket 创建攻击root motion动画。motion warping需要与root motion合作使用 为buff_blue创建物理资产 设置simulate physic使sinsect死亡后能落到地板上而不是漂浮在空中,要将die函数设置为 -…...
运行后allure报告没有自动更新(已解决)
pycharm直接运行run.py文件, allure生成的报告都没有更新,需要手动删除旧报告后再次运行才可以 pytest.ini [pytest]testpaths testcases/ addopts --alluredir ./report/result --clean-alluredir run.py主要代码 if __name__ "__main__&qu…...
深度学习在语音识别中的应用
引言 语音识别技术是人工智能领域中的一个重要分支,它使得机器能够理解和转换人类的语音为文本。深度学习的出现极大地推动了语音识别技术的发展。本文将介绍如何使用深度学习构建一个基本的语音识别系统,并提供一个实践案例。 环境准备 在开始之前&a…...
CUDA Tools 常用命令总结与记录 (需要细化)
以下是对 CUDA Toolkit 中常用工具和命令的详细总结,涵盖编译器、调试器、性能分析工具、GPU管理工具等核心组件: 一、编译器工具:nvcc nvcc 是 NVIDIA CUDA 编译器,用于编译 .cu 文件生成可执行文件或中间代码。 常用命令与参数…...
微信小程序 时间戳与日期格式的转换
1. 微信小程序 时间戳与日期格式的转换 微信小程序中的时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。例如现在北京时间2015-12-31 17:00:00的时间戳是1451552400,就是指从北京时间1970-01-01 08:00:00到…...
【深度学习—李宏毅教程笔记】Transformer
目录 一、序列到序列(Seq2Seq)模型 1、Seq2Seq基本原理 2、Seq2Seq模型的应用 3、Seq2Seq模型还能做什么? 二、Encoder 三、Decoder 1、Decoder 的输入与输出 2、Decoder 的结构 3、Non-autoregressive Decoder 四、Encoder 和 De…...
【人工智能学习-01-01】20250419《数字图像处理》复习材料的word合并PDF,添加页码
前情提要 20250419今天是上师大继续教育人工智能专升本第一学期的第一次线下课。 三位老师把视频课的内容提炼重点再面授。(我先看了一遍视频,但是算法和图像都看不懂,后来就直接挂分刷满时间,不看了) 今天是面对面授…...
如何从 GitHub 镜像仓库到极狐GitLab?
最近 GitHub 封禁中国用户的事情闹得沸沸扬扬,虽然官方发布的报道说中国用户被限制登录是因为配置错误导致,已经撤回了更新,中国用户已经可以正常使用。但是这就像横在国内开发者和企业头上的“达摩克利斯之剑”。为了避免 GitHub 不可用而带来的影响,国内开发者和企业可以…...
【云馨AI-大模型】2025年4月第三周AI领域全景观察:硬件革命、生态博弈与国产化突围
一、硬件算力突破点燃多智能体时代 谷歌在4月12日Cloud Next大会发布第七代TPU Ironwood,单芯片算力达4614 TFLOPs,较前代内存提升6倍,专为AI推理场景优化。配合发布的Gemini 2.5 Flash模型通过"思考"功能实现成本优化,…...
ETL数据集成平台在交通运输行业的五大应用场景
在智能交通与数字物流时代,交通运输企业每天产生海量数据——车辆轨迹、货物状态、乘客流量、设备日志……但这些数据往往被困在分散的系统中:GPS定位数据躺在车载终端里,物流订单卡在Excel表中,地铁客流统计锁在本地服务器内。如…...
使用 Docker 安装 Elastic Stack 并重置本地密码
Elastic Stack(也被称为 ELK Stack)是一个非常强大的工具套件,用于实时搜索、分析和可视化大量数据。Elastic Stack 包括 Elasticsearch、Logstash、Kibana 等组件。本文将展示如何使用 Docker 安装 Elasticsearch 并重置本地用户密码。 ###…...
利用 Deepseek 和 Mermaid 画流程图
提示词 你是一个产品经理,请绘制一个报名比赛的流程图,要求生成符合Mermaid语法的代码,具体要求如下: 1.注册账号 2.填写报名信息 3.参加比赛 4.查看比赛结果 生成的结果 flowchart TDA([开始]) --> B[注册账号]B --> C{账…...
系统架构设计师:系统架构概述案例分析与简答题、详细解析与评分要点
10道系统架构概述知识体系案例分析与简答题,涵盖架构设计原则、质量属性、演化过程、评估方法等核心考点,并附详细解析与评分要点: 一、案例分析题(5题) 1. 电商系统高并发场景下的架构设计 背景:某电商平…...
学习笔记: Mach-O 文件
“结构决定性质,性质决定用途”。如果不了解结构,是很难真正理解的。 通过一个示例的可执行文件了解Mach-O文件的结构 Mach-O基本结构 Header: :文件类型、目标架构类型等Load Commands:描述文件在虚拟内存中的逻辑结构、布局Data: 在Load commands中…...
图论-BFS搜索图/树-最短路径问题的解决
续上篇~图论--DFS搜索图/树-CSDN博客 先看第一次学习的博客!!👇👇👇👇 👉 有一些问题是广搜 和 深搜都可以解决的,例如岛屿问题,这里我们记dfs的写法就好啦,…...
【uniapp】vue2 使用 Vuex 状态管理
创建store文件夹:store/index.js // index.js import Vue from vue import Vuex from vuex import address from ./modules/address.jsVue.use(Vuex)const store new Vuex.Store({modules: {address} })export default store 创建modules文件夹:modul…...
vcpkg缓存问题研究
vcpkg缓存问题研究 问题描述解决方案官网给出的方案其实并不是大多数人语境中的“清除缓存”实际解决方案 问题描述 使用vcpkg管理c的库的时候,vcpkg会在c盘某些地方缓存下载的库,如果安装的库过多,这个缓存文件夹会过大占用磁盘空间&#x…...
个人自用-导入安装Hexo
因为本人原来就有备份好的资料,所以重新安装起来会很方便,这个教程也只适合我自己用 但是所有的命令行都要在Git的命令行里面使用(因为我就是这样操作的) 1 安装Git Git的官网 Git git --version 这个是查看Git的版本 git --…...
《AI大模型应知应会100篇》第26篇:Chain-of-Thought:引导大模型进行步骤推理
第26篇:Chain-of-Thought:引导大模型进行步骤推理 摘要 在自然语言处理(NLP)和人工智能领域,如何让大模型像人类一样进行逐步推理是一个核心挑战。Chain-of-Thought (思维链) 技术的出现为这一问题提供了强有力的解决…...
大模型API中转平台选择指南:如何找到优质稳定的服务
在人工智能快速发展的今天,大模型的应用已经渗透到各个领域。无论是开发智能应用的技术团队,还是希望通过AI提升效率的企业,都离不开大模型API的支持。然而,市场上的大模型API中转服务良莠不齐,层层转包的中间商模式不…...
STM32单片机入门学习——第43节: [12-3] 读写备份寄存器实时时钟
写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做! 本文写于:2025.04.19 STM32开发板学习——第43节: [12-3] 读写备份寄存器&实时时钟 前言开发板说明…...
零基础上手Python数据分析 (18):Matplotlib 基础绘图 - 让数据“开口说话”
写在前面 —— 告别枯燥数字,拥抱可视化力量,掌握 Matplotlib 绘图基础 欢迎来到 “高效数据分析实战指南:Python零基础入门” 专栏! 经过前面 Pandas 模块的学习和实战演练,我们已经掌握了使用 Python 和 Pandas 进行数据处理、清洗、整合、分析的核心技能。 我们能够从…...
【网络原理】UDP协议
目录 一. UDP 报文格式 (1)端口号 (2)UDP长度 (3)校验和 UDP协议属于传输层协议,由操作系统内核内置 一. UDP 报文格式 UDP数据报:无连接,不可靠传输,面…...
云服务器和本地打通内网端口方式
如何通过云服务器FRP 配置让树莓派板子运行的服务端程序被客户端访问? 要通过 云服务器 FRP 内网穿透,让公网客户端访问你 树莓派运行的 Qt 服务端程序,下面是详细的完整步骤,适合你现在的场景: 云服务器安装并启动…...
HCIP OSPF综合实验
1.网络拓扑图 实验要求: 2.需求分析 IP规划: 对每个路由器配置ospf并用172.16.0.0/16网段进行划分,项目中一共有area0 - area4五个ospf区域加一个rip网段,所以我们在172.16.0.0/16选出6个网段 ISP 对r5只能配ip可以把他看成外…...
tensor.repeat和tensor.repeat_interleave
tensor.repeat 在指定维度上整体复制张量内容: x torch.arange(6).reshape(2,3) print(x) print(x.repeat(2,1))上述代码的执行结果为: tensor([[0, 1, 2],[3, 4, 5]]) tensor([[0, 1, 2],[3, 4, 5],[0, 1, 2],[3, 4, 5]])可以看到,x.rep…...
实现批量图片文字识别(python+flask+EasyOCR)
话不多说,向上效果图 1)先说框架版本 为什么要先说框架版本呢,因为我在各种版本中尝试了两天,总算确定了如下版本适合我,至于其他的版本,各位自己去尝试 python 3.9.7 EasyOCR 1.7.2 flask 3.0.3 2)执行操作效果图 2.1)多选文件 2.2)图片预览 2.3)提取选中文件 2.4)提取所有文…...
