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 错误。
Knative 数据平面与控制平面分离架构 控制平面 (Control Plane) Knative Controller Webhook Kubernetes API etcd 数据平面 (Data Plane) Activator Queue-Proxy User Container Istio Gateway 控制指令 状态上报 故障排查要点: • 控制平面异常:检查 knative-serving 命名空间下的 controller 和 webhook Pod 日志。 • 数据平面异常:检查 Activator 日志、Queue-Proxy 边车日志以及 Istio Gateway 的 Envoy 日志。

1.3 请求生命周期详解

一个外部 HTTP 请求到达 Knative Service 的完整路径如下,理解每个环节的故障模式至关重要:

  1. Ingress 入口:请求首先到达集群入口网关(通常是 Istio Ingress Gateway 或 Kourier)。网关根据 Host 头将请求路由到对应的 Knative Service。
  2. Activator 介入:如果目标 Revision 当前缩放为 0(无运行中 Pod),请求会被转发到 Activator。Activator 会缓冲该请求,同时触发 Autoscaler 启动一个新的 Pod。
  3. Queue-Proxy 代理:当 Pod 启动后,请求被转发到 Pod 内的 Queue-Proxy 边车容器。Queue-Proxy 负责并发控制、请求超时管理以及向 Autoscaler 上报并发指标。
  4. 用户容器处理:Queue-Proxy 将请求转发给同 Pod 内的 User Container(即你的应用代码)。应用处理完成后,响应沿原路径返回。
  5. 直连模式:当 Revision 已有运行中 Pod 且流量稳定时,网关会绕过 Activator,直接将请求路由到 Pod 的 Queue-Proxy,减少网络跳转。
Knative Service 请求生命周期 1. 外部请求 2. Ingress 网关 3. Activator 4. Queue-Proxy 5. User Container 响应返回路径 直连模式(已有 Pod 运行) 当 Revision 有活跃 Pod 时,请求从 Ingress 直接转发到 Queue-Proxy,绕过 Activator。 直连(绕过 Activator) 常见故障点: • 网关路由规则错误 → 404/502 • Activator 超时 → 503 • Queue-Proxy 并发限制 → 429

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 并观察控制平面如何自动重建它。