Kubernetes提供声明式API对标准对象进行生命周期管理,例如Deployment,Pod,Service以及ConfigMap等。基于这种原子能力,开发人员可以自由组合各种对象,以Yaml,Json等格式文件进行定义,构建自己的业务应用。
随着应用自身的复杂度增加,依赖条件变多,部署环境的多样性,这种原始的声明式API使用方式显得低效且不够灵活;另外,在应用与声明式API之间缺少一个构建标准,也不利于应用的共享,分发,以及应用市场的发展。Helm和Operator应运而生,在声明式API之上进行了一层抽象和封装,成为解决这种困境的两个主要流派。
Helm是基于Kubernetes的应用包管理工具,可实现应用程序封装、版本管理、依赖检查、应用分发,是对容器应用所需资源组件进行集中管理,并通过模板化和配置分离提高声明式API的开发和使用效率。Chart包则是应用的载体,实现了应用的分发和共享,支撑了应用市场的发展。
Operator主要包含CRD和Controller两个部分:
Helm和Operator从不同角度衔接了应用和声明式API,两者之间有着明显的差异,下面从不同角度对Helm以及Operator进行了一个比较:
Helm | Operator | |
---|---|---|
资源类型 | 标准对象,自定义对象 | 自定义对象 |
编排能力 | 支持应用全生命周期管理 | 支持应用全生命周期管理 |
运维能力 | 手工,较弱 | 自动故障恢复及异常处理 |
设计理念 | 资源模板化,配置分离 | 复杂应用的自动化管理 |
实现方式 | 传统镜像 | k8s控制器 |
实现难度 | 较低 | 偏高 |
灵活性 | 高度灵活修改yaml文件 | 依赖控制程序,不太灵活 |
适宜场景 | 通用,普适 | 有状态服务,较复杂应用场景 |
关于应用场景方面,其实不太好区分,因为这两项技术本身就致力于解决不同的问题: