1. Knative Service 架构总览:核心组件、数据/控制平面分离与请求生命周期
Knative 是一个基于 Kubernetes 的无服务器平台,其核心设计哲学是数据平面与控制平面分离。理解这一架构是进行故障排查与恢复的基础。本章将拆解 Knative 的三大核心组件(Serving、Eventing、Tekton),并深入分析请求从入口到 Pod 的完整生命周期。
1.1 三大核心组件与职责
| 组件 | 核心职责 | 关键资源对象 | 故障排查关注点 |
|---|---|---|---|
| Serving | 管理无服务器工作负载的自动扩缩容、流量路由、版本管理与零缩放。 | Service, Configuration, Revision, Route | Pod 启动失败、流量无法路由、扩缩容异常、Revision 状态卡住 |
| Eventing | 提供事件驱动架构,实现事件源、事件通道、触发器与 Broker 的松耦合集成。 | Broker, Trigger, Channel, Subscription, Source | 事件未送达、Trigger 未匹配、Broker 不可用、事件格式错误 |
| Tekton | 提供云原生 CI/CD 流水线能力,用于构建、测试和部署 Knative Service。 | Task, Pipeline, PipelineRun, TaskRun | 流水线执行失败、镜像构建超时、权限不足 |
讲师提示: 在故障排查中,80% 的 Serving 问题源于 Revision 状态异常。请牢记
kn service list 和 kubectl get revision 是首诊命令。
1.2 数据平面与控制平面分离原理
Knative 严格遵循 Kubernetes 的声明式 API 模式,将系统拆分为两个逻辑平面:
- 控制平面(Control Plane):由 Knative 控制器(Controller)和 Webhook 组成。它负责监听 Kubernetes 资源变化,协调期望状态与实际状态。例如,当用户创建
ksvc时,控制器会生成 Configuration、Revision 和 Route 对象。 - 数据平面(Data Plane):由 Activator 和 Queue-Proxy 边车容器组成。它负责处理实际的请求流量、缓冲请求(当 Pod 从零缩放时)以及上报并发指标。
架构关键点: 控制平面故障不会直接影响正在运行的请求,但会导致新 Revision 无法创建或路由无法更新。数据平面故障(如 Activator 崩溃)则会导致请求超时或 503 错误。
1.3 请求生命周期详解
一个外部 HTTP 请求到达 Knative Service 的完整路径如下,理解每个环节的故障模式至关重要:
- Ingress 入口:请求首先到达集群入口网关(通常是 Istio Ingress Gateway 或 Kourier)。网关根据
Host头将请求路由到对应的 Knative Service。 - Activator 介入:如果目标 Revision 当前缩放为 0(无运行中 Pod),请求会被转发到 Activator。Activator 会缓冲该请求,同时触发 Autoscaler 启动一个新的 Pod。
- Queue-Proxy 代理:当 Pod 启动后,请求被转发到 Pod 内的 Queue-Proxy 边车容器。Queue-Proxy 负责并发控制、请求超时管理以及向 Autoscaler 上报并发指标。
- 用户容器处理:Queue-Proxy 将请求转发给同 Pod 内的 User Container(即你的应用代码)。应用处理完成后,响应沿原路径返回。
- 直连模式:当 Revision 已有运行中 Pod 且流量稳定时,网关会绕过 Activator,直接将请求路由到 Pod 的 Queue-Proxy,减少网络跳转。
1.4 核心资源对象关系
Knative Service 在 Kubernetes 中表现为一组相互关联的资源对象。理解它们的关系是排查配置问题的关键:
# 一个典型的 Knative Service YAML 示例
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: hello-world
spec:
template:
spec:
containers:
- image: gcr.io/knative-samples/helloworld-go
env:
- name: TARGET
value: "Knative"
---
# 上述 Service 会自动生成以下子资源:
# Configuration: hello-world
# Revision: hello-world-00001
# Route: hello-world
故障排查警告: 不要直接修改由 Knative Service 自动生成的 Revision 或 Route。任何手动修改都会被控制平面覆盖。始终通过
ksvc 的 spec.template 进行变更。
1.5 本章小结与故障排查思维导图
掌握 Knative 架构是故障排查的第一步。请记住以下核心原则:
- 控制平面负责“声明与协调”,数据平面负责“请求与转发”。
- 请求生命周期中的每个节点(网关 → Activator → Queue-Proxy → 用户容器)都可能成为故障点。
- 使用
kubectl get ksvc,configuration,revision,route快速定位资源状态。 - 使用
kubectl logs -n knative-serving <controller-pod>查看控制平面错误。
实战练习: 部署一个简单的 Knative Service,然后执行
kubectl get all -n <your-namespace> 观察自动生成的资源对象。尝试删除 Revision 并观察控制平面如何自动重建它。