2. Knative 架构与安全组件:Serving 与 Eventing 核心组件、安全边界、网络策略基础

2.1 Knative 整体架构与安全边界划分

Knative 在 Kubernetes 之上构建了一层无服务器抽象,其安全边界不仅包含 Kubernetes 原生的 Pod/Service/NetworkPolicy,还引入了 Knative 特有的资源对象与准入控制点。理解 Knative 的架构分层是制定安全基线的第一步。

安全核心观点: Knative 的安全边界遵循“Kubernetes 原生 + Knative 扩展”双层模型。底层依赖 K8s RBAC、Pod Security Standards、NetworkPolicy;上层依赖 Knative 的 spec.config 准入、自动注入的 Istio/ Kourier 网络代理、以及 Eventing 的 Broker/Trigger 授权。
Knative 安全边界分层架构 Kubernetes 集群层 RBAC | Pod Security Standards | NetworkPolicy | Secret 管理 节点安全 | 容器运行时 | etcd 加密 Knative 控制面层 Serving 控制面 activator | autoscaler | controller Configuration | Revision | Route | Service Eventing 控制面 Broker | Trigger | Channel | Subscription Source | SinkBinding | ApiServerSource 数据面 / 用户工作负载层 Knative Service Pod (queue-proxy + user-container) Istio Sidecar / Kourier Gateway Event Receiver / Sink Pod 安全边界:准入控制 → 网络策略 → 运行时隔离

2.2 Knative Serving 核心组件与安全关注点

Knative Serving 负责无服务器工作负载的部署、自动扩缩与流量管理。每个核心组件都有对应的安全配置项。

组件 职责 安全关注点
activator 冷启动时接收流量并缓冲请求,直到 Pod 就绪 需限制 activator 的 ServiceAccount 权限;防止 DoS 攻击导致 activator 过载
autoscaler 基于并发数/CPU 指标决策扩缩容 指标数据源需认证;防止恶意指标注入导致异常扩缩
controller 监听 Knative CRD 变化并协调资源状态 必须使用最小 RBAC 权限;禁止 controller 越权操作集群资源
queue-proxy 注入到每个 Knative Service Pod 的 sidecar,负责流量统计与请求排队 需限制 queue-proxy 的容器安全上下文;禁止以 root 运行;只暴露必要端口
net-istio / net-kourier 网络层实现,提供 Ingress Gateway 与内部路由 Gateway 需配置 TLS 终止;mTLS 策略;限制外部访问 IP 范围
安全实践: 在 Knative Serving 的 config-network ConfigMap 中设置 autoTLS: Enabled 和 httpProtocol: Redirected,强制所有外部流量使用 HTTPS。同时将 default-external-scheme 设为 https。

2.3 Knative Eventing 核心组件与安全关注点

Knative Eventing 提供事件驱动架构,其安全模型围绕事件生产者、Broker、Trigger 和事件消费者之间的信任链展开。

组件 职责 安全关注点
Broker 事件代理,接收并路由事件到匹配的 Trigger Broker 的 spec.config 需限制可访问的命名空间;防止事件注入攻击
Trigger 定义事件过滤规则,将事件转发到特定 Sink Trigger 的 spec.subscriber 必须指向合法的 Service/URI;防止 SSRF
Channel 事件通道,提供事件缓冲与持久化 Channel 后端(如 Kafka、RabbitMQ)需独立认证;Channel 的访问控制列表
Source 事件源,将外部事件导入 Knative ApiServerSource 需限制监听的资源类型;PingSource 需验证事件格式
SinkBinding 将事件生产者与事件消费者绑定 需验证 SinkBinding 的 spec.sink URI 合法性;防止绑定到恶意端点
Knative Eventing 事件流与安全控制点 事件源 ApiServerSource Broker 事件路由 + 过滤 安全:准入控制 Trigger 安全:SSRF 防护 Sink 安全控制点 ① 事件源认证与授权 ② Broker 事件准入策略 ③ Trigger 订阅合法性校验

2.4 网络策略基础与 Knative 适配

Kubernetes NetworkPolicy 是 Knative 环境中最基础的网络隔离手段。由于 Knative 的 Pod 生命周期短、IP 动态变化,网络策略的编写需要适配 Knative 的标签体系。

2.4.1 Knative 自动注入的标签

每个 Knative Service 创建的 Pod 会自动携带以下标签,可用于 NetworkPolicy 的 podSelector 匹配:

  • serving.knative.dev/service:所属 Knative Service 名称
  • serving.knative.dev/revision:所属 Revision 名称
  • serving.knative.dev/configuration:所属 Configuration 名称
  • app.kubernetes.io/name:应用名称(可自定义)

2.4.2 典型网络策略示例

以下策略限制只有 activator 和 istio-ingressgateway 可以访问 Knative Service Pod 的 8080 端口,阻止其他 Pod 直接访问:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: restrict-knative-ingress
  namespace: my-app
spec:
  podSelector:
    matchLabels:
      serving.knative.dev/service: my-service
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: activator
    - podSelector:
        matchLabels:
          app: istio-ingressgateway
    ports:
    - protocol: TCP
      port: 8080
    - protocol: TCP
      port: 8443
注意: 如果启用了 queue-proxy 的指标端口(9090、9091),需要在 NetworkPolicy 中显式放通 autoscaler 的访问,否则自动扩缩容会失效。建议在策略中额外添加:from: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: knative-serving。

2.4.3 网络策略对比表

策略类型 适用场景 Knative 适配要点
默认拒绝所有入站 高安全环境,只允许明确放通的流量 必须放通 activator 和 ingress gateway 的 IP/标签
基于命名空间隔离 多租户场景,不同团队使用不同命名空间 使用 namespaceSelector 限制跨命名空间访问
基于标签的细粒度策略 同一命名空间内不同 Service 之间的隔离 利用 serving.knative.dev/service 标签精确匹配
出口流量限制 防止数据泄露,限制 Pod 对外访问 需放通 DNS(UDP 53)、Knative 控制面、事件 Broker

2.5 安全边界总结

Knative 的安全边界可以归纳为以下三个层次,每个层次都需要独立配置与审计:

  1. 集群边界: Kubernetes RBAC、Pod Security Admission、NetworkPolicy 基础策略
  2. Knative 控制面边界: Serving/Eventing 组件的 ServiceAccount 权限、ConfigMap 安全配置、CRD 准入 Webhook
  3. 数据面边界: queue-proxy 安全上下文、用户容器安全策略、mTLS 与网络策略