源到镜像 (S2I) 是一种用于从源代码构建可重现容器镜像的工具包和工作流程。S2I 通过将源代码插入容器镜像并让容器准备源代码来生成可立即运行的镜像。通过创建自组装构建器镜像,您可以像使用容器镜像对运行时环境进行版本控制一样,精确地对构建环境进行版本控制。
对于像 Ruby 这样的动态语言,构建时间和运行时环境通常相同。假设 Ruby、Bundler、Rake、Apache、GCC 和设置和运行 Ruby 应用程序所需的所有其他软件包都已安装,则构建器镜像将执行以下步骤:
构建器镜像启动一个容器,并将应用程序源注入到已知目录中。
容器进程将该源代码转换为适当的可运行设置。例如,它使用 Bundler 安装依赖项,并将源代码移动到 Apache 已预先配置为查找 Ruby 配置文件的目录中。
然后,它提交新的容器,并将镜像入口点设置为启动 Apache 来托管 Ruby 应用程序的脚本。
对于像 C、C++、Go 或 Java 这样的编译语言,编译所需的依赖项可能超过运行时构件的大小。为了保持运行时镜像较小,S2I 启用了一个多步骤构建过程,其中可执行文件之类的二进制构件在第一个构建器镜像中创建、提取并注入到第二个运行时镜像中,该镜像只需将可执行程序放置在正确的位置。
例如,要为 Tomcat 和 Maven 创建一个可重现的构建管道:
创建一个包含 OpenJDK 和 Tomcat 的构建器镜像,该镜像需要注入 WAR 文件。
创建一个第二个镜像,该镜像在第一个镜像之上添加 Maven 和任何其他标准依赖项,并需要注入 Maven 项目。
使用 Java 应用程序源代码和 Maven 镜像启动 S2I 以创建所需的应用程序 WAR。
再次启动 S2I,使用前面步骤中的 WAR 文件和初始 Tomcat 镜像来创建运行时镜像。
通过将构建逻辑放入镜像中并将镜像组合到多个步骤中,运行时环境接近构建环境,无需将构建工具部署到生产环境。
允许通过将构建环境封装在容器镜像中并为调用者定义简单的注入源代码接口来对构建环境进行严格版本控制。可重复构建是启用容器化基础设施中的安全更新和持续集成的关键要求,构建器镜像有助于确保可重复性和交换运行时环境的能力。
任何可以在 Linux 上运行的现有构建系统都可以在容器内运行,并且每个单独的构建器也可以是更大管道的组成部分。可以将处理应用程序源代码的脚本注入构建器镜像中,允许作者调整现有镜像以启用源处理。
S2I 鼓励作者在一个镜像层中表示应用程序,而不是在一个 Dockerfile 中构建多个层。这节省了创建和部署时间,并允许更好地控制最终镜像的输出。
Dockerfile 的运行缺少许多容器的正常操作控制。它们通常以 root 身份运行,并可以访问容器网络。S2I 可以控制构建器镜像可用的权限和特权,因为构建是在单个容器中启动的。与 OpenShift 等平台结合使用,S2I 允许管理员控制开发人员在构建时的权限。
OpenShift 路由以主机名公开服务,以便外部客户端可以通过名称访问它。当在 OpenShift 上创建 `Route` 对象时,它会被内置的 HAProxy 负载均衡器获取,以公开请求的服务并使其通过给定的配置在外部可用。
与 Kubernetes `Ingress` 对象类似,Red Hat 创建了路由的概念来满足需求,然后将它背后的设计原则贡献给社区,这极大地影响了 `Ingress` 的设计。路由确实有一些额外的功能,如下表所示:
功能 | OpenShift 上的 Ingress | OpenShift 上的路由 |
---|---|---|
标准 Kubernetes 对象 |
X |
|
外部访问服务 |
X |
X |
持久性(粘性)会话 |
X |
X |
负载均衡策略(例如轮询) |
X |
X |
速率限制和节流 |
X |
X |
IP 白名单 |
X |
X |
TLS 边缘终止,以增强安全性 |
X |
X |
TLS 重加密,以增强安全性 |
X |
|
TLS 直通,以增强安全性 |
X |
|
多个加权后端(流量分发) |
X |
|
基于模式生成的主机名 |
X |
|
通配符域名 |
X |
主机名的DNS解析与路由处理分开。您的管理员可能已配置了一个始终正确解析到路由器的云域名,或者独立修改您无关的主机名DNS记录以解析到路由器。 |
单个路由可以通过在其注释中提供特定配置来覆盖某些默认设置。
镜像流存储标签与镜像的映射、应用于流中镜像标记时的元数据覆盖,以及对注册表上Docker镜像仓库的可选引用。