EDAS支持在ECS集群和K8s集群中部署应用,两种环境都能满足应用托管的需求,但功能上也存在一定的差异。如果您处于技术选型或架构迁移过程中,对于选择使用哪种环境来管理应用存在疑惑,本文为您提供一些选择环境的建议和两种环境的功能对比,以帮助您完成决策。
部署环境简介
EDAS为应用提供了ECS和K8s两种集群部署环境。
ECS集群和K8s集群都支持Spring Cloud、Dubbo和HSF微服务框架的Java应用的托管、服务治理及可观测性。
仅K8s集群支持多语言应用的托管、服务治理及可观测性。
另外,这两种部署环境对于应用程序本身和用户技术栈的要求是不一样的,且EDAS提供的应用管理能力也有所区别。
部署环境选择建议
一般情况下,建议使用K8s环境部署应用。EDAS与阿里云容器服务Kubernetes版进行了深度整合,提供了丰富的应用管理功能,可以实现更高的资源利用率。
您根据实际使用场景,来选择合适的环境。
场景 | 环境 |
| K8s环境 |
| ECS环境 |
如果您已经使用了ECS环境来管理应用,现在需要使用K8s提供的高级功能,可以将应用迁移至K8s环境。
应用托管功能对比
下表列出了ECS环境和K8s两个环境的功能对比,Y代表支持,N代表不支持。
功能 | ECS环境 | K8s环境 | 备注 |
部署应用 | Y | Y | K8s环境支持更丰富的实例调度策略,支持单机多部署。 |
启动应用 | Y | Y | 无 |
停止应用 | Y | Y | 无 |
删除应用 | Y | Y | 无 |
应用扩缩容 | Y | Y | 无 |
重置应用 | Y | N | K8s环境无需此功能,删除Pod即为重置。 |
容器升降级 | Y | Y | 无 |
应用回滚 | Y | Y | 无 |
自动水平扩容 | Y | Y | 支持方式和规则有所区别。 |
定时弹性 | N | Y | 无 |
分批部署 | Y | Y | 无 |
应用分组 | Y | N | 无 |
应用分组配置 | Y | N | 无 |
实时日志 | Y | Y | 无 |
日志目录 | Y | Y | 无 |
SLS日志 | Y | Y | 无 |
负载均衡 | Y | Y | 无 |
健康检查 | Y | Y | K8s环境支持Readiness和Liveness探针,与ECS环境不同。 |
JVM参数配置 | Y | Y | 无 |
Tomcat配置 | Y | Y | 无 |
生命周期挂钩 | Y | Y | K8s环境支持PostStart和PreStop挂钩,与ECS不同。 |
环境变量 | Y | Y | 无 |
金丝雀发布(灰度发布) | Y | Y | 无 |
流量监控 | Y | Y | 无 |
限流降级 | Y | Y | K8s环境可实现无侵入接入。 |
服务列表查询 | Y | Y | 无 |
配置推送 | Y | Y | 无 |
事件中心 | Y | Y | 无 |
通知报警 | Y | Y | 无 |
应用诊断 | Y | Y | K8s(Kubernetes)具备更为强大的一体化监管控与诊断能力。 |
资源代购 | Y | N | 无 |
服务网格 | N | Y | 无 |
镜像部署支持 | N | Y | 无 |
多语言支持 | N | Y | 无 |
NAS支持 | N | Y | 无 |
常见问题
ECS环境能否支持单节点部署多应用实例?
不支持,如有此需求,请使用K8s环境。
ECS环境能否支持部署多语言应用?
不支持,如有此需求,请使用K8s环境。
ECS环境和K8s环境对应的OpenAPI接口是否相同?
不完全相同。OpenAPI列表,请参见API概览。
ECS环境和K8s环境是否都支持使用开发者工具?
都支持,但配置有所区别,需要注意区分。
Cloud Toolkit的更多信息,请参见Cloud Toolkit概述。
Maven Plugin的更多信息,请参见toolkit-maven-plugin概述。
Terraform的更多信息,请参见Terraform概述。
Jenkins的更多信息,请参见Jenkins概述。
ECS和K8s环境是否都支持云效?
都支持。但云效旧版本仅支持ECS环境部署,云效2020支持ECS和K8s环境部署。
云效旧版本仅支持ECS环境部署。更多信息,请参见通过EDAS部署。
云效2020支持ECS和K8s环境部署。更多信息,请参见云效流水线 Flow。
K8s环境如何实现节点资源的代购扩容?
K8s环境对应的弹性伸缩功能是指Pod的弹性伸缩,正常情况下不会购买新的ECS实例(节点),也不会释放已有的实例(节点)。
可以配合容器服务提供的功能来实现节点的弹性伸缩。更多信息,请参见节点自动伸缩。
如果使用ECS环境的挂载脚本功能,如何迁移至K8s环境?
ECS应用的挂载脚本用于在发布单执行到特定阶段时执行指定的命令,目前有4个生命周期阶段可供挂载,分别是准备实例、启动应用、停止应用和销毁实例。
由于K8s环境提供的生命周期挂钩仅限于PostStart和PreStop,与ECS应用无法完全对应,因此在迁移使用了挂载脚本功能的应用到K8s环境时,需要做一定的修改。
准备实例阶段前的挂载脚本,可以将其编排到Dockerfile,并固定到镜像中。
启动应用阶段前的挂载脚本,也可以将其编排到Dockerfile,并固定到镜像中。
Pod的准备实例与启动应用是一个过程。
启动阶段后的挂载脚本,可以配置到PostStart挂钩中。
停止实例阶段前的挂载脚本,可以配置到PreStop挂钩中。
停止实例阶段后的挂载脚本,建议在应用进程的优雅停止过程中做清理工作(比如在Java的ShutdownHook或者其他对于sigterm信号的监听流程中做清理),也可以视情况将其移动到PreStop挂钩中处理。
销毁实例阶段前的挂载脚本,建议在应用进程的优雅停止过程中做清理工作(比如在Java的ShutdownHook或者其他对于sigterm信号的监听流程中做清理),也可以视情况将其移动到PreStop挂钩中处理。
Pod的销毁实例与停止实例是一个过程。