mcpField
K
knative

knative

github.com/julianobarbosa云与 DevOps14108 次安装2 天前更新
代码仓库

关于 knative

Knative Skill 是面向在 Kubernetes 上部署和管理无服务器工作负载的操作指南,涵盖 Serving、Eventing 和 Functions 的配置与排障。适合需要自动扩缩、事件路由或流量管理的 Kubernetes 使用者。

主要功能

  1. 01Serving 服务部署与自动扩缩
  2. 02版本与流量拆分配置
  3. 03Eventing 事件源和路由
  4. 04Knative Functions 生命周期
  5. 05网络、TLS 与 DNS 配置

适用场景

  1. 01部署可缩至零实例的 HTTP 服务
  2. 02配置金丝雀或渐进式发布
  3. 03通过 Broker 和 Trigger 路由事件
  4. 04创建并部署多语言函数

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/julianobarbosa/claude-code-skills --skill knative

安装后在 Claude Code 中输入/knative确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
knative-detail.md
scripts/
deploy-service.sh
diagnose.sh
install.sh
traffic-split.sh

详细介绍

Knative 技能

概述

Knative 是一个基于 Kubernetes 的开源平台,用于部署和管理无服务器工作负载。它提供三个主要组件:

组件用途主要功能
ServingHTTP 触发的自动扩缩运行时缩容至零、流量拆分、修订版本
Eventing事件驱动架构Broker、Trigger、Source、CloudEvents
Functions简化函数部署func CLI、多语言支持

当前版本:v1.20.0(截至 2024 年末)

何时使用此技能

在以下情况下使用此技能:

  • 希望在 Kubernetes 上部署无服务器工作负载
  • 需要缩容至零的自动扩缩能力
  • 正在实现事件驱动架构
  • 需要流量管理(蓝绿部署、金丝雀发布、渐进式发布)
  • 使用 CloudEvents 或事件路由
  • 提及 Knative Serving、Eventing 或 Functions
  • 询问 Broker、Trigger、Source 或 Sink
  • 需要配置网络层(Kourier、Istio、Contour)

快速参考

Knative Service(Serving)
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: my-service
  namespace: default
spec:
  template:
    metadata:
      annotations:
        # Autoscaling configuration
        autoscaling.knative.dev/class: kpa.autoscaling.knative.dev
        autoscaling.knative.dev/min-scale: "0"
        autoscaling.knative.dev/max-scale: "10"
        autoscaling.knative.dev/target: "100"  # concurrent requests
    spec:
      containers:
        - image: gcr.io/my-project/my-app:latest
          ports:
            - containerPort: 8080
          resources:
            requests:
              cpu: 100m
              memory: 128Mi
            limits:
              memory: 128Mi  # Memory limit = request (required)
          # NO CPU limits (causes throttling)
流量拆分
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: my-service
spec:
  template:
    # ... container spec
  traffic:
    # Blue-green: 100% to new or old
    - revisionName: my-service-00001
      percent: 90
    - revisionName: my-service-00002
      percent: 10
    # Or use latestRevision
    - latestRevision: true
      percent: 100
带标签的修订版本(预览 URL)
traffic:
  - revisionName: my-service-00002
    percent: 0
    tag: staging  # Accessible at staging-my-service.example.com
  - latestRevision: true
    percent: 100
    tag: production
Broker 和 Trigger(Eventing)
# Create a Broker
apiVersion: eventing.knative.dev/v1
kind: Broker
metadata:
  name: default
  namespace: default
---
# Create a Trigger to route events
apiVersion: eventing.knative.dev/v1
kind: Trigger
metadata:
  name: my-trigger
  namespace: default
spec:
  broker: default
  filter:
    attributes:
      type: dev.knative.example
      source: /my/source
  subscriber:
    ref:
      apiVersion: serving.knative.dev/v1
      kind: Service
      name: my-service
事件源示例(PingSource)
apiVersion: sources.knative.dev/v1
kind: PingSource
metadata:
  name: cron-job
spec:
  schedule: "*/1 * * * *"  # Every minute
  contentType: application/json
  data: '{"message": "Hello from cron"}'
  sink:
    ref:
      apiVersion: serving.knative.dev/v1
      kind: Service
      name: event-display

安装

前提条件
  • Kubernetes 集群 v1.28+
  • 已配置 kubectl
  • 集群管理员权限
