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 或 Kind 本地集群,请确保已执行 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

你会看到以下过程:

  1. 初始状态:无 Pod(缩容到零)。
  2. 请求到达:Knative 自动创建 Pod(Pending → Running)。
  3. 持续请求:如果并发超过目标值(本例为1),自动创建更多 Pod。
  4. 请求停止:等待约 30-60 秒(默认稳定窗口),Pod 自动缩容到零。
⚠️ 注意: 缩容到零的默认等待时间由 stable-window 参数控制(默认 60 秒)。在生产环境中,可根据业务容忍度调整此值,避免频繁冷启动。

4.5 自动扩缩容流程可视化

下图展示了从请求到达、Pod 创建到缩容到零的完整生命周期。

Knative Service 自动扩缩容生命周期 无请求 Pod数=0 请求到达 Cold Start 创建Pod Pending→Running 处理请求 并发=1 请求停止 稳定窗口 缩容到零 Pod数=0 说明:虚线箭头表示无请求时的自动缩容循环;实线箭头表示请求驱动的扩容流程。

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),方便统一清理和管理。