Knative Eventing概念与核心组件实现事件驱动
前言:Knative Eventing概念与核心组件实现事件驱动,还有记录一些坑点
参考文章:https://knative.dev/docs/serving/request-flow/
参考文章:https://zhuanlan.zhihu.com/p/660488519
关于Knative
Knative 是一款基于 Kubernetes 的开源 Serverless 应用编排框架,其目标是制定云原生、跨平台的 Serverless 应用编排标准。
Knative 主要功能包括基于请求的自动弹性、缩容到 0、多版本管理、基于流量的灰度发布以及事件驱动等。
自动弹性实现 KPA(Knative Pod Autoscaler)
Knative 提供了基于请求的自动弹性实现 KPA(Knative Pod Autoscaler),也支持 K8s 中的 HPA,此外 Knative 提供了灵活的弹性扩展机制,可以结合自身业务需要,扩展弹性实现。
这里我们也会介绍与 MSE 结合实现精准弹性以及与 AHPA 结合实现基于请求的弹性预测。
基于 CPU 或者 Memory 的弹性,有时候并不能完全反映业务的真实使用情况,而基于并发数或者每秒处理请求数 (QPS/RPS),对于 web 服务来说更能直接反映服务性能,Knative 提供了基于请求的自动弹性能力。
要获得当前服务的请求数,Knative Serving 为每个 Pod 注入 QUEUE 代理容器 (queue-proxy),该容器负责收集用户容器并发数 (concurrency) 或请求数 (rps) 指标。
Autoscaler 定时获取这些指标之后,会根据相应的算法,调整 Deployment 的 Pod 数量,从而实现基于请求的自动扩缩容。
对应的配置文件属性如下所示
apiVersion: eci.alibabacloud.com/v1 kind: ImageCache metadata: name: portscan-image annotations: k8s.aliyun.com/eci-image-cache: "true" # 开启镜像缓存复用。 spec: images: - demo-test-registry.cn-beijing.cr.aliyuncs.com/fc/portscan-consumer:prod-${PORTSCAN_CI_TAG_NAME} imageCacheSize: 25 # 镜像缓存大小,单位GiB。 retentionDays: 7 # 镜像缓存保留时间。 --- apiVersion: serving.knative.dev/v1 kind: Service metadata: name: portscan-service namespace: scanner spec: template: metadata: annotations: autoscaling.knative.dev/class: "kpa.autoscaling.knative.dev" autoscaling.knative.dev/min-scale: "1" autoscaling.knative.dev/max-scale: "1000" autoscaling.knative.dev/metric: "concurrency" autoscaling.knative.dev/target: "1" serving.knative.dev/revision-timeout-seconds: "1800" spec: containerConcurrency: 2 containers: - image: demo-test-registry.cn-beijing.cr.aliyuncs.com/fc/portscan-consumer:prod-${PORTSCAN_CI_TAG_NAME} env: - name: TZ value: Asia/Shanghai resources: requests: cpu: "1000m" #容器的vCPU上限 memory: "2000Mi" #容器的内存上限 limits: cpu: "2000m" #容器的vCPU上限 memory: "3000Mi" #容器的内存上限
其中
autoscaling.knative.dev/class: "kpa.autoscaling.knative.dev" autoscaling.knative.dev/min-scale: "1" autoscaling.knative.dev/max-scale: "1000" autoscaling.knative.dev/metric: "concurrency"
环境部署
这边分为两个,一个是云环境,一个是本地环境部署
云环境部署
阿里云上k8s ack
本地环境部署
minikube
安装 Minikube 和 kubectl
启动 Minikube,并启用必要的插件(如 Ingress 控制器)
minikube start --memory=4096 --cpus=4 --addons=ingress
安装Knative Serving和Eventing组件:
使用官方提供的 YAML 文件或 Helm Chart 安装 Knative。
kubectl apply --selector knative.dev/crd-install=true -f https://github.com/knative/serving/releases/download/v1.8.0/serving-crds.yaml kubectl apply -f https://github.com/knative/serving/releases/download/v1.8.0/serving-core.yaml
代码如何限制并发为1
在golang代码中可以通过WithPollGoroutines
和WithBlockingCallback
设置并发数
// 创建 HTTP 协议绑定 p, err := http.New(http.WithPort(8080)) if err != nil { log.Printf("failed to create protocol: %v", err) return } // cloud event 初始化 c, err := client.New(p, client.WithTimeNow(), client.WithUUIDs(), client.WithPollGoroutines(1), // 防止因并发导致的SYN PCAP出现问题 client.WithBlockingCallback()) // 堵塞,防止因并发导致的SYN PCAP出现问题 if err != nil { log.Printf("failed to create client, %v", err) return } // 接收队列信息 if err = c.StartReceiver(ctx, ReceiveEvent); err != nil { log.Printf("failed to start receiver: %v", err) return }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
2021-12-10 hyscan 基于内网信息搜集/利用工具