方法 1:YAML 安装(推荐用于 GitOps)
# Install Knative Serving CRDs and Core
kubectl apply -f https://github.com/knative/serving/releases/download/knative-v1.20.0/serving-crds.yaml
kubectl apply -f https://github.com/knative/serving/releases/download/knative-v1.20.0/serving-core.yaml

# Install Networking Layer (choose one)
# Option A: Kourier (lightweight, recommended for most cases)
kubectl apply -f https://github.com/knative/net-kourier/releases/download/knative-v1.20.0/kourier.yaml
kubectl patch configmap/config-network \
  --namespace knative-serving \
  --type merge \
  --patch '{"data":{"ingress-class":"kourier.ingress.networking.knative.dev"}}'

# Option B: Istio (for service mesh requirements)
kubectl apply -f https://github.com/knative/net-istio/releases/download/knative-v1.20.0/net-istio.yaml

# Install Knative Eventing
kubectl apply -f https://github.com/knative/eventing/releases/download/knative-v1.20.0/eventing-crds.yaml
kubectl apply -f https://github.com/knative/eventing/releases/download/knative-v1.20.0/eventing-core.yaml

# Install In-Memory Channel (dev only) or Kafka Channel (production)
kubectl apply -f https://github.com/knative/eventing/releases/download/knative-v1.20.0/in-memory-channel.yaml

# Install MT-Channel-Based Broker
kubectl apply -f https://github.com/knative/eventing/releases/download/knative-v1.20.0/mt-channel-broker.yaml
方法 2:Knative Operator
# Install the Operator
kubectl apply -f https://github.com/knative/operator/releases/download/knative-v1.20.0/operator.yaml

# Deploy Knative Serving
apiVersion: operator.knative.dev/v1beta1
kind: KnativeServing
metadata:
  name: knative-serving
  namespace: knative-serving
spec:
  ingress:
    kourier:
      enabled: true
  config:
    network:
      ingress-class: kourier.ingress.networking.knative.dev

---
# Deploy Knative Eventing
apiVersion: operator.knative.dev/v1beta1
kind: KnativeEventing
metadata:
  name: knative-eventing
  namespace: knative-eventing
配置 DNS
# Get the External IP of the ingress
kubectl get svc kourier -n kourier-system

# Option A: Real DNS (production)
# Create A record: *.knative.example.com -> EXTERNAL-IP

# Option B: Magic DNS with sslip.io (development)
kubectl patch configmap/config-domain \
  --namespace knative-serving \
  --type merge \
  --patch '{"data":{"<EXTERNAL-IP>.sslip.io":""}}'

# Option C: Default domain (internal only)
kubectl patch configmap/config-domain \
  --namespace knative-serving \
  --type merge \
  --patch '{"data":{"example.com":""}}'

自动扩缩

自动扩缩器类别
类别键缩容至零指标
KPA(默认)kpa.autoscaling.knative.dev是并发数、RPS
HPAhpa.autoscaling.knative.dev否CPU、内存
自动扩缩注解
metadata:
  annotations:
    # Autoscaler class
    autoscaling.knative.dev/class: kpa.autoscaling.knative.dev

    # Scale bounds
    autoscaling.knative.dev/min-scale: "1"    # Prevent scale-to-zero
    autoscaling.knative.dev/max-scale: "100"
    autoscaling.knative.dev/initial-scale: "3"

    # Scaling metric (KPA)
    autoscaling.knative.dev/metric: concurrency  # or rps
    autoscaling.knative.dev/target: "100"        # target per pod

    # Scale-down behavior
    autoscaling.knative.dev/scale-down-delay: "5m"
    autoscaling.knative.dev/scale-to-zero-pod-retention-period: "1m"

    # Window for averaging metrics
    autoscaling.knative.dev/window: "60s"
并发限制
spec:
  template:
    spec:
      containerConcurrency: 100  # Hard limit per pod (0 = unlimited)

网络

网络层对比
层优点缺点使用场景
Kourier轻量、快速、简单功能有限大多数部署
Istio完整的服务网格、mTLS笨重、复杂企业、安全关键场景
Contour基于 Envoy、性能良好复杂度中等高流量应用
TLS 配置
# Using cert-manager (recommended)
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: my-service
  annotations:
    # Auto-TLS with cert-manager
    networking.knative.dev/certificate-class: cert-manager
spec:
  # ... template spec
自定义域名映射
apiVersion: serving.knative.dev/v1beta1
kind: DomainMapping
metadata:
  name: api.example.com
  namespace: default
spec:
  ref:
    kind: Service
    name: my-service
    apiVersion: serving.knative.dev/v1

Eventing 模式

事件源类型
来源描述使用场景
PingSource基于 Cron 的事件定时任务
ApiServerSourceK8s API 事件集群监控
KafkaSourceKafka 消息流处理
GitHubSourceGitHub WebhookCI/CD 触发
ContainerSource自定义容器任意外部系统
Channel 类型
Channel持久化使用场景
InMemoryChannel否仅用于开发
KafkaChannel是生产环境
NATSChannel可配置高吞吐量
Sequence(链式处理)
apiVersion: flows.knative.dev/v1
kind: Sequence
metadata:
  name: my-sequence
spec:
  channelTemplate:
    apiVersion: messaging.knative.dev/v1
    kind: InMemoryChannel
  steps:
    - ref:
        apiVersion: serving.knative.dev/v1
        kind: Service
        name: step-1
    - ref:
        apiVersion: serving.knative.dev/v1
        kind: Service
        name: step-2
  reply:
    ref:
      apiVersion: serving.knative.dev/v1
      kind: Service
      name: final-handler
Parallel(扇出)
apiVersion: flows.knative.dev/v1
kind: Parallel
metadata:
  name: my-parallel
spec:
  channelTemplate:
    apiVersion: messaging.knative.dev/v1
    kind: InMemoryChannel
  branches:
    - subscriber:
        ref:
          apiVersion: serving.knative.dev/v1
          kind: Service
          name: handler-a
    - subscriber:
        ref:
          apiVersion: serving.knative.dev/v1
          kind: Service
          name: handler-b

Knative Functions

CLI 安装
# macOS
brew install knative/client/func

# Linux
curl -sL https://github.com/knative/func/releases/latest/download/func_linux_amd64 -o func
chmod +x func && sudo mv func /usr/local/bin/
函数生命周期
# Create a new function
func create -l python my-function
cd my-function

# Build the function
func build

# Deploy to cluster
func deploy

# Invoke locally
func invoke

# Invoke remote
func invoke --target=remote
支持的语言
语言模板运行时
Gogo原生二进制文件
Node.jsnodeNode.js 18+
PythonpythonPython 3.9+
QuarkusquarkusGraalVM/JVM
Rustrust原生二进制文件
TypeScripttypescriptNode.js
函数配置(func.yaml)
specVersion: 0.36.0
name: my-function
runtime: python
registry: docker.io/myuser
image: docker.io/myuser/my-function:latest
build:
  builder: pack
  buildpacks:
    - paketo-buildpacks/python
deploy:
  namespace: default
  annotations:
    autoscaling.knative.dev/min-scale: "1"
  env:
    - name: MY_VAR
      value: my-value
  volumes:
    - secret: my-secret
      path: /secrets

最佳实践

资源配置
资源要求备注
CPU 请求必需根据实际使用情况设置
CPU 限制禁止会导致节流
内存请求必需根据应用需求设置
内存限制必需必须与请求值相等
resources:
  requests:
    cpu: 100m
    memory: 128Mi
  limits:
    memory: 128Mi  # Same as request
    # NO cpu limit!
探针配置
spec:
  containers:
    - image: my-app
      readinessProbe:
        httpGet:
          path: /health
          port: 8080
        initialDelaySeconds: 5
        periodSeconds: 10
      # Liveness probe optional for serverless
      # (Knative handles pod lifecycle)
冷启动优化
  1. 保持最小副本数:对延迟敏感的服务设置 min-scale: "1"
  2. 优化容器镜像:使用 distroless/alpine 基础镜像
  3. 延迟初始化:将繁重的初始化工作推迟到首次请求到来时
  4. 连接池:预热数据库连接
生产环境检查清单
  • 使用 KafkaChannel,而不是 InMemoryChannel
  • 配置适当的资源请求/限制
  • 使用 cert-manager 设置 TLS
  • 配置自定义域名
  • 设置适当的最小/最大扩缩容值
  • 为 Triggers 启用死信接收器
  • 配置监控(Prometheus 指标)
  • 设置适当的 RBAC

故障排查

常见问题
症状原因解决方案
服务无法访问未配置 DNS配置域名映射或使用 sslip.io
Pod 未扩容Activator 过载增加 activator 副本数
冷启动缓慢镜像过大或初始化缓慢优化镜像,使用 min-scale: "1"
事件未送达Broker 配置错误检查 Broker/Trigger 状态
503 错误服务扩缩容检查 activator 日志,增加扩缩容规模
证书错误cert-manager 问题检查 ClusterIssuer 和 Certificate 状态
诊断命令
# Check Knative Serving status
kubectl get ksvc -A
kubectl describe ksvc <service-name>

