容器是公共云和私有云中部署应用程序的主要趋势。但是,容器究竟是什么?为什么它们已成为一种流行的部署机制?您需要如何修改您的应用程序以优化其在容器化环境中的运行?
什么是容器?
容器背后的技术历史悠久,始于 2000 年的 SELinux 和 2005 年的 Solaris zones。如今,容器是包括 SELinux、Linux 命名空间和控制组在内的多个内核功能的组合,可提供最终用户进程、网络和文件系统空间的隔离。
为什么它们如此受欢迎?
容器最近的广泛采用很大程度上归功于旨在使其更易于使用的标准的制定,例如 Docker 镜像格式和分发模型。该标准要求使用不可变镜像,这是容器运行时的启动点。不可变镜像保证了开发团队发布的相同镜像就是经过测试并部署到生产环境中的镜像。
容器提供的轻量级隔离为应用程序组件创建了更好的抽象。在容器中运行的组件不会像直接在虚拟机上运行时那样相互干扰。可以防止它们相互争夺系统资源,并且除非它们共享持久卷,否则不会阻止尝试写入相同的文件。容器帮助标准化了诸如日志记录和指标收集之类的实践,并且它们允许在物理和虚拟机上提高多租户密度,所有这些都降低了部署成本。
如何构建容器就绪的应用程序?
更改您的应用程序以在容器内部运行不一定是必需的。主要的 Linux 发行版都有可以运行虚拟机上任何内容的 базовый 镜像。但是,容器化应用程序的总体趋势是遵循一些最佳实践
1. 实例是可抛弃的
您的应用程序的任何给定实例都不应需要小心维护运行。如果运行大量容器的一个系统出现故障,您希望能够启动新的容器,分散在其他可用系统上。
2. 重试而不是崩溃
当您的应用程序中的一项服务依赖于另一项服务时,当另一项服务无法访问时,它不应崩溃。例如,您的 API 服务正在启动,并检测到数据库无法访问。您可以将其设计为重试连接,而不是失败并拒绝启动。当数据库连接断开时,API 可以使用 503 状态代码进行响应,告诉客户端该服务当前不可用。应用程序应该已经遵循了这种做法,但是如果您在实例可抛弃的容器化环境中工作,那么对它的需求就变得更加明显。
3. 持久数据是特殊的
容器是基于使用写时复制 (COW) 文件系统的共享镜像启动的。如果容器正在运行的进程选择写入文件,那么这些写入将仅在容器存在期间存在。当容器被删除时,COW 文件系统中的该层将被删除。为容器提供一个已挂载的文件系统路径,该路径将在容器的生命周期之外持久存在,这需要额外的配置,以及物理存储的额外成本。明确定义持久存储的抽象概念,有助于推广实例可抛弃的想法。拥有抽象层还允许容器编排引擎处理将持久卷挂载和卸载到需要它们的容器的复杂性。
4. 使用 stdout 而不是日志文件
您现在可能在想,如果持久数据是特殊的,那么我该如何处理日志文件?容器运行时和编排项目采用的方法是,进程应该写入 stdout/stderr,并具有用于归档和维护 容器日志的基础设施。
5. 密钥(和其他配置)也是特殊的
您永远不应将密码、密钥和证书等机密数据硬编码到您的镜像中。当您的应用程序与开发服务、测试服务或生产服务通信时,密钥通常是不相同的。大多数开发人员无权访问生产密钥,因此如果密钥被烘焙到镜像中,则必须创建一个新的镜像层来覆盖开发密钥。此时,您不再使用由您的开发团队创建并由质量工程 (QE) 测试的相同镜像,并且失去了不可变镜像的好处。相反,这些值应被抽象为在容器启动时注入的环境变量或文件。
6. 不要假设服务的同地协作
在编排的容器环境中,您希望允许编排器将您的容器发送到当前最合适的节点。最合适可能意味着很多事情:它可能基于当前哪个节点具有最大的空间、容器请求的服务质量、容器是否需要持久卷等等。这很容易意味着您的前端、API 和数据库容器都最终位于不同的节点上。虽然可以强制 API 容器到每个节点(请参阅 Kubernetes 中的 DaemonSets),但这应该保留给执行诸如监视节点本身的任务的容器。
7. 规划冗余/高可用性
即使您的负载不足以需要 HA 设置,您也不应以阻止您运行多个副本的方式编写您的服务。这将允许您使用滚动部署,这使得可以轻松地将负载从一个节点转移到另一个节点,或者将服务从一个版本升级到下一个版本而无需停机。
8. 实施就绪性和活跃性检查
应用程序通常需要启动时间才能响应请求,例如,需要填充内存数据缓存的 API 服务器。容器编排引擎需要一种方法来检查您的容器是否已准备好为请求提供服务。为新容器提供就绪性检查允许滚动部署保持旧容器运行,直到不再需要它,从而防止停机。同样,活跃性检查是编排引擎继续检查容器是否处于健康状态的一种方式。由应用程序创建者来决定他们的容器健康或“活跃”意味着什么。不再活跃的容器将被杀死,并在其位置创建一个新容器。
想了解更多信息吗?
我将在 10 月份的 Grace Hopper Celebration of Women in Computing 大会上发表演讲:应用程序的容器化:是什么、为什么和如何。今年不参加 GHC 大会?那么请继续阅读 OpenShift 和 Kubernetes 项目网站上关于容器、编排和应用程序的内容。
评论已关闭。