在容器中部署 TripleO

https://blueprints.launchpad.net/tripleo/+spec/containerize-tripleo

能够在容器中部署 TripleO。

问题描述

Linux 容器正在改变行业部署应用程序的方式,它提供了一种轻量级、可移植且可升级的替代方案,以取代在物理主机或虚拟机上的部署。

由于 TripleO 已经使用 OpenStack 本身来管理 OpenStack 基础设施,因此容器可能是部署 OpenStack 服务的一种新方法。它将改变部署工作流程,但可以扩展升级能力、编排和安全管理。

将 OpenStack 服务容器化的好处包括

  • 可以通过交换容器来执行升级。

  • 由于整个软件堆栈都包含在容器中,因此依赖关系不会影响服务的部署。

  • 容器定义了明确的状态和数据要求。最终,如果我们转向 Kubernetes,所有卷都将位于主机之外,使主机无状态。

  • 如果升级失败,可以轻松回滚到可用的容器。

  • 在每个容器中交付的软件已经证明适用于此服务。

  • 在同一主机上混合和匹配服务的版本。

  • Immutable 容器在启动时提供一致的环境。

提议的变更

概述

此蓝图的意图是将容器引入作为交付 OpenStack 安装的一种方法。我们目前有一个完全可用的容器化计算节点版本,但我们希望将其扩展到所有服务。此外,它应该与最近添加的新可组合角色工作配合使用。

想法是在 Heat 模板中拥有一个接口,为每个要作为容器启动的服务添加信息。此容器格式应与 Kubernetes 定义密切相似,以便将来有可能过渡到 Kubernetes。这项工作已经在这里开始

为了保持可用性和实用性,已经做出了一些技术选择。这些包括

  • 使用 Kolla 容器。Kolla 容器使用最流行的操作系统选择构建,包括 CentOS、RHEL、Ubuntu 等,非常适合我们的用例。

  • 我们正在使用 Heat hook 通过 docker 直接启动这些容器。这最大限度地减少了节点上所需的软件,并直接映射到当前的裸机实现。此外,保持 Heat 接口可以使 GUI 正常运行,并允许 Heat 驱动容器的升级和更改。

  • 将容器部署的格式更改为与 Kubernetes 匹配,以便将来有可能使用该技术。

  • 在节点上使用 CentOS(而非 CentOS Atomic),以便用户拥有一个可用的系统来进行调试。

  • Puppet 驱动的配置,在启动时挂载到容器中。这使我们能够保留我们的 Puppet 配置系统,并与现有的裸机部署并行运行。

引导

一旦节点启动并运行,就会有一个 systemd 服务脚本运行,该脚本启动 docker agents 容器。此容器具有启动系统所需的所有组件。这包括

  • heat agents,包括 os-collect-config、os-apply-config 等。

  • puppet-agent 和用于部署配置的模块。

  • 连接到主机 docker 守护程序的 docker 客户端。

  • 用于配置主机网络的环境。

此容器充当自安装容器。启动后,此容器将使用 os-collect-config 连接回 Heat。然后 Heat agents 执行以下任务

  • 设置一个 etc 目录并运行 Puppet 配置脚本。这将生成服务所需的所有配置文件,就像在没有容器的情况下运行一样。这些被复制到主机上可访问的目录中,以及所有容器化服务。

  • 开始启动容器化服务以及 Heat 模板中定义的其他步骤。

目前,所有容器都使用 net=host 实现,以允许服务直接侦听主机网络。这在网络隔离和 IPv6 方面保持了功能。

安全影响

此更改不应产生重大的安全影响。从安全角度来看,此更改不应对部署产生不利影响,但可能会发现未知问题。Docker 中实现了 SELinux 支持。

最终⽤户影响

  • 容器化服务的调试会有所不同,因为它需要了解 docker(未来是 kubernetes)和其他工具才能访问容器中的信息。

  • 可能提供更多升级和新服务版本的选项。

  • 它将允许服务隔离和更好的依赖管理

性能影响

影响很小

  • 运行时性能应保持不变。

  • 我们注意到使用容器的引导时间略长,但可以通过一些简单的优化来解决。

部署者影响

从部署的角度来看,变化很小
  • 部署工作流程保持不变。

  • 由于我们不必担心软件堆栈的依赖问题,因此可能有更多服务的版本选项。

升级影响

这项工作旨在允许从裸机 overcloud 部署到基于容器的部署进行弹性、透明的升级。

最初我们需要过渡到容器
  • 需要节点重启。

  • 自动化升级应该是可行的,因为服务相同,只是容器化了。

  • 一些状态可能会移动到集中式存储。容器非常清楚地定义了所需的数据和状态存储要求。

升级可以更容易地进行
  • 由于减少了依赖关系,可以升级单个服务。

  • 更容易回滚到服务的先前版本。

  • 容器的数据和状态的显式存储清楚地表明需要保留什么。最终,状态信息和数据可能不会存在于单个节点上。

开发人员影响

开发人员的工作流程略有变化。与通过 systemd 和日志文件与服务交互不同,您将通过 docker 与服务交互。

在计算节点内部
  • sudo docker ps -a

  • sudo docker logs <container-name>

  • sudo docker exec -it <container-name> /bin/bash

实现

负责人

rhallisey imain flaper87 mandre

其他贡献者

dprince emilienm

工作项

  • Heat Docker hook,启动容器(完成)

  • 容器化计算(完成)

  • TripleO CI 作业(不完整 - https://review.openstack.org/#/c/288915/

  • 容器化控制器

  • 自动构建 OpenStack 服务的容器

  • 容器化 Undercloud

依赖项

  • 可组合角色。

  • Heat 模板接口,允许扩展以支持容器化服务定义。

测试

TripleO CI 需要一个新的 Jenkins 作业,该作业将使用所选解决方案在容器中部署 overcloud。

文档影响

https://github.com/openstack/tripleo-heat-templates/blob/master/docker/README-containers.md

  • 在容器中部署 TripleO

  • 调试 TripleO 容器

参考资料