# Check revisions
kubectl get revisions -A
kubectl describe revision <revision-name>

# Check routes
kubectl get routes -A

# Check Knative Eventing status
kubectl get brokers -A
kubectl get triggers -A
kubectl get sources -A

# Check event delivery
kubectl get subscriptions -A

# View activator logs
kubectl logs -n knative-serving -l app=activator -c activator

# View controller logs
kubectl logs -n knative-serving -l app=controller

# Check networking layer (Kourier)
kubectl logs -n kourier-system -l app=3scale-kourier-gateway
调试事件流
# Deploy event-display service for debugging
kubectl apply -f - <<EOF
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: event-display
spec:
  template:
    spec:
      containers:
        - image: gcr.io/knative-releases/knative.dev/eventing/cmd/event_display
EOF

# Create a trigger to route all events
kubectl apply -f - <<EOF
apiVersion: eventing.knative.dev/v1
kind: Trigger
metadata:
  name: debug-trigger
spec:
  broker: default
  subscriber:
    ref:
      apiVersion: serving.knative.dev/v1
      kind: Service
      name: event-display
EOF

# Watch events
kubectl logs -l serving.knative.dev/service=event-display -c user-container -f

与 ArgoCD 集成

用于 Knative 服务的 ApplicationSet
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: knative-services
spec:
  generators:
    - git:
        repoURL: https://github.com/org/repo.git
        revision: HEAD
        directories:
          - path: knative-services/*
  template:
    metadata:
      name: '{{path.basename}}'
      annotations:
        # Disable SSA if using Jobs
        argocd.argoproj.io/compare-options: ServerSideDiff=false
    spec:
      project: default
      source:
        repoURL: https://github.com/org/repo.git
        targetRevision: HEAD
        path: '{{path}}'
      destination:
        server: https://kubernetes.default.svc
        namespace: default
      syncPolicy:
        automated:
          prune: true
          selfHeal: true
Knative 资源的健康检查

ArgoCD 会自动识别 Knative 资源。自定义健康检查:

# In argocd-cm ConfigMap
data:
  resource.customizations.health.serving.knative.dev_Service: |
    hs = {}
    if obj.status ~= nil then
      if obj.status.conditions ~= nil then
        for _, condition in ipairs(obj.status.conditions) do
          if condition.type == "Ready" and condition.status == "True" then
            hs.status = "Healthy"
            hs.message = "Service is ready"
            return hs
          end
        end
      end
    end
    hs.status = "Progressing"
    hs.message = "Waiting for service to be ready"
    return hs

参考资料


注意事项

  • min-scale: "0" 可以节省成本,但冷启动会影响首个请求 — 对于 JVM/Python 应用,有时会耗时 3-10s。健康探针访问公共 URL 会意外地让 Pod 保持热状态;移除这些探针后,用户一直遇到的冷启动问题就会显现。
  • containerConcurrency: 0(无限制)会破坏 KPA 自动扩缩容,因为自动扩缩容器没有可用于扩缩容的并发目标。务必设置显式值;默认值 0 会在不提示的情况下禁用正常扩缩容。
  • Knative Service 的 spec.template.metadata.name 一旦设置便不可变 — 更改它不会创建新修订版本,而是导致应用失败。省略此名称,让 Knative 自动生成 -00001、-00002 等名称。
  • 部署 Knative Services 的 ArgoCD 应用必须设置 ServerSideDiff=false 注解,因为 ArgoCD 的架构无法识别 Knative 状态字段。若未设置,即使清单有效,同步也会因 field not declared in schema 而失败。
  • Broker Pod 重启时,InMemoryChannel 会丢失事件 — 适合开发环境,但在生产环境中后果严重。典型症状:Trigger 报告 Ready=True,但事件偶尔会消失。生产环境务必使用 KafkaChannel 或 NATSChannel。
  • CPU 限制会在从零扩容时导致请求延迟峰值,因为 activator 会受到节流。遵循集群策略:仅设置请求,不设置 CPU 限制。
  • percent: 0 的带标签修订版本仍会通过 <tag>-<service> 子域名接收流量,即使主路由显示 0%。不要以为标签对应的流量比例为 0 就意味着“没有流量”。

评论

支持 Markdown