4、快速部署第一个Knative Service:使用YAML部署Hello-World应用、验证自动扩缩容
本章将带领你完成第一个Knative Service的部署。通过一个简单的Hello-World应用,你将掌握使用YAML声明式部署的核心步骤,并直观验证Knative从0到N再到0的自动扩缩容能力。这是后续所有容量回退演练的基础操作。
4.1 部署目标与前置检查
在开始部署前,请确认集群环境已满足以下条件。如果尚未完成,请参考课程第2章完成安装。
| 检查项 | 预期状态 | 验证命令 |
|---|---|---|
| Knative Serving CRD | 已安装 | kubectl get crd | grep serving |
| Istio / Kourier 网关 | Running | kubectl get pods -n knative-serving |
| 默认命名空间 | 已启用 | kubectl get namespace default |
| kubectl 上下文 | 指向目标集群 | kubectl config current-context |
minikube tunnel 或端口转发,以便外部流量能到达 Knative 网关。
4.2 编写Hello-World YAML清单
Knative Service 的 YAML 清单遵循 serving.knative.dev/v1 API 版本。核心字段包括 metadata、spec.template(Revision 模板)和 spec.traffic(流量管理)。
创建一个名为 hello-world.yaml 的文件,内容如下:
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: hello-world
namespace: default
spec:
template:
metadata:
annotations:
# 设置并发请求数,用于观察扩缩容
autoscaling.knative.dev/target: "1"
spec:
containers:
- image: gcr.io/knative-samples/helloworld-go:latest
ports:
- containerPort: 8080
env:
- name: TARGET
value: "Knative User"
traffic:
- latestRevision: true
percent: 100
autoscaling.knative.dev/target: "1":每个 Pod 的目标并发数为 1。当请求数超过 1 时,Knative 将自动创建新 Pod。containerPort: 8080:Knative 默认监听 8080 端口,网关会自动将流量路由至此端口。traffic:将 100% 流量指向最新 Revision,后续演练中会修改此字段实现流量回退。
4.3 部署Service并验证状态
使用 kubectl apply 命令部署服务,并观察其生命周期。
# 部署服务
kubectl apply -f hello-world.yaml
# 查看 Service 状态
kubectl get ksvc hello-world
# 查看 Revision 和 Configuration
kubectl get revision
kubectl get configuration
部署成功后,kubectl get ksvc 的输出应类似:
NAME URL LATESTCREATED LATESTREADY READY REASON
hello-world http://hello-world.default.example.com hello-world-00001 hello-world-00001 True
URL 字段是 Knative 自动生成的服务入口地址。由于没有请求,此时 Pod 数量应为 0(Knative 默认缩容到零)。
4.4 验证自动扩缩容:从0到N再到0
Knative 的核心特性之一是 缩容到零(Scale to Zero) 和 从零启动(Cold Start)。下面通过发送请求来验证这一过程。
4.4.1 发送请求触发扩容
使用 curl 或 hey 工具发送请求。注意需要将域名解析到 Knative 网关 IP。
# 获取网关 IP(以 Kourier 为例)
export GATEWAY_IP=$(kubectl get svc kourier -n knative-serving -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
# 发送请求(需将 Host 头设置为 Service URL)
curl -H "Host: hello-world.default.example.com" http://$GATEWAY_IP
首次请求会有 1-3 秒延迟(Cold Start),之后返回:
Hello Knative User!
4.4.2 观察Pod扩缩容过程
在另一个终端窗口实时观察 Pod 变化:
kubectl get pods -w
你会看到以下过程:
- 初始状态:无 Pod(缩容到零)。
- 请求到达:Knative 自动创建 Pod(Pending → Running)。
- 持续请求:如果并发超过目标值(本例为1),自动创建更多 Pod。
- 请求停止:等待约 30-60 秒(默认稳定窗口),Pod 自动缩容到零。
stable-window 参数控制(默认 60 秒)。在生产环境中,可根据业务容忍度调整此值,避免频繁冷启动。
4.5 自动扩缩容流程可视化
下图展示了从请求到达、Pod 创建到缩容到零的完整生命周期。
4.6 验证并发扩缩容效果
为了更清晰地观察多 Pod 扩容,可以使用压测工具发送并发请求:
# 使用 hey 发送 10 个并发请求
hey -n 20 -c 10 -host "hello-world.default.example.com" http://$GATEWAY_IP
在另一个终端观察 Pod 数量变化:
kubectl get pods -l serving.knative.dev/service=hello-world -w
你会看到 Pod 数量从 0 增加到多个(取决于并发数和目标并发值),然后在请求停止后逐渐缩容到 0。
| 时间点 | 并发请求数 | Pod 数量 | 状态说明 |
|---|---|---|---|
| T0 | 0 | 0 | 缩容到零 |
| T1 | 10 | 1 → 10 | 快速扩容(Cold Start + 并发扩容) |
| T2 | 0 | 10 → 0 | 稳定窗口后缩容到零 |
- 扩容速度:Knative 基于并发指标快速扩容,通常在几秒内完成。
- 缩容延迟:默认有 60 秒稳定窗口,避免频繁扩缩容导致抖动。
- 零流量成本:无请求时 Pod 数为 0,不消耗计算资源。
4.7 清理资源
完成验证后,删除 Service 以释放资源:
kubectl delete ksvc hello-world
确认所有 Pod 和 Revision 已被清理:
kubectl get ksvc
kubectl get revision
kubectl create namespace knative-demo),方便统一清理和管理。