关于 knative
Knative Skill 是面向在 Kubernetes 上部署和管理无服务器工作负载的操作指南,涵盖 Serving、Eventing 和 Functions 的配置与排障。适合需要自动扩缩、事件路由或流量管理的 Kubernetes 使用者。
主要功能
- 01Serving 服务部署与自动扩缩
- 02版本与流量拆分配置
- 03Eventing 事件源和路由
- 04Knative Functions 生命周期
- 05网络、TLS 与 DNS 配置
适用场景
- 01部署可缩至零实例的 HTTP 服务
- 02配置金丝雀或渐进式发布
- 03通过 Broker 和 Trigger 路由事件
- 04创建并部署多语言函数
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ julianobarbosa/ claude-code-skills --skill knative安装后在 Claude Code 中输入/knative确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/knative-detail.mdscripts/deploy-service.shdiagnose.shinstall.shtraffic-split.sh详细介绍
Knative 技能
概述
Knative 是一个基于 Kubernetes 的开源平台,用于部署和管理无服务器工作负载。它提供三个主要组件:
| 组件 | 用途 | 主要功能 |
|---|---|---|
| Serving | HTTP 触发的自动扩缩运行时 | 缩容至零、流量拆分、修订版本 |
| 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 |
| HPA | hpa.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 的事件 | 定时任务 |
| ApiServerSource | K8s API 事件 | 集群监控 |
| KafkaSource | Kafka 消息 | 流处理 |
| GitHubSource | GitHub Webhook | CI/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
支持的语言
| 语言 | 模板 | 运行时 |
|---|---|---|
| Go | go | 原生二进制文件 |
| Node.js | node | Node.js 18+ |
| Python | python | Python 3.9+ |
| Quarkus | quarkus | GraalVM/JVM |
| Rust | rust | 原生二进制文件 |
| TypeScript | typescript | Node.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)
冷启动优化
- 保持最小副本数:对延迟敏感的服务设置
min-scale: "1" - 优化容器镜像:使用 distroless/alpine 基础镜像
- 延迟初始化:将繁重的初始化工作推迟到首次请求到来时
- 连接池:预热数据库连接
生产环境检查清单
- 使用 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