你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

项目

项目是定义节点配置的资源集合。 项目包含 规范。 节点启动时,会通过处理和运行一系列规范来配置它。

Azure CycleCloud 使用项目来管理群集应用程序,例如批处理计划程序。 在 CycleCloud HPCPack 中,项目是一个 hn 规范和 cn 规格,用于定义 HPCPack 头节点和计算节点的配置和食谱。

下面是部分节点定义。 docker-registry 节点将运行三个规格:从 okta 项目版本 1.3.0 绑定规范,以及 docker 项目版本 2.0.0 中的核心和注册表规格:

[[node docker-registry]]
    Locker = base-storage
    [[[cluster-init okta:bind:1.3.0]]]
    [[[cluster-init docker:core:2.0.0]]]
    [[[cluster-init docker:registry:2.0.0]]]

尾随标记是项目版本号。

[[[cluster-init <project>:<spec>:<project version>]]]

保险箱是对存储帐户容器和凭据的引用。 节点具有默认的保险箱,因此此属性并非绝对必要。

Azure CycleCloud 对存储帐户使用速记,因此 https://mystorage.blob.core.windows.net/mycontainer 可以编写为 az://mystorage/mycontainer

节点将使用 pogo 工具从保险箱下载它引用的每个项目:

pogo get az://mystorage/mycontainer/projects/okta/1.3.0/bind

如果项目在节点上定义,但在预期的存储位置中不存在,则节点将向 CycleCloud 报告一个 Software Installation Failure

CycleCloud 具有默认在所有节点上运行的内部项目,用于执行特殊卷和网络处理,并设置与 CycleCloud 的通信。 这些内部项目自动镜像到保险箱。

用户负责将任何其他项目镜像到保险箱。 CycleCloud CLI 包含用于撰写项目的方法:

cyclecloud project init myproject

和镜像:

cyclecloud project init mylocker

项目到保险箱。

规范由 python、shell 或 powershell 脚本组成。

创建新项目

若要创建新项目,请使用 CLI 命令 cyclecloud project init myproject,其中 myproject 要创建的项目的名称。 这将创建一个名为“myproject”的项目,其中包含一个名为“default”的规范,你可以更改该项目。 目录树将使用要修改的框架文件创建,以包含你自己的信息。

目录结构

项目命令将创建以下目录:

      \myproject
          ├── project.ini
          ├── blobs
          ├── templates
          ├── specs
          │   ├── default
          │     └── cluster-init
          │        ├── scripts
          │        ├── files
          │        └── tests
          │     └── chef
          │         ├── site-cookbooks
          │         ├── data_bag
          │         └── roles

模板目录将保存群集模板,而规格将包含定义项目的规范。 spec 有两个子目录:cluster-init 和自定义 chef。 cluster-init 包含具有特殊含义的目录,例如脚本目录 (包含按词法顺序在节点) 上执行的 脚本文件 (原始数据文件将放在节点) 上, 并且测试 (包含在测试模式下启动群集时要运行的测试) 。

