应用上容器云的准入条件和最佳实践

时间:2022-10-11 10:16:14

随着Kubernetes的发展,现在有一个新的技术趋势:在容器云中以Pod的方式运行虚拟机,这样容器云平台就能够提供普通容器无法实现的功能。相信通过类似的技术,越来越多的应用会向容器云迁移。整体而言,应用上容器云的准入条件包含如下几个方面。

  • 已建立了清晰的可自动化的编译及构建流程:应用使用如Maven、Gradle、Make或Shell等工具实现了构建编译步骤的自动化,以便在容器平台上实现自动化的编译及构建流程。
  • 已实现应用配置参数外部化:应用已将配置参数外部化于配置文件或环境变量中,以便应用容器能适配不同的运行环境。包含特定环境的配置的容器镜像不能在整个环境(Dev、QA、Prod)中升级。为了实现可靠的发布过程,应将在较低环境中测试过的相同镜像部署到生产中。将特定环境的配置保留在容器镜像之外,例如,使用ConfigMap和Secret存储应用程序配置。
  • 已提供合理可靠的健康检查接口:容器平台将通过健康检查接口判断容器状态,对应用服务进行状态保持。
  • 已实现状态外部化,以及应用实例无状态化:应用状态信息存储于数据库或缓存等外部系统,应用实例本身实现无状态化。
  • 不涉及底层的操作系统依赖及复杂的网络通信机制:应用以处理业务为主,不强依赖于底层操作系统及组播等网络通信机制,提高可移植性。
  • 部署交付件及运行平台的大小在2GB以内:轻量级的应用便于在大规模集群中快速传输分发,更符合容器敏捷的理念。
  • 启动时间在5分钟以内:过长的启动时间将不能发挥容器敏捷的特性。

如果应用明显不符合上述条件,则其暂时不适合运行在容器上。在应用上容器云时,除了需要遵循以上准入条件,还需要尽量符合以下最佳实践。

  • 在Pod定义中指定资源请求和资源限制。如果请求资源的配置不正确的话,那么应用程序可能会耗尽内存或导致CPU资源不足。指定请求的内存和CPU资源可以使集群做出适当的调度决策,以确保应用程序具有足够的可用资源。
  • 使用Pod中断预算保护应用程序。在某些情况下,需要将应用程序容器从集群节点中逐出。例如,在管理员可以执行节点维护之前或在缩减规模时集群自动缩放器可以从集群中删除节点之前,需要驱逐Pod。为确保驱逐Pod时应用程序仍然可用,你必须定义各自的PodDistruptionBudget对象。PodDisruptionBudget是一个API对象,用于指定保证应用可用的最小副本数或最小百分比。
  • 每个容器运行一个进程。避免在单个容器中运行多个进程。每个容器中运行一个进程可以更好地隔离进程,避免信号路由出现问题。
  • 应用程序监视和警报。应用程序监视和警报对保持应用程序在生产中良好运行并满足业务目的至关重要。可以使用Prometheus和Grafana等监视工具来监视你的应用程序。
  • 配置应用程序以将其日志写入stdout或stderr。容器云将收集这些日志并将其发送到集中位置(ELK、Splunk)。在分析生产问题时,应用程序日志是宝贵的资源。基于应用程序日志内容的警报有助于确保应用程序按预期运行。
  • 考虑实施弹性措施:断路器、超时、重试、速率限制。弹性措施可以使你的应用程序在出现故障时表现更好。它们可保护你的应用程序免于过载(速率限制、断路器),并在遇到连接问题(超时、重试)时提高性能。
  • 使用受信任的基础镜像。尽可能使用容器厂商提供的企业级容器镜像。容器厂商提供的镜像已通过测试、安全加固并有相应的技术支持。如果使用社区提供的镜像,请尽量使用你信任的社区提供的镜像。不要使用公共注册表(例如Docker Hub)中有未知来源的镜像。
  • 使用最新版本的基础镜像。通常,仅最新版本的容器镜像包含所有可用的安全修复程序。设置CI管道,以便在构建应用程序镜像时始终提取最新版本的基础镜像,同时在更新的基础镜像可用时重建应用程序。
  • 使用单独的构建镜像和运行时镜像。创建具有最小依赖的、单独的运行时镜像可减少入侵面,并产生较小的运行时镜像。构建镜像包含构建依赖关系,构建依赖关系对于构建应用程序是必需的,对于运行应用程序则不是必需的。
  • 尽可能遵守受限制的安全上下文约束(SCC)。修改你的容器镜像以允许在受限制的SCC下运行。应用程序容易受到入侵,强制使用受限制的SCC可提供*别的安全性,以防止在应用程序被破坏的情况下损害集群节点。
  • 使用TLS保护应用程序组件之间的通信。应用程序组件可能会传达应受到保护的敏感数据。除非你认为基础容器云网络是安全的,否则你可能希望利用TLS保护应用程序组件之间的通信。考虑利用Service Mesh从应用程序中卸载TLS管理。