一、Knative 是什么
Knative 是一个运行在 Kubernetes 之上的开源 Serverless / 云原生应用平台,最早由 Google 于 2018 年发起,后加入 CNCF,并在 2025 年成为 CNCF 毕业项目。它的目标很直接:让开发者“写代码、打镜像、发请求”,而不用深究 Pod、Deployment、Ingress、HPA、滚动发布这些底层细节。
传统 Kubernetes 很强大,但对业务开发并不友好:部署一个 HTTP 服务要写 Deployment、Service、Ingress、HPA、PodDisruptionBudget 等一堆 YAML。Knative 把这些“无聊但难做”的事抽象成更高层原语——源码到容器、请求驱动扩缩容、缩容到零、流量切分、事件驱动——从而把 Kubernetes 变成类似 FaaS/PaaS 的运行时。
Knative 不是取代 Kubernetes,而是在上面加一层中间件:容器仍是部署单元,CRD 仍是扩展方式,任何云、本地机房、边缘集群只要能跑 K8s,就能跑 Knative。
二、主要功能
-
Serverless 化部署
只需声明一个knative Service,系统自动创建 Route、Configuration、Revision,并管理网络与扩缩容。 -
自动扩缩容 / 缩容到零
没流量时实例数降到 0,有请求时冷启动拉起 Pod;流量上涨时按并发或 RPS 扩容到成千上万实例,特别适合 Webhook、API、定时任务、推理服务。 -
版本管理与流量治理
每次更新产生不可变 Revision,可做蓝绿、金丝雀、A/B、按百分比分流(如 90% 老版本 + 10% 新版本),回滚就是改流量比例。 -
事件驱动架构
通过 CloudEvents 接入 GitHub、Kafka、定时任务、消息队列等事件源,生产者与消费者解耦,Broker/Trigger/Subscription 模型让事件管道像 K8s 资源一样声明。 -
函数化开发体验
Knative Functions(funcCLI)让开发者用语言模板写函数,本地构建后直接部署成 Knative Service,不必手写 Dockerfile 和 K8s 清单。 -
跨云与可移植
不绑定厂商,ACK、GKE、EKS、DOKS、Kind、MiniKube、自建集群都能装,避免云厂商 FaaS 锁定。 -
可观测与生态集成
与 Prometheus、Grafana、OpenTelemetry、Istio/Contour/Kourier 网关、Tekton CI 天然衔接。
三、组件清单
Knative 当前核心由三块组成:
-
Knative Serving:Serverless HTTP 服务运行时
- CRD:
Service、Route、Configuration、Revision - 控制面:controller、webhook、autoscaler、activator、domain-mapping
- 网络层插件:Kourier、Istio、Contour、ALB、ASM(社区/云厂商实现)
- CRD:
-
Knative Eventing:异步事件与 CloudEvents 路由
- 概念:Source、Broker、Trigger、Channel、Subscription、Sink
- 实现:in-memory channel、Kafka、RabbitMQ、Camel、PingSource、GitHub Source 等
- 控制面:eventing-controller、broker-filter、broker-ingress、dispatcher
-
Knative Functions:开发者侧函数框架(不装进集群)
- CLI:
func - 模板:Go / Python / Node / Quarkus / Spring / TypeScript
- 产出:标准容器镜像 + Knative Service
- CLI:
可选扩展:
- 网关:Kourier(轻量)、Istio(全功能)、Contour、ALB、ASM
- 可观测:Prometheus、Grafana、OTel Collector
- 构建:Tekton Pipelines(Knative 早期 Build 已演进为 Tekton 生态)
- 云产品托管版:ACK Knative、GKE Serverless、DOKS 1-Click、ACS Knative
四、如何部署
1. 前提
- 一个 Kubernetes 集群(1.28+ 生产推荐,本地可用 Kind/Docker Desktop)
- 已装
kubectl - 集群有网络插件和足够资源(如 2 节点 × 2C4G 起步)
- 选一个 Knative 网络层(新手用 Kourier 最省事)
2. 安装 CLI(可选)
# kn CLI
curl -L https://github.com/knative/client/releases/latest/download/kn-linux-amd64 -o kn
chmod +x kn && mv kn /usr/local/bin/
3. 用 Operator 部署(推荐)
kubectl apply -f https://github.com/knative/operator/releases/latest/download/operator.yaml
kubectl create ns knative-serving
kubectl apply -f - <<EOF
apiVersion: operator.knative.dev/v1beta1
kind: KnativeServing
metadata:
name: knative-serving
namespace: knative-serving
spec:
ingress:
kourier: {}
defaultIngressClass: kourier
EOF
kubectl create ns knative-eventing
kubectl apply -f - <<EOF
apiVersion: operator.knative.dev/v1beta1
kind: KnativeEventing
metadata:
name: knative-eventing
namespace: knative-eventing
EOF
4. 用 YAML 快速装(GitOps 友好)
kubectl apply -f https://github.com/knative/serving/releases/latest/download/serving-crds.yaml
kubectl apply -f https://github.com/knative/serving/releases/latest/download/serving-core.yaml
kubectl apply -f https://github.com/knative/net-kourier/releases/latest/download/kourier.yaml
kubectl patch configmap/config-network \
-n knative-serving \
--type merge \
-p '{"data":{"ingress-class":"kourier.ingress.networking.knative.dev"}}'
kubectl apply -f https://github.com/knative/eventing/releases/latest/download/eventing-crds.yaml
kubectl apply -f https://github.com/knative/eventing/releases/latest/download/eventing-core.yaml
5. 部署第一个服务
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: hello
namespace: default
spec:
template:
spec:
containers:
- image: gcr.io/knative-samples/helloworld-go
env:
- name: TARGET
value: "Knative"
kubectl apply -f hello.yaml
kubectl get ksvc hello
curl http://hello.default.example.com # 或取 EXTERNAL-IP / 域名访问
6. 云厂商一键部署
- 阿里云 ACK / ACS:控制台“应用 > Knative > 一键部署”,选 Kourier / ALB / ASM
- GKE:Serverless 插件 / Knative Operator
- DigitalOcean:DOKS 1-Click Knative(默认 Kourier)
五、一句话总结
Knative = Kubernetes 上的 Serverless 中间件:Serving 管“服务怎么跑、怎么扩、怎么分流”,Eventing 管“事件从哪来、到哪去”,Functions 管“人怎么写代码”。它适合想用 Kubernetes 又不想被运维细节拖垮的团队,也适合搭建自有 FaaS / 事件平台 / AI 推理网关。
如果你说的 knaive 是某个具体小众仓库(比如 kNN 验证工具 kNAVe、某前端 Naive UI 衍生项目、或者你们公司内部项目名),把 GitHub 链接发我,我可以按那个项目重写。