自定义 chef 子目录有三个 目录:) data_bags (数据包定义) 和 (chef 角色定义) 文件 的角色 (。

project.ini

project.ini 是包含项目的所有元数据的文件。 它可以包含:

参数 说明
name 项目名称。 单词必须用短划线分隔,例如 order-66-2018
label 项目名称。 用于显示群集) 空格的长名称 (。
type 三个选项:计划程序、应用程序、 <空白>。 确定项目的类型并生成相应的模板。 默认值:应用程序
版本 格式:x.x.x

储 物 柜

项目内容存储在 保险箱内。 可以通过命令 cyclecloud project upload (locker)将项目的内容上传到 CycleCloud 安装中定义的任何保险箱,其中 (保险箱) 是 CycleCloud 安装中的云存储保险箱的名称。 此保险箱将设置为默认目标。 或者,可以使用命令 cyclecloud locker list查看可用的保险箱。 可以查看 cyclecloud locker show (locker)有关特定保险箱的详细信息。

如果添加多个保险箱,则可以使用 cyclecloud project default_target (locker)默认设置,只需运行 cyclecloud project upload即可。 还可以设置可由项目与命令 cyclecloud project default locker (locker) -global共享的全局默认保险箱。

备注

默认保险箱将存储在 cyclecloud 配置文件中, (通常位于 ~/.cycle/config.ini) 中,而不是project.ini中。 这样做是为了允许控制project.ini。

上传项目内容会压缩 chef 目录,并将 chef 和群集 init 同步到目标保险箱。 这些内容将存储在以下位置:

  • (保险箱) /projects/ (项目) / (版本 /) / (spec_name) /cluster-init
  • (保险箱) /projects/ (项目) / () 版本 / (spec_name) /chef

Blob 下载

用于 project download 将project.ini中引用的所有 blob 下载到本地 blob 目录。 该命令使用 [locker] 参数,并将尝试将project.ini中列出的 blob 从保险箱下载到本地存储。 如果文件无法找到,将返回错误。

项目设置

规格

创建新项目时,将定义单个默认规范。 可以通过命令向项目 cyclecloud project add_spec 添加其他规格。

版本控制

默认情况下,所有项目都有 1.0.0 。 可以在开发和部署项目时设置自定义版本,方法是在project.ini文件中进行设置version=x.y.z

例如,如果“locker_url”为“az://my-account/my-container/projects”,则项目名为“Order66”,版本为“1.6.9”,规范为“default”,则 URL 为:

  • az://my-account/my-container/projects/Order66/1.6.9/default/cluster-init
  • az://my-account/my-container/projects/Order66/1.6.9/default/chef

Blob

有两种类型的 Blob: 项目 Blob用户 Blob

项目 Blob

项目 Blob 是由项目的作者提供的二进制文件,假设它们可以分发 (,即合法允许重新分发) 开放源代码项目的二进制文件。 项目 Blob 进入项目的“blob”目录,上传到保险箱时,它们将位于 /project/blob。

若要向项目添加 blob,请将文件 () 添加到 project.ini

[[blobs optionalname]]
  Files = projectblob1.tgz, projectblob2.tgz, projectblob3.tgz

多个 blob 可以用逗号分隔。 还可以指定项目的 blob 目录的相对路径。

用户 Blob

用户 Blob 是项目作者无法合法重新分发的二进制文件,例如 UGE 二进制文件。 这些文件未打包到项目,但必须手动暂存到保险箱。 这些文件将位于 /blobs/my-project/my-blob.tgz。 无需在project.ini中定义用户 Blob。

若要下载任何 Blob,请使用 jetpack download CLI 或 jetpack_download Chef 资源的命令。 CycleCloud 将首先查找用户 Blob。 如果该文件未找到,将使用项目级 Blob。

备注

可以使用同名的用户 Blob 替代项目 Blob。

在群集模板中指定项目

项目语法允许你在节点上指定多个规格。 若要定义项目,请使用以下内容:

[[[cluster-init myspec]]]
  Project = myproject # inferred from name
  Version = x.y.z
  Spec = default  # (alternatively, you can name your own spec to be used here)
  Locker = default  # (optional, will use default locker for node)

备注

在“spec”之后指定的名称可以是任何内容,但可以并应用作定义一些 > 常见属性的快捷方式。

还可以将多个规格应用于给定节点,如下所示:

[[node scheduler]]
  [[[cluster-init myspec]]]
  Project = myproject
  Version = x.y.z
  Spec = default  # (alternatively, you can name your own spec to be used here)
  Locker = default  # (optional, will use default locker for node)

[[[cluster-init otherspec]]]
Project = otherproject
Version = a.b.c
Spec = otherspec  # (optional)

通过用冒号分隔项目名称、规格名称和版本,CycleCloud 可以将这些值自动分析到相应的 Project/Version/Spec 设置中:

[[node scheduler]]
  AdditionalClusterInitSpecs = $ClusterInitSpecs
  [[[cluster-init myproject:myspec:x.y.z]]]
  [[[cluster-init otherproject:otherspec:a.b.c]]]

还可以在节点之间继承规范。 例如,可以在所有节点之间共享通用规范,然后在计划程序节点上运行自定义规范:

[[node defaults]]
[[[cluster-init my-project:common:1.0.0]]]
Order = 2 # optional
[[node scheduler]]
[[[cluster-init my-project:scheduler:1.0.0]]]
Order = 1 # optional

[[nodearray execute]]
[[[cluster-init my-project:execute:1.0.0]]]
   Order = 1 # optional

这将同时将commonscheduler规范应用于计划程序节点,同时仅将和execute规范应用于common执行节点数组。

默认情况下,规范将按模板中显示的顺序运行,首先运行继承的规范。 Order 是设置为默认值 1000 的可选整数,可用于定义规范的顺序。

如果定义中 [[[cluster-init]]] 只指定了一个名称,则假定它是规范名称。 例如:

[[[cluster-init myspec]]]
Project = myproject
Version = 1.0.0

是一个有效的规范设置,该 Spec=myspec 设置由名称隐含。

run_list

可以在project.ini中的项目或规范级别指定 Runlist:

[spec scheduler]
run_list = role[a], recipe[b]

当节点包含规范“计划程序”时,定义的run_list将自动追加到任何以前定义的 Runlist。 例如,如果我定义的 [configuration] run_list是 run_list = recipe[test],则最终的运行列表将是 run_list = recipe[cyclecloud], recipe[test], role[a], recipe[b], recipe[cluster_init]

还可以覆盖节点上规范级别的 Runlist。 这将替换project.ini中包含的任何run_list。 例如,如果将节点定义更改为以下内容:

[cluster-init test-project:scheduler:1.0.0]
run_list = recipe[different-test]

项目中定义的运行列表将被忽略,并且将改用上述列表。 然后,节点上的最后一个运行列表将是 run_list = recipe[cyclecloud], recipe[test], recipe[different-test], recipe[cluster_init]

备注

runlist 特定于 chef,否则不适用。

文件位置

压缩的 chef 文件将在节点启动的引导阶段下载。 它们下载到 $JETPACK_HOME/system/chef/tarballs 并解压缩到 $JETPACK_HOME/system/chef/chef-repo/,并在聚合节点时使用。

备注

若要运行自定义食谱,必须在节点的run_list中指定它们。

cluster-init 文件将下载到 /mnt/cluster-init/ (项目) / (规范) /。 对于“my-project”和“my-spec”,你将看到位于 /mnt/cluster-init/my-project/my-spec 中的脚本、文件和测试。

同步项目

CycleCloud 项目可以从镜像同步到群集本地云存储。 在模板中的节上 [cluster-init] 设置 SourceLocker 属性。 指定的保险箱的名称将用作项目的源,内容将在群集启动时同步到保险箱。 还可以使用保险箱的名称作为 cluster-init 名称的第一部分。 例如,如果源保险箱为“cyclecloud”,则以下两个定义相同:

[cluster-init my-project:my-spect:1.2.3]
  SourceLocker=cyclecloud

[cluster-init cyclecloud/my-proect:my-spec:1.2.3]

大型文件存储

项目支持大型文件。 在新创建的项目的顶层,你将看到大型文件的“blob”目录, (blob) 。 请注意,放置在此目录中的 Blob 具有特定用途,其作用方式与“文件”目录中的项不同。

“blobs”目录中的项是规范和版本无关的:“blob”中的任何内容都可以在规范或项目版本之间共享。 例如,不经常更改的程序的安装程序可以存储在“blob”中,并在 project.ini中引用。 循环访问项目版本时,单个文件保持不变,并且仅复制到云存储一次,从而节省传输和存储成本。

若要添加 blob,只需将文件放入“blobs”目录并编辑 project.ini 以引用该文件:

[blobs]
  Files=big_file1.tgz

使用 project upload 此命令时,project.ini中引用的所有 blob 都将传输到云存储中。

日志文件

运行 cluster-init 时生成的日志文件位于 $JETPACK_HOME/logs/cluster-init/ (项目) / (规范)

运行文件

成功运行 cluster-init 脚本时,文件将放置在 /mnt/cluster-init/.run/ (项目) / (规范) ,以确保该文件不会在后续聚合中再次运行。 如果要再次运行脚本,请删除此目录中的相应文件。

脚本目录

当 CycleCloud 在脚本目录中执行脚本时,它将环境变量添加到规范目录和项目目录的路径和名称:

CYCLECLOUD_PROJECT_NAME
CYCLECLOUD_PROJECT_PATH
CYCLECLOUD_SPEC_NAME
CYCLECLOUD_SPEC_PATH

在 linux 上,名为“test-project”且具有“default”规范的项目将具有以下路径:

CYCLECLOUD_PROJECT_NAME = test-project
CYCLECLOUD_PROJECT_PATH = /mnt/cluster-init/test-project
CYCLECLOUD_SPEC_NAME = default
CYCLECLOUD_SPEC_PATH = /mnt/cluster-init/test-project/default

仅运行脚本

仅运行 cluster-init 脚本:

jetpack converge --cluster-init

命令的输出将同时转到 STDOUT 和 jetpack.log。 每个脚本还将记录其输出:

      $JETPACK_HOME/logs/cluster-init/(project)/(spec)/scripts/(script.sh).out

自定义 chef 和 Composable Specs

每个规格都有一个 Chef 目录。 在聚合之前,每个规格将取消缩放并提取到本地厨师存储库中,并将任何现有的食谱、角色和数据袋替换为同名 (s) 。 这是按照规范定义的顺序完成的,因此在命名冲突的情况下,最后一个定义的规范将始终获胜。

jetpack 下载

若要在 cluster-init 脚本中下载 Blob,请使用命令 jetpack download (filename) 从 blobs 目录拉取它。 从 cluster-init 脚本运行此命令将确定项目和基 URL。 若要在非群集 init 上下文中使用它,需要指定项目 (查看 --help 了解详细信息) 。

对于 chef 用户, jetpack_download 已创建 LWRP:

jetpack_download "big-file1.tgz" do
  project "my-project"
  end

在 chef 中,默认下载位置为 #{node[:jetpack][:downloads]}。 若要更改文件目标,请使用以下内容:

jetpack_download "foo.tgz" do
  project "my-project"
  dest "/tmp/download.tgz"
end

在 chef 中使用时,必须指定项目。