现代 IT 基础设施管理方式,正因其二者结合被深刻改变,二者分别是容器化技术以及自动化运维工具。Docker 提供的,是可用于应用打包及运行的带有轻量级、一致性特点的环境,SaltStack 具备并出色展现的,则是高效的配置管理以及批量命令执行能力。将二者进行妥善协同,能够成功构建出一条具备敏捷、可靠以及易于维护特性的部署流水线,这无疑是那些追求高效运维的团队相当重要的必备的技术选择。本文将要展开探讨研究的,是怎样把这二者结合在一起去使用以此有效解决实际运维过程当中涉及的具体问题。
Docker与SaltStack如何协同工作
Docker跟SaltStack的协同,主要是盐栈在管理Docker容器生命周期这里得以体现,Salt Master能够把和Docker相关的状态配置以及命令,发送到装有Salt Minion与Docker守护进程的目标服务器那儿,这就让容器的创建、启动、停止还有销毁,都如同管理服务器配置那般,凭借代码化的形式来集中控制。

比如说,你能够去编写一个Salt状态文件docker saltstack,这里面清晰地界定了要从哪一个镜像运行容器,映射的是哪些端口,挂载的又是哪些数据卷。当针对这个状态应用到目标Minion之时,SaltStack会保证容器的运行状况同定义达成完全的一致。这种模式把基础设施即代码的观念拓展至容器层。达成了自底层系统直至应用服务的统一编排 。
如何在SaltStack中管理Docker容器
在SaltStack里头管理Docker容器,主要依靠‘docker’模块以及‘docker’状态模块。针对那些需要执行一次性命令的情形,能够使用‘docker.ps’、‘docker.run’等执行模块函数,借由Salt命令行迅速查询容器状态或者临时启动出一个容器。这给运维人员赋予了强大的实时操作能力。

那些需要持久化维护的容器哇linux web服务器,就应当去使用状态模块呢。你能够在状态文件里运用docker.running呀,以此来确保一个容器处于运行状态哟,并且定义它全部的参数哒。SaltStack会开展状态检查哒,要是发觉容器不存在或者配置被更改了呢,就会自动去进行修复哒。结合Salt的file.managed状态呀,你还能够轻松地把自定义的Dockerfile或者应用配置文件分发到服务器哒,然后触发镜像构建以及容器运行哇,进而完成一站式部署哒。
使用SaltStack部署Docker镜像的最佳实践
实施最佳实践的关键要点在于,必须把部署进程彻底地代码化以及版本化。其一,要把全部的Salt状态文件、Pillar数据(像是镜像标签、端口号这类敏感或者可变的量)都归入Git 版本控制范畴。其二,如此安排之下,每一回的部署变动都会有线索可查,而且能够借助CI/CD流程来开展自动化测试以及发布。

提议运用“镜像分层管理”策略,基础镜像由统一的平台团队予以维护,应用镜像借助Dockerfile进行构建,在SaltStack里,能够定义一个状态,初步运用docker.build从代码仓库构建生成应用镜像docker saltstack,继以运用docker.running将其启动。Pillar能够用于动态传递构建版本号永久免费linux服务器,达成蓝绿部署或者金丝雀发布等高级部署模式,以此极大程度地减少服务中断时间, 句号勿漏!
如何用SaltStack编排多容器Docker应用
当面对那种复杂的、包含多种容器的应用,比如说有Web应用、数据库、缓存服务的应用时,就需要SaltStack来提供编排能力。有一种办法是,针对每一个容器组件去编写单独的状态文件,之后通过include语句在一个顶层状态里对它们进行组织,还要利用require等语句来定义容器之间的启动依赖关系,以此保证数据库是先于Web应用启动的。
在更为复杂的情境设定之下,能够思索运用dockercompose模块。于Salt Master那儿维持一个docker-compose.yml文件,接着借由Salt状态把它分发至目标主机,随后执行dockercompose.up命令用以一键启动整个应用栈。纵使SaltStack固有的编排能力比不上有如那般强大的Kubernetes,然而针对中小规模的分布式应用抑或是传统微服务迁移情形,这般依靠SaltStack以及Docker Compose的方案已然足够明晰、高效。

如何监控SaltStack管理的Docker容器
从容器层面以及SaltStack管理状态层面这两个方面着手进行监控。关于容器自身那些如CPU 、内存、网络IO这般的资源监控,能够借助在Minion上部署Node Exporter这类监控代理,或者运用Salt把cAdvisor当作容器启动起来,以此来收集相关指标并将其汇聚到Prometheus里面。
对于管理状态的监控,需充分运用SaltStack本身的返回器,也就是Returner,以及事件系统,即Event Bus。能将Job执行结果配置发送至数据库或者日志系统,经由这样做来实现审计。更为关键的是对状态应用是否失败加以监控。能够定期开展state.highstate测试,或者监听Salt事件总线里有关状态运行失败的事件,及时发起告警,使基础设施的代码定义与实际状态一直维持相符 。
Docker和SaltStack结合常见问题与解决方案

存在一个常见的状况,即是容器内部的服务开启速度,有可能比SaltStack的状态应用速度要快,进而致使依赖检查出现失败。譬如来讲,网络应用容器的状态或者是倾向于依赖,数据库容器已发生监听端口的事项。解决的方法是,于状态条件之中运用 docker.running 的观测论证、抑或制作定制型的等待预案清单列表,以此来确保进行后续的操作之前,依赖服务是实实在在处于就绪状态的。
另外存在的一个问题是镜像更新,直接去更改处于docker.running状态的镜像标签,SaltStack会尝试着去替换容器,然而这有可能导致出现短暂的服务中断情况,更具平滑性的方案是采纳“首先拉取新镜像,接着进行滚动重启” 的策略,可以借助Salt调度器来定期执行docker.pulled以拉取最新镜像,再联合watch和docker.soft_kill信号的方式,达成应用的无缝重启,以此来提升服务的可用性。
您于实际工作当中,是更加偏向运用SaltStack去管理容器呢,还是选用像Kubernetes这般的原生容器编排平台呀?为何如此呢?欢迎于评论区里分享您的经验以及见解哟,要是觉着本文具备帮助作用的话,请点赞并且分享哈。
