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.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 脚本成功执行所需的文件和目录。每次应用程序容器启动时都会执行此脚本。
  • 目录:

    • language-scripts:OpenShift S2I 允许使用自定义 assemblerun 脚本。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/odoemptyDir
  • 挂载于 /opt/app-rootPersistentVolume

go-init 作为应用程序容器内的第一个进程执行。然后,go-init 进程启动 SupervisorD 守护进程。

SupervisorD 执行并监控用户编译的源代码。如果用户进程崩溃,SupervisorD 会重新启动它。

2.2.3.3. PersistentVolumePersistentVolumeClaim

PersistentVolumeClaim (PVC) 是在 Kubernetes 中置备 PersistentVolume 的卷类型。PersistentVolume 的生命周期独立于 Pod 生命周期。PersistentVolume 上的数据会在 Pod 重启后保留。

copy-files-to-volume Init 容器会将必要的文件复制到 PersistentVolume 上。主应用程序容器在运行时使用这些文件来执行。

PersistentVolume 的命名规则为 <component-name>-s2iData。

ContainerPVC 挂载于

copy-files-to-volume

/mnt

应用程序容器

/opt/app-root

2.2.3.4. emptyDir

当 Pod 分配给节点时,会创建一个 emptyDir 卷,只要该 Pod 在节点上运行,该卷即会一直存在。如果容器被重启或移动,则 emptyDir 的内容会被删除,Init 容器会将数据重新恢复为 emptyDiremptyDir 最初为空。

copy-supervisord Init 容器会将必要的文件复制到 emptyDir 卷中。然后,主应用程序容器会在运行时使用这些文件来执行。

ContaineremptyDir Volume 挂在于

copy-supervisord

/opt/odo

应用程序容器

/opt/odo

2.2.3.5. Service

服务是一个 Kubernetes 概念,它抽象地代表了与一组 Pod 的通信方式。

odo 为每个应用程序 Pod 创建一个服务,使其可访问以进行通信。

2.2.4. odo push 工作流

本节论述了 odo push 工作流。odo push 会使用所有必要的 OpenShift Container Platform 资源在 OpenShift Container Platform 集群中部署用户代码。

  1. 创建资源

    如果尚未创建,odo push 会创建以下 OpenShift Container Platform 资源:

    • 部署配置 (DC):

      • 执行两个 init 容器:copy-supervisordcopy-files-to-volume。init 容器将文件复制到 emptyDirPersistentVolume 类型的卷上。
      • 应用程序容器启动。应用程序容器中的第一个进程是 PID=1 的 go-init 进程。
      • go-init 进程启动 SupervisorD 守护进程。

        注意

        用户应用程序代码尚未复制到应用程序容器中,因此 SupervisorD 守护进程没有执行 run 脚本。

    • Service
    • Secrets
    • PersistentVolumeClaim
  2. 文件索引

    • 文件索引器会将源代码目录中的文件编成索引。索引器会以递归方式遍历源代码目录,并找到已创建、删除或重命名的文件。
    • 文件索引器在 .odo 目录下的 odo index 文件中维护索引信息。
    • 如果 odo index 文件不存在,这意味着文件索引程序是首次执行,并会创建新的 odo index JSON 文件。odo index JSON 文件包含文件映射 - 已遍历文件的相对文件路径以及已更改和已删除文件的绝对路径。
  3. 推送代码

    本地代码被复制到应用程序容器中,通常位于 /tmp/src 下。

  4. 执行 assemble-and-restart

    源代码成功复制后,会在运行的应用程序容器中执行 assemble-and-restart 脚本。