-
Notifications
You must be signed in to change notification settings - Fork 173
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Deploy layotto on AWS and Alibaba Cloud, together with native sidecar #713
Comments
A、目前Capa SDK模式在落地中的痛点:1. 多语言问题:我们目前主要有java/nodejs两种语言,后续可能拓展到python/golang语言,同一个逻辑需要在多种语言中实现,开发维护成本高。 2. 版本迭代问题:在公有云落地初期,需要定制/兼容的逻辑比较多,经常改一行代码然后就要升级sdk版本,再去推业务方升级,业务方频繁升级导致推进困难。 3. Java依赖冲突:由于CapaSDK需要和第三方sdk一起运行,有时会涉及到多个云的sdk。虽然借助maven做了依赖隔离管理,但有时还是会遇到依赖冲突的问题,在解决依赖冲突上花费了比较大的精力。 4. 发包链路长:由于Capa分成了好几个层次(api层/spi实现层等),相互之间通过maven发布的jar包进行引用。导致修改一个功能,需要依次升级多个包,开发效率较低。 B、Capa run on multi-runtime调研:1. 在私有云,继续使用sdk模式。私有云功能由专门的中间件sdk提供,直接复用,不需要做很多自定义逻辑。 2. 在公有云,java大部分功能继续使用sdk模式,调研sidecar模式可行性,并尝试逐渐将功能下沉到sidecar中。Capa run on multi-runtime模式。 3. 在公有云,golang/python等语言可以直接尝试使用layotto-sdk,并使用sidecar模式。如果sidecar模式可行,后续Capa不必再为其他语言开发一套sdk,可以直接复用layotto-sdk。 |
C、功能下沉到sidecar1. configurationconfiguration对性能要求比较低,容错度比较高。所以会先考虑下沉到sidecar中。 Capa目前在aliyun上使用MSE Nacos-Client,在aws上使用appconfig client。 目前,Capa做了一些自定义逻辑在里面:
2. RPC Client目前,在aws/aliyun的Capa SDK中链路如下:
Capa在SDK中(①中)做了一些自定义逻辑:
(1)对于(1)这种场景,能否下沉到sidecar中呢。 如果将该部分逻辑加入到envoy当中,就如上所述,可能要自运维镜像,并且不好修改。 能否先走layotto,将自定义逻辑写在layotto当中呢(用golang或者wasm)。layotto再将流量转发给appmesh/asm envoy。 但这样会不会带来性能损耗。 (2)对于(2)中获取trace上下文字段的功能,我觉得可能没有办法下沉到sidecar中,因为trace上下文跟线程上下文有关。 这个可能也是layotto-sdk需要考虑的问题吧?layotto-sdk该如何做trace-id上下文追踪呢? Capa目前是基于 [OpenTelemetry] 定义了一套 Trace/Metric Runtime API,并且在RPC Client中通过这套API获取当前的trace-id等字段,然后放入http header中。 (3)在使用aws appmesh时,发现它原生的 熔断/限流/预热 等功能并不完善。 如果引入layotto,是否可以在layotto中实现这些能力呢,我理解可能要引入mosn是吧 3. RPC Server目前,在aws/aliyun的Capa SDK中链路如下:
Capa在SDK中(①中)做了一些自定义逻辑:
(1)同上,envoy中无法植入逻辑,如果请求直接到 Tomcat/SpringMVC,那还是需要每种语言SDK都要写一遍Server端的自定义逻辑。 能否实现:
这样可以在(②)中植入服务端的一些自定义逻辑。 (2)同上,这个还是需要在SDK内做的,将header中的字段放入线程上下文(trace)。 4. Mysql、Redis如果layotto的redis component性能比较好,可以考虑redis下沉到sidecar。 如果性能不稳定的话,暂不考虑下沉到sidecar中,可能在未来考虑使用database mesh、redis mesh等。 4. mq pub/sub主要是producer/consumer。 目前在aliyun/aws上目前使用kafka,可以考虑下沉到sidecar。 5. log、trace、metricCapa目前在使用的API,可能无法下沉到sidecar中。 log:不同云上,打印日志的方式不同。例如私有云上直接打到私有云log sdk中(通过网络传输日志);公有云上直接打到磁盘上。都不经过sidecar。 trace/metric:基于opentelemetry sdk实现,跟线程上下文有关,无法下沉到sidecar中。 6. Capa 正在做的功能file/s3: 可以考虑下沉到sidecar,和社区默认实现可能也有一些自定义逻辑上的不同 dislock: 可以考虑下沉到sidecar ratelimit:后续给社区提案 |
D、sidecar部署模式的讨论如果要部署sidecar,讨论一下哪种部署方式会更好一些呢。 1. sidecar模式经典模式,不过在已经部署了appmesh/asm的情况下,需要再部署一个容器。 最终一个pod中会有3个容器,主要问题是成本问题:部署成本和运维成本。 可能调试起来不太方便,见(E)。 2. 独立部署模式比如将layotto独立部署为中心化节点。 然后像configuration这类非性能敏感的场景,是否可以由业务pod通过grpc直连中心化节点来提供。 好处是:
但这么搞的项目比较少,比如中心化瓶颈、单点故障等问题? E、sidecar模式的本地调试问题这应该是一个社区常见的问题,就是如何在开发环境进行debug,无论是envoy/istio/dapr我似乎都没有找到很好的解决方案。 如果Capa由SDK模式切换到sidecar模式,有办法进行方便的本地debug吗(网络是通的)。 不过Capa目前正在使用的Appmesh和ASM,也没有很好的解决这个问题。 |
F、与云平台的顺滑集成我之前看layotto社区是打算复用istio工具链,然后在k8s里面做layotto on istio是么。 那像已经在用aws appmesh和asm的用户(非原生istio),该如何顺滑集成呢。 比如appmesh,是通过helm安装的。 layotto有没有类似helm的方式,可以很方便的在k8s集群中进行安装/升级/卸载呢。 |
以上是对该issue的补充说明~ |
关于RPC Client:
取线程上下文、塞header ,听起来是只能由sdk实现的功能;你们其他语言也会有类似需求么? |
是的
我调研下,你可以帮忙一起看看,因为我对这些云服务也不是很熟 我们先确定大的方向,再讨论细节哈。几个可能的方向: 我感觉 B 更合适些, @kevinten10 先评估下? |
是的,这个应该是只能由sdk实现的。 其他语言也会有,不过opentelemetry提供了多语言sdk,这个可以复用它的sdk。 这种分布式追踪的功能,应该是普遍的应用场景,layotto-sdk打算怎么做呢?
这部分我感觉是会经常修改的。例如最开始只需要传递trace-id,后面又逐渐添加trace-souce等字段。最终在每次rpc调用时,header中会有一大堆用于上下文传递的字段(已有的rpc框架,往往有很多的自定义header) |
A这样感觉对阿里云会很好啊,应用迁移到阿里云的成本会变低。不过还是会面临混合云的问题呢:在阿里云用托管layotto,在azure用托管dapr,在aws/gcp自己搞? 以及,托管服务如何让用户写自定义逻辑呢,生产用户很难100%复用公共逻辑,能用wasm写hook逻辑吗。 B我们很难迁移到mosn上面来,主要是:
C可能是小语种就直接用sidecar了,java的话功能逐步下沉到sidecar,期望是未来全部放到sidecar里面呢 |
我确认下需求,是说:可能时不时的想在 app 调sidecar的 请求header 里,加一些字段? 加字段的话,layotto sdk 不用改,毕竟对上层暴露的是个map,上层想塞啥字段都行;但是既然上层框架想加字段,那确实没办法,只能升级(上层框架的)sdk |
后续可以考虑: 基于 Mosn-on-Envoy 做 Layotto on envoy,社区做一些工具链,让”用户自己构建 envoy 镜像”这件事变的更简单一些。不知道这条路有市场么。 |
是的,不想在sdk里面加,想在sidecar里面加。 |
|
我这边有可以操作的appmesh环境,我先尝试一下把layotto跑起来试试 |
对于 “app 开发者如何调试 app”,一般有以下几种方案:
对于 “layotto 开发者如何调试 layotto”: 我补个文档吧 |
本地搞个docker,对于业务同学不太友好,有点geek style。
我对这个方案比较感兴趣,意思是否为: 比如我在远端测试环境,自己拉起一个pod,在里面跑layotto sidecar,然后把pod的ip设为本地可访问。 这样我在本地调试时,把localhost修改为以上ip,即可实现本地进程连接到layotto sidecar是么。 good idea!
一般不会在云端进行编码,还是本地ide居多。
enough~ |
是的 |
刚去聊了下,Mosn-on-Envoy 预计8月开源 好处:
@kevinten10 可以周六聊下这事? |
好啊
应该无法替换云厂商托管的镜像,除非使用hack的方式,所以可能还是在外面加一个吧 |
可以试一下layotto进程级别部署,把layotto和业务容器做到一个container中,而不是作为sidecar存在。如果内存和cpu有负担,layotto这边也可以尝试阉割一部分用不到的能力。以此减少性能的影响。 |
Hi,这个有实际的落地实践吗~我不太清楚,这种方式有没有什么缺陷呢 |
@kevinten10 这种方式还没落地实践过 |
会议结论 关于 app mesh 的情况没法把 envoy 镜像替换成 Layotto-on-envoy 其他缺点:
方向:
优化
关于部署方式加个 sidecar 容器。只在公有云玩 sidecar 模式 关于动态配置下发通过配置中心(qconfig, app config, nacos) 目标希望在9月 跑起来 demo action
demo 包括功能:
|
@kevinten10 问下,改 layotto配置的时候,用 configmap挂载新的config.json、重启,能满足需求对吧? |
满足的。以及,configmap有热更新吧,不知道layotto能监听到config.json的变更吗 |
现在还没监听变更,不过这个好弄,实在不行写个脚本,有变更就 kill layotto、重启 |
@kevinten10 目前调研到的差异:
解决方案:
关于“这种模式用 dapr 还是 layotto”: |
@kevinten10 hi 我确认下,上次说 Poc 跑通了 是指哪些能力跑通啦? |
部署通了:pod内有4个container:
在这种情况下,bussiness container可以正常运行并提供服务
如果要跑这个poc,比如A服务rpc调用testservice服务,我理解是这样的: A app --(grpc: invoke api)--> layotto --(http://testservice.prod:8080/api1)--> envoy 在这里我需要layotto的invoke组件,能够"重写url"并发起新的http请求。 我在这里提到过类似的想法:#705 |
我看了一下 #739 ,确实可以供我们跑poc。未来跑生产之前再解决短链接问题
方便的,我会都尝试跑一下,然后整理一下结果 |
This issue has been automatically marked as stale because it has not had recent activity in the last 30 days. It will be closed in the next 7 days unless it is tagged (pinned, good first issue or help wanted) or other activity occurs. Thank you for your contributions. |
This issue has been automatically closed because it has not had activity in the last 37 days. If this issue is still valid, please ping a maintainer and ask them to label it as pinned, good first issue or help wanted. Thank you for your contributions. |
@kevinten10 目前遇到了多语言维护成本高的痛点,在调研 sidecar 模式
但是遇到了问题:
需求细节:
action:
The text was updated successfully, but these errors were encountered: