Knative Serverless部署实战
·
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 部署建议
- 镜像优化:使用多阶段构建减少镜像大小
- 健康检查:配置liveness和readiness探针
- 环境变量:使用ConfigMap管理配置
8.2 扩缩容建议
| 场景 | minScale | maxScale | target |
|---|---|---|---|
| 开发测试 | 0 | 5 | 10 |
| 生产环境 | 1 | 50 | 100 |
| 高并发场景 | 5 | 100 | 200 |
8.3 监控建议
- 关键指标:QPS、延迟、错误率
- 告警规则:扩缩容异常、服务不可用
- 日志收集:使用ELK或Loki
通过合理配置Knative,可以构建弹性、高效的Serverless应用。
更多推荐




所有评论(0)