2.2. odo 架构
本节论述了 odo
架构以及 odo
如何在集群中管理 OpenShift Container Platform 资源。
2.2.1. 开发者设置
使用 odo,您可以在 OpenShift Container Platform 集群中从终端创建和部署应用程序。代码编辑器插件使用 odo,让用户可以从其 IDE 终端与 OpenShift Container Platform 集群交互。使用 odo 的插件示例:VS Code OpenShift Connector、OpenShift Connector for Intellij、Codewind for Eclipse Che。
odo 可在 Windows、macOS 和 Linux 操作系统上以及从任意终端运行。odo 为 bash 和 zsh 命令行 shell 提供自动完成功能。
odo 1.1.0 支持 Node.js 和 Java 组件。
2.2.2. OpenShift source-to-image
OpenShift Source-to-Image (S2I) 是一个开源项目,可帮助从源代码构建工件并将其注入容器镜像。S2I 通过构建源代码来生成可随时运行的镜像,无需 Dockerfile。odo 使用 S2I 构建器镜像来执行容器内的开发者源代码。
2.2.3. OpenShift 集群对象
2.2.3.1. Init 容器
Init 容器是应用程序容器启动前运行的专用容器,为应用程序容器的运行配置必要的环境。Init 容器可以包含应用程序镜像没有的文件,例如设置脚本。Init 容器始终需要运行完毕,如果任何 init 容器失败,应用程序容器就不会启动。
由 odo 创建的 Pod 执行两个 Init 容器:
-
copy-supervisord
Init 容器。 -
copy-files-to-volume
Init 容器。
2.2.3.1.1. copy-supervisord
copy-supervisord
Init 容器会将必要的文件复制到 emptyDir
卷中。主应用程序容器从 emptyDir
卷中使用这些文件。
复制到 emptyDir
卷中的文件:
二进制文件:
-
go-init
是一个最小的 init 系统。它作为应用程序容器中的第一个进程 (PID 1) 运行。go-init 会启动运行开发者代码的SupervisorD
守护进程。处理孤立进程需要用到 go-init。 -
SupervisorD
是一个进程控制系统。它监控配置的进程并确保它们正在运行。如果需要,它也会重启服务。对于 odo,SupervisorD
会执行并监控开发者代码。
-
配置文件:
-
supervisor.conf
是 SupervisorD 守护进程启动时所必需的配置文件。
-
脚本:
-
在 OpenShift S2I 概念中,
assemble-and-restart
用于构建和部署用户源代码。assemble-and-restart 脚本首先在应用程序容器中编译用户源代码,然后重启 SupervisorD 来使用户更改生效。 -
在 OpenShift S2I 概念中,
Run
用于执行所编译的源代码。run
脚本执行assemble-and-restart
脚本创建的编译代码。 -
s2i-setup
是一个脚本,它可创建assemble-and-restart
和 run 脚本成功执行所需的文件和目录。每次应用程序容器启动时都会执行此脚本。
-
在 OpenShift S2I 概念中,
目录:
-
language-scripts
:OpenShift S2I 允许使用自定义assemble
和run
脚本。language-scripts
目录中有几个特定语言的自定义脚本。自定义脚本提供额外的配置,以使 odo debug 正常工作。
-
emtpyDir Volume
会同时挂载于 Init 容器和应用程序容器的 /opt/odo
挂载点。
2.2.3.1.2. copy-files-to-volume
copy-files-to-volume
Init 容器将位于 S2I 构建器镜像中的 /opt/app-root
的文件复制到持久性卷中。然后该卷会挂载于应用程序容器中的同一位置 (/opt/app-root
)。
如果 /opt/app-root
上没有 PersistentVolume
,则当 PersistentVolumeClaim
挂载于同一位置时,此目录中的数据会丢失。
PVC
挂载于 Init 容器中的 /mnt
挂载点。
2.2.3.2. 应用程序容器
应用程序容器是执行用户源代码的主要容器。
应用程序容器挂载了两个卷:
-
挂载于
/opt/odo
的emptyDir
卷 -
挂载于
/opt/app-root
的PersistentVolume
go-init
作为应用程序容器内的第一个进程执行。然后,go-init
进程启动 SupervisorD
守护进程。
SupervisorD
执行并监控用户编译的源代码。如果用户进程崩溃,SupervisorD
会重新启动它。
2.2.3.3. PersistentVolume
和 PersistentVolumeClaim
PersistentVolumeClaim
(PVC
) 是在 Kubernetes 中置备 PersistentVolume
的卷类型。PersistentVolume
的生命周期独立于 Pod 生命周期。PersistentVolume
上的数据会在 Pod 重启后保留。
copy-files-to-volume
Init 容器会将必要的文件复制到 PersistentVolume
上。主应用程序容器在运行时使用这些文件来执行。
PersistentVolume
的命名规则为 <component-name>-s2iData。
Container | PVC 挂载于 |
---|---|
|
|
应用程序容器 |
|
2.2.3.4. emptyDir
卷
当 Pod 分配给节点时,会创建一个 emptyDir
卷,只要该 Pod 在节点上运行,该卷即会一直存在。如果容器被重启或移动,则 emptyDir
的内容会被删除,Init 容器会将数据重新恢复为 emptyDir
。emptyDir
最初为空。
copy-supervisord
Init 容器会将必要的文件复制到 emptyDir
卷中。然后,主应用程序容器会在运行时使用这些文件来执行。
Container | emptyDir Volume 挂在于 |
---|---|
|
|
应用程序容器 |
|
2.2.3.5. Service
服务是一个 Kubernetes 概念,它抽象地代表了与一组 Pod 的通信方式。
odo 为每个应用程序 Pod 创建一个服务,使其可访问以进行通信。
2.2.4. odo push
工作流
本节论述了 odo push
工作流。odo push 会使用所有必要的 OpenShift Container Platform 资源在 OpenShift Container Platform 集群中部署用户代码。
创建资源
如果尚未创建,
odo push
会创建以下 OpenShift Container Platform 资源:部署配置 (DC):
-
执行两个 init 容器:
copy-supervisord
和copy-files-to-volume
。init 容器将文件复制到emptyDir
和PersistentVolume
类型的卷上。 -
应用程序容器启动。应用程序容器中的第一个进程是 PID=1 的
go-init
进程。 go-init
进程启动 SupervisorD 守护进程。注意用户应用程序代码尚未复制到应用程序容器中,因此
SupervisorD
守护进程没有执行run
脚本。
-
执行两个 init 容器:
- Service
- Secrets
-
PersistentVolumeClaim
文件索引
- 文件索引器会将源代码目录中的文件编成索引。索引器会以递归方式遍历源代码目录,并找到已创建、删除或重命名的文件。
-
文件索引器在
.odo
目录下的 odo index 文件中维护索引信息。 - 如果 odo index 文件不存在,这意味着文件索引程序是首次执行,并会创建新的 odo index JSON 文件。odo index JSON 文件包含文件映射 - 已遍历文件的相对文件路径以及已更改和已删除文件的绝对路径。
推送代码
本地代码被复制到应用程序容器中,通常位于
/tmp/src
下。执行
assemble-and-restart
源代码成功复制后,会在运行的应用程序容器中执行
assemble-and-restart
脚本。