简单容器生成¶
简单容器生成是一项倡议,旨在通过减少 TripleO 容器构建、部署和分发过程的复杂性,以及减少 TripleO 容器构建工具的规模和范围来降低复杂性。
该倡议的主要目标是取代 Kolla 以及我们相关的 Kolla 定制工具,作为选定的容器生成工具包。TripleO 社区长期以来一直希望为部署者和集成商提供一个更简单的解决方案,而这项倡议正在将这一愿望变为现实。
简单容器生成倡议希望从一个深陷于 Kolla-Ansible 的基础组件和通用容器构建系统之间的工具链,转型为一个垂直集成的解决方案,该解决方案仅构建 TripleO 所需的内容,以一种尽可能不具侵入性且易于理解的方式。
问题描述¶
目前,TripleO 利用 Kolla 生成容器镜像。这些镜像为 Kolla-Ansible 构建,使用了一种具有通用功能的约定俗成的构建过程。虽然我们当前的镜像可以工作,但它们体积庞大,不太适合 TripleO 的使用场景,尤其是在分布式数据中心中。容器复杂性和大小的问题影响了三个主要群体:部署者、第三方集成商和维护者。由于该项目旨在简化跨堆栈的交互,容器生命周期和构建过程已被确定为需要演进的内容。TripleO 项目需要一种垂直集成的解决方案,该解决方案可以生成更小的镜像,更易于维护,并且需要更少的操作来定制镜像以满足我们的需求。
提议的变更¶
概述¶
实现一个容器文件生成角色,以及一组静态定义的覆盖变量文件,这些文件用于生成我们所需的容器文件。 [2]
分层¶
tripleo-base+---+
|
|
+---+-openstack-${SERVICE}-1-common-+-->openstack-${SERVICE}-1-a
| |
| +-->openstack-${SERVICE}-1-b
| |
| +-->openstack-${SERVICE}-1-c
+-->openstack-${SERVICE}-2
|
+-->ancillary-${SERVICE}-1
|
+-->ancillary-${SERVICE}-2
用户体验¶
将通过使用 TripleO python 客户端的简单命令行界面来构建标准镜像集。
$ openstack tripleo container image build [opts] <args>
这个简单的子命令将为用户提供构建镜像、生成容器文件和调试运行时问题的能力。
CLI 选项¶
新的容器镜像构建入口点的 python TripleO 客户端选项。
选项 |
默认值 |
描述 |
|---|---|---|
config-file |
$PATH/overcloud_containers.yaml |
设置要构建的容器列表的配置文件。 |
exclude |
[] |
容器类型排除。可以多次指定。 |
work-dir |
/tmp/container-builds |
容器构建目录,存储每个镜像及其依赖项的容器文件和日志。 |
skip-push |
False |
跳过将镜像推送到注册表 |
skip-build |
False |
仅生成容器文件,不生成本地构建。 |
base |
centos |
基础镜像名称。 |
type |
binary |
镜像类型。 |
tag |
latest |
镜像标签。 |
registry |
localhost |
容器注册表 URL。 |
namespace |
tripleomaster |
容器注册表命名空间。 |
volume |
[] |
构建镜像时使用的容器绑定挂载。如果需要多个卷,应多次指定。 |
容器镜像构建工具¶
容器镜像将使用 Buildah 构建,所需的 Buildah 功能将通过 python-tripleoclient 集成利用 BuildahBuilder,并通过 CLI 选项公开。
镜像布局¶
每个镜像将拥有自己的 YAML 文件,该文件可以访问以下参数。每个 YAML 文件都将有一个必需参数 (tcib_from 用于从哪个源镜像构建) 和可选参数。
选项 |
默认值 |
类型 |
必需 |
描述 |
|---|---|---|---|---|
tcib_path |
{{ lookup(‘env’, ‘HOME’) }} |
字符串 |
生成给定镜像的容器文件(s)的路径。 |
|
tcib_args |
Dict[str, str] |
单层 key:value 对。实现 arg。 |
||
tcib_from |
centos:8 |
Str |
True |
要部署的容器镜像。实现 from。 |
tcib_labels |
Dict[str, str] |
单层 key:value 对。实现 label。 |
||
tcib_envs |
Dict[str, str] |
单层 key:value 对。实现 env。 |
||
tcib_onbuilds |
List[str] |
<item>=String。实现 onbuild。 |
||
tcib_volumes |
List[str] |
<item>=String。实现 volume。 |
||
tcib_workdir |
Str |
实现 workdir。 |
||
tcib_adds |
List[str] |
<item>=String。实现 add。 |
||
tcib_copies |
List[str] |
<item>=String。实现 copy。 |
||
tcib_exposes |
List[str] |
<item>=String。实现 expose。 |
||
tcib_user |
Str |
实现 user。 |
||
tcib_shell |
Str |
实现 shell。 |
||
tcib_runs |
List[str] |
<item>=String。实现 run。 |
||
tcib_healthcheck |
Str |
实现 healthcheck。 |
||
tcib_stopsignal |
Str |
实现 stopsignal。 |
||
tcib_entrypoint |
Str |
实现 entrypoint。 |
||
tcib_cmd |
Str |
实现 cmd。 |
||
tcib_actions |
List[Dict[str, str]] |
每个项目都是一个单层字典 key:value 对。允许任意动词,并保持顺序。 |
||
tcib_gather_files |
List[str] |
每个项目都是一个字符串。从主机收集文件并将它们存储在构建目录中。 |
应用程序包在每个容器配置文件中排序。这提供了一个程序化接口来派生软件包集,允许覆盖,并且易于可视化。虽然软件包选项不由 tripleo_container_image_build 角色处理,但它将在我们的模板中作为标准。
选项
描述
tcib_packages
要安装的软件包字典。
common: - openstack-${SERVICE}-common distro-1: common: - openstack-${SERVICE}-proprietary x86_64: - $dep-x86_64 power: - $dep-power distro-2: common: - openstack-${SERVICE} - $dep然后捕获此选项并由一个简单的 RUN 操作处理。
tcib_actions: - run: "dnf install -y {{ tcib_packages['common'] }} {{ tcib_packages[ansible_distribution][ansible_architecture] }}"
示例容器变量文件¶
tcib_from: ubi8
tcib_path: "{{ lookup('env', 'HOME') }}/example-image"
tcib_labels:
maintainer: MaintainerX
tcib_entrypoint: dumb-init --single-child --
tcib_stopsignal: SIGTERM
tcib_envs:
LANG: en_US.UTF-8
tcib_runs:
- mkdir -p /etc/ssh && touch /etc/ssh/ssh_known_host
tcib_copies:
- /etc/hosts /opt/hosts
tcib_gather_files:
- /etc
tcib_packages:
common:
- curl
centos:
x86_64:
- wget
tcib_actions:
- run: "dnf install -y {{ tcib_packages['common'] }} {{ tcib_packages[ansible_distribution][ansible_architecture] }}"
- copy: /etc/resolv.conf /resolv.conf
- run: ["/bin/bash", "-c", "echo hello world"]
容器文件结构¶
生成的容器文件将遵循一个简单的目录结构,该结构提供了一种轻松查看和理解整个堆栈的构建关系和依赖项的方式。
tripleo-base/${CONTAINERFILE}
tripleo-base/ancillary-${SERVICE}-1/${CONTAINERFILE}
tripleo-base/ancillary-${SERVICE}-2/${CONTAINERFILE}
tripleo-base/openstack-${SERVICE}-1-common/${CONTAINERFILE}
tripleo-base/openstack-${SERVICE}-1-common/openstack-${SERVICE}-1-a/${CONTAINERFILE}
tripleo-base/openstack-${SERVICE}-1-common/openstack-${SERVICE}-1-b/${CONTAINERFILE}
tripleo-base/openstack-${SERVICE}-1-common/openstack-${SERVICE}-1-c/${CONTAINERFILE}
tripleo-base/openstack-${SERVICE}-2/${CONTAINERFILE}
替代方案¶
使用 Ansible Bender
评估了 Ansible Bender 作为可以帮助构建容器镜像的工具。但是,它尚未在下游产品化;这将使其难以使用。它不生成 Dockerfile,并且强烈依赖于 Bender 工具;因此,在没有 Bender 的独立环境中更难进行容器镜像构建过程。 [1]
不改变容器镜像构建过程。
我们可以不改变容器镜像生成过程。这使我们成为 Kolla 的消费者,并要求我们维护复杂的辅助工具以确保 Kolla 容器适用于 TripleO。
安全影响¶
虽然安全性不是简单容器生成倡议的主要优点,但通过迁移到简化的容器可以提高安全性。如果简单容器生成倡议获得批准,TripleO 中使用的所有容器都将垂直集成到堆栈中,从而可以轻松审计构建工具以及安装到我们容器化运行时中的所有应用程序、服务和文件。通过简化,我们将提高易于理解和透明度,从而使我们的项目更具可持续性,从而更安全。提议的解决方案必须提供我们知道确切运行了哪个命令的层,以便我们可以快速弄清楚如何构建镜像。
升级影响¶
由于新的容器镜像将提供与以前镜像相同的特性,因此不会产生升级影响;它们将具有相同的或类似的注入脚本,这些脚本在容器启动时使用。
其他最终用户影响¶
无
性能影响¶
我们应该期望我们的容器获得更好的性能,因为它们会更小。虽然运行时行为相同,但由于每个容器的大小更小且分层构建更好,因此软件交付速度会更快。较小的容器将减少准备平均时间,这将对性能产生积极影响,并通常改善用户体验。
其他部署者影响¶
简化的容器生成倡议将极大地帮助第三方集成商。通过简化的容器构建工具,我们将能够轻松地向希望在 TripleO 之上构建的人们表达需求。我们的工具链能够按需引导应用程序,并且足够简单,可以与各种以定制格式构建的自定义应用程序集成。
开发人员影响¶
在第一阶段,不会对开发人员产生任何影响,因为生成的镜像将提供与以前相同的基本层。例如,它们将包含所有 Kolla 脚本,这些脚本在启动时需要合并配置文件或初始化容器。
这些脚本将注入到容器镜像中以实现向后兼容性
kolla_extend_start
set_configs.py
start.sh
copy_cacerts.sh
httpd_setup.sh
在第二阶段,我们将简化这些脚本以删除 TripleO 不需要的内容。可组合服务中的接口可能会随着时间的推移而演变。例如,kolla_config 将变为 container_config。目前没有计划重写配置文件合并逻辑。
实现¶
负责人¶
- 主要负责人
Cloudnull
EmilienM
工作项¶
第一阶段¶
生成容器文件(s)的 Ansible 角色 - https://review.opendev.org/#/c/722557
弃用“openstack overcloud container image build”
实现“openstack tripleo container image build”,它将重用 BuildahBuilder 和与弃用命令相同的逻辑,但没有 Kolla。
构建新镜像并发布它们。
切换上游 CI 以使用新镜像。
第二阶段
简化注入的脚本,仅执行 TripleO 所需的内容。
重命名 TripleO Heat 模板中的配置接口。
依赖项¶
该工具将在现有存储库中,因此没有新的依赖项。它主要位于 tripleo-ansible、tripleo-common、python-tripleoclient 和 tripleo-heat-templates 中。与以前一样,需要 Buildah 才能构建镜像。
测试¶
tripleo-build-containers-centos-8 作业将切换为使用新的“openstack tripleo container image build”命令。
一个 molecule 作业将使用新的角色来练习容器镜像构建过程。
还将调查一些端到端作业,以构建并将容器部署到正在运行的部署中。
文档影响¶
大部分文档影响将集中在清理现有文档,这些文档引用了 Kolla,以及创建突出显示垂直集成堆栈使用的文档。
由于更改对于仅拉取镜像而不重新构建的最终用户应该是透明的,因此手册将更新为包含新命令和选项,以防有人想自行构建镜像。