文档

选择应用部署环境

更新时间:

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

部署环境简介

EDAS为应用提供了ECS和K8s两种集群部署环境。

  • ECS集群和K8s集群都支持Spring Cloud、Dubbo和HSF微服务框架的Java应用的托管、服务治理及可观测性。

  • 仅K8s集群支持多语言应用的托管、服务治理及可观测性。

另外,这两种部署环境对于应用程序本身和用户技术栈的要求是不一样的,且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(Kubernetes)具备更为强大的一体化监管控与诊断能力。

资源代购

Y

N

服务网格

N

Y

镜像部署支持

N

Y

多语言支持

N

Y

NAS支持

N

Y

常见问题

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

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

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

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

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

不完全相同。OpenAPI列表,请参见API概览

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