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.yaml2.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 创建ServiceapiVersion: 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: Knative3.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: concurrency3.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-handler4.2 创建事件处理器apiVersion: serving.knative.dev/v1 kind: Service metadata: name: event-handler namespace: default spec: template: spec: containers: - image: event-handler:latest ports: - containerPort: 80804.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: 05.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: 105.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: prometheus6.2 查看指标# 查看Pod指标 kubectl get pods -n knative-serving # 访问Prometheus kubectl port-forward -n knative-monitoring prometheus-system-0 90906.3 日志查询# 查看服务日志 kubectl logs -l serving.knative.dev/servicehello-world # 使用kail查看日志 kail -l serving.knative.dev/servicehello-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: 1Gi7.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:latest7.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 扩缩容建议场景minScalemaxScaletarget开发测试0510生产环境150100高并发场景51002008.3 监控建议关键指标QPS、延迟、错误率告警规则扩缩容异常、服务不可用日志收集使用ELK或Loki通过合理配置Knative可以构建弹性、高效的Serverless应用。