EDAS支持使用ECS环境和K8s环境部署应用,两种环境都能满足应用托管的需求,但功能上也存在一定的差异。如果您处于技术选型或架构迁移过程中,对于选择使用哪种环境来管理应用可能存在疑惑。本文为您提供一些选择环境的建议和两种环境的功能对比,以帮助您完成决策。

背景信息

EDAS支持使用ECS环境和K8s环境部署应用,两种部署环境都支持Spring Cloud、Dubbo和HSF微服务框架的Java应用的应用托管和微服务治理功能,以及可观测性。但这两种部署环境对于应用程序本身和用户技术栈的要求是不一样的,且EDAS提供的应用管理能力也有所区别。

选型建议

一般情况下,建议使用K8s环境部署应用。EDAS与阿里云容器服务Kubernetes版进行了深度整合,提供了丰富的应用管理功能,可以实现更高的资源利用率。

对于特定场景,建议选用特定环境来部署您的应用。

场景 环境
  • 应用的形态为容器镜像,或者是非Java应用。
  • 对应用有单机多实例部署、高密度部署的要求。
  • 希望同时使用K8s来进行管理(如使用kubectl工具),或使用K8s提供的其他功能。
K8s环境
  • 存在大量非容器化应用。

    ECS环境的优势主要在于对非容器化部署的应用更加友好,更容易复用存量应用运维体系。

  • 对单体性能和稳定性有极高要求的应用。
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支持更加更高级的监管控一体化诊断能力。
资源代购 Y N
服务网格 N Y
镜像部署支持 N Y
多语言支持 N Y
NAS支持 N Y

常见问题

ECS环境能否支持单节点部署多应用实例?

不支持,如有此需求,请使用K8s环境。

ECS环境能否支持部署多语言应用?

不支持,如有此需求,请使用K8s环境。

ECS环境和K8s环境对应的OpenAPI接口是否相同?

不完全相同。

ECS环境和K8s环境是否都支持使用开发者工具?

都支持,但配置有所区别,需要注意区分。

ECS和K8s环境是否都支持云效?

都支持。但云效旧版本仅支持ECS环境部署,云效2020支持ECS和K8s环境部署。

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的销毁实例与停止实例是一个过程。