Knative Serverless部署实战

一、Knative概述

Knative是一个基于Kubernetes的Serverless平台,提供自动扩缩容、事件驱动等能力。

1.1 Knative架构

┌─────────────────────────────────────────────────────────────┐
│                      Knative                              │
├─────────────────────────────────────────────────────────────┤
│  ┌─────────────────┐  ┌─────────────────┐                │
│  │   Serving      │  │    Eventing     │                │
│  │  (服务部署)     │  │  (事件驱动)      │                │
│  └────────┬────────┘  └────────┬────────┘                │
├───────────┼─────────────────────┼─────────────────────────┤
│           ▼                     ▼                         │
│  ┌─────────────────────────────────────────────────┐      │
│  │              Kubernetes Cluster                 │      │
│  └─────────────────────────────────────────────────┘      │
└─────────────────────────────────────────────────────────────┘

1.2 Knative组件

组件 说明
Serving 服务部署和自动扩缩容
Eventing 事件路由和订阅
Build 构建和部署流水线

二、环境准备

2.1 安装Knative Serving

# 安装Knative Serving
kubectl apply -f https://github.com/knative/serving/releases/download/knative-v1.12.0/serving-crds.yaml
kubectl apply -f https://github.com/knative/serving/releases/download/knative-v1.12.0/serving-core.yaml

# 安装Istio(可选)
kubectl apply -f https://github.com/knative/net-istio/releases/download/knative-v1.12.0/net-istio.yaml

# 安装域名管理
kubectl apply -f https://github.com/knative/serving/releases/download/knative-v1.12.0/serving-default-domain.yaml

2.2 安装Knative Eventing

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

# 安装默认通道
kubectl apply -f https://github.com/knative/eventing/releases/download/knative-v1.12.0/in-memory-channel.yaml

# 安装事件源
kubectl apply -f https://github.com/knative/eventing/releases/download/knative-v1.12.0/eventing-sources.yaml

三、部署Serverless服务

3.1 创建Service

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: hello-world
  namespace: default
spec:
  template:
    spec:
      containers:
        - image: gcr.io/knative-samples/helloworld-go:latest
          ports:
            - containerPort: 8080
          env:
            - name: TARGET
              value: "Knative"

3.2 自动扩缩容配置

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: scalable-service
  namespace: default
spec:
  template:
    spec:
      containers:
        - image: my-app:latest
          resources:
            requests:
              cpu: "100m"
              memory: "256Mi"
            limits:
              cpu: "500m"
              memory: "512Mi"
      autoscaling:
        minScale: 0
        maxScale: 10
        target: 100
        metric: "concurrency"

3.3 访问服务

# 获取服务URL
kubectl get ksvc hello-world

# 测试服务
curl http://hello-world.default.example.com

四、事件驱动架构

4.1 创建事件源

apiVersion: sources.knative.dev/v1
kind: CronJobSource
metadata:
  name: cron-source
  namespace: default
spec:
  schedule: "*/1 * * * *"
  data: '{"message": "Hello from CronJob"}'
  sink:
    ref:
      apiVersion: serving.knative.dev/v1
      kind: Service
      name: event-handler

4.2 创建事件处理器

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: event-handler
  namespace: default
spec:
  template:
    spec:
      containers:
        - image: event-handler:latest
          ports:
            - containerPort: 8080

4.3 创建事件订阅

apiVersion: eventing.knative.dev/v1
kind: Subscription
metadata:
  name: event-subscription
  namespace: default
spec:
  channel:
    apiVersion: messaging.knative.dev/v1
    kind: InMemoryChannel
    name: default
  subscriber:
    ref:
      apiVersion: serving.knative.dev/v1
      kind: Service
      name: event-handler

五、流量管理

5.1 蓝绿部署

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: my-service
  namespace: default
spec:
  traffic:
    - tag: blue
      revisionName: my-service-00001
      percent: 100
    - tag: green
      revisionName: my-service-00002
      percent: 0

5.2 金丝雀发布

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: my-service
  namespace: default
spec:
  traffic:
    - tag: stable
      revisionName: my-service-00001
      percent: 90
    - tag: canary
      revisionName: my-service-00002
      percent: 10

5.3 镜像流量

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: my-service
  namespace: default
spec:
  traffic:
    - tag: stable
      revisionName: my-service-00001
      percent: 100
    - tag: mirror
      revisionName: my-service-00002
      percent: 0
      mirrorPercent: 10

六、监控与日志

6.1 启用监控

apiVersion: v1
kind: ConfigMap
metadata:
  name: config-observability
  namespace: knative-serving
data:
  metrics.backend-destination: prometheus
  metrics.request-metrics-backend-destination: prometheus

6.2 查看指标

# 查看Pod指标
kubectl get pods -n knative-serving

# 访问Prometheus
kubectl port-forward -n knative-monitoring prometheus-system-0 9090

6.3 日志查询

# 查看服务日志
kubectl logs -l serving.knative.dev/service=hello-world

# 使用kail查看日志
kail -l serving.knative.dev/service=hello-world

七、性能优化

7.1 资源配置

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: optimized-service
  namespace: default
spec:
  template:
    spec:
      containers:
        - image: my-app:latest
          resources:
            requests:
              cpu: "200m"
              memory: "512Mi"
            limits:
              cpu: "1"
              memory: "1Gi"

7.2 并发控制

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: concurrency-service
  namespace: default
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/target: "50"
        autoscaling.knative.dev/metric: "concurrency"
        autoscaling.knative.dev/minScale: "1"
        autoscaling.knative.dev/maxScale: "20"
    spec:
      containers:
        - image: my-app:latest

7.3 预热配置

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: warmed-service
  namespace: default
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/warmup-timeout: "30s"
    spec:
      containers:
        - image: my-app:latest

八、最佳实践

8.1 部署建议

  1. 镜像优化:使用多阶段构建减少镜像大小
  2. 健康检查:配置liveness和readiness探针
  3. 环境变量:使用ConfigMap管理配置

8.2 扩缩容建议

场景 minScale maxScale target
开发测试 0 5 10
生产环境 1 50 100
高并发场景 5 100 200

8.3 监控建议

  1. 关键指标:QPS、延迟、错误率
  2. 告警规则:扩缩容异常、服务不可用
  3. 日志收集:使用ELK或Loki

通过合理配置Knative,可以构建弹性、高效的Serverless应用。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