ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

用ParallelClusterMaker统一管理多套AWS ParallelCluster集群

用ParallelClusterMaker统一管理多套AWS ParallelCluster集群 在实际的高性能计算HPC场景中创建 AWS ParallelCluster 集群只是起点真正的日常工作是轮询状态、修改配置、更新节点、清理堆栈。原生pclusterCLI 能完成这些操作但当一个团队要同时维护开发、测试、生产三套集群每个集群又有自己的 VPC、子网、存储和调度器配置时散落在命令和 YAML 文件里的细节会迅速超出人工可靠记忆的范围。ParallelClusterMaker 就是为解决这类问题而出现的 CLI toolkit它在官方 pcluster 命令之上做了一层封装用统一命令管理多个 ParallelCluster stack把配置模板、变量替换、状态汇总和生命周期操作收敛到一套可复现的工作流里。这篇文章会先解释 ParallelCluster 与 CloudFormation stack 之间的关系再说明为什么原生 CLI 在多集群场景下不够用然后用手写示例的方式搭建一个最小可用的管理工具参数模型覆盖环境准备、核心命令、配置文件、运行验证、常见问题排查和最佳实践。读完以后你可以理解这类工具应该怎么设计也能直接把它套用到自己的集群管理脚本或工具链中。1. 先理解 ParallelCluster stack 到底是什么1.1 ParallelCluster 是创建集群的上层封装底层是 CloudFormationAWS ParallelCluster 是 AWS 提供的一款 HPC 集群部署和管理工具。用户只需要写一个 YAML 配置文件声明头节点HeadNode、计算节点Scheduling、共享存储SharedStorage、网络和 IAM 角色然后执行一条创建命令ParallelCluster 服务就会在后台生成一套 CloudFormation 模板并完成资源编排。每条创建命令最终都会对应一个 CloudFormation stack。通过下面的命令可以看到集群和 stack 的对应关系pcluster describe-cluster \ --cluster-name my-hpc \ --region cn-north-1返回结果中会出现类似下面的字段{ cluster: { clusterName: my-hpc, cloudFormationStackArn: arn:aws-cn:cloudformation:cn-north-1:123456789012:stack/my-hpc/abcd1234-xxxx-xxxx-xxxx-xxxxxxxxxxxx, clusterStatus: CREATE_COMPLETE } }这里的cloudFormationStackArn就是该集群对应的 CloudFormation stack 资源标识。基于这个基础我们说的“管理 ParallelCluster stack”本质上是在管理CloudFormation stack 的状态和生命周期集群配置文件的版本和变更头节点、计算节点、安全组、子网、IAM 角色等派生资源与集群相关的日志、存储和网络资源。1.2 原生 pcluster CLI 在多集群场景下的重复劳动原生pclusterCLI 功能很完整命令覆盖了集群的创建、列举、描述、更新、删除和节点操作。常见的操作命令有# 创建集群 pcluster create-cluster --cluster-name my-hpc --configuration config.yaml --region region # 查看集群 pcluster list-clusters --region region pcluster describe-cluster --cluster-name my-hpc --region region # 更新集群 pcluster update-cluster --cluster-name my-hpc --configuration config.yaml --region region # 删除集群 pcluster delete-cluster --cluster-name my-hpc --region region # 连接头节点 pcluster ssh --cluster-name my-hpc --region region问题出现在集群数量变多、配置变更变频繁之后。每次创建或更新都需要写上完整的--cluster-name、--configuration、--region组合并且还要先记住配置是否存在语法问题、参数是否需要替换、当前集群处于什么状态。命令本身也缺少统一的状态汇总和退出码语义写脚本时往往要靠parse output才能判断成功或失败。这时需要的是一个更高层的工具层而不是再写一堆互相独立的零散脚本。ParallelClusterMaker 这类 CLI toolkit 的价值就在这里它把官方 CLI 封装成更符合“集群生命周期”语义的命令同时承载配置模板和变量替换等工程能力。1.3 ParallelClusterMaker 的定位封装、编排、校验而不是替代要理解这类工具先要避免一个误区它不是用另一种方式重新实现 ParallelCluster而是调用官方pclusterCLI 或 ParallelCluster API 完成实际操作自己负责配置校验、命令编排和输出格式化。典型的设计思路是用户提供集群配置模板和全局配置工具读取模板完成变量替换生成最终config.yaml工具调用官方 CLI 执行create-cluster、update-cluster或delete-cluster工具轮询集群状态输出结构化结果出错时保留现场日志和退出码便于排障。整条链路可以用下面这张流程描述用户输入命令 | v 读取配置模板 变量替换 | v 本地校验YAML 解析、必填字段检查 | v 调用 pcluster CLI / API | v 轮询集群状态 | v 输出结果 / 抛错并打印日志2. 准备环境Python、AWS 认证和 Project 基础结构2.1 前置条件清单在使用 ParallelClusterMaker 或同类工具前先确认环境和权限满足要求。下面是一份常见的最小前置条件清单项目要求说明Python3.9 及以上工具通常基于 Python 开发依赖 PyYAML、boto3 等包AWS CLI2.x用于认证配置和辅助排查aws-parallelcluster与目标区域版本兼容的版本官方 CLI工具底层会调用它AWS 认证Access Key Secret Key 或 IAM Role权限需要 CloudFormation、EC2、IAM、S3 等工作区一个用于存放配置和日志的目录建议按环境分目录安装官方 CLIpython3 -m venv .venv source .venv/bin/activate pip install aws-parallelcluster pcluster version安装 ParallelClusterMaker 可以是直接通过 pip 安装也可以是克隆仓库后以模块方式运行。无论哪种方式都要先确认依赖版本和 Python 版本匹配。2.2 初始化工具工作区大多数同类 CLI 都会提供一个初始化命令用来生成标准目录结构。下面是一个常见布局~/.parallelcluster-maker/ ├── config.yaml ├── clusters/ │ ├── research-dev.yaml │ └── research-prod.yaml └── templates/ └── base.yaml.j2也可以把工作区放在项目仓库里便于团队共享infra/ ├── pcm/ │ ├── config.yaml │ ├── clusters/ │ │ ├── dev.yaml │ │ ├── staging.yaml │ │ └── prod.yaml │ └── templates/ │ └── cluster.yaml.j2初始化命令通常类似pcm init --work-dir ~/.parallelcluster-maker执行后工具会生成config.yaml模板和示例集群配置便于使用者在这个基础上修改。2.3 环境检查先确认认证和区域可用在创建集群前先用一条命令验证 AWS 身份配置是否正确aws sts get-caller-identity能正常返回Account、UserId和Arn说明认证可用。然后确认 ParallelCluster 官方 CLI 可用pcluster list-clusters --region cn-north-1如果认证没问题这条命令至少会返回一个 JSON 数组即使没有集群也只会是空数组。常见错误是返回AccessDenied说明当前身份缺少parallelcluster:ListClusters权限需要检查 IAM 策略。注意不要只验证工具能启动还要验证程序能否真实调用 AWS API。建议先跑一次只读命令如 list 或 describe再执行创建操作。3. 核心命令设计用一套 CLI 覆盖集群生命周期3.1 命令总览与设计思路ParallelClusterMaker 的设计目标是让一个普通的 HPC 用户不需要记住pcluster的长参数列表只需要面对简短的子命令。下面是一个常见的命令集合命令作用底层操作pcm list列出所有集群pcluster list-clusterspcm status name查看单个集群状态pcluster describe-clusterpcm create name创建集群pcluster create-clusterpcm update name更新集群配置pcluster update-clusterpcm delete name删除集群pcluster delete-clusterpcm validate name本地校验配置YAML 解析 参数检查pcm ssh name登录头节点pcluster sshpcm logs name收集集群日志pcluster get-cluster-log-events等命令设计的原则是“按生命周期组织”。用户想做什么就执行对应的动词不需要关心背后的 API 名称和参数组合。3.2 create先校验再创建最后等待结果创建集群是最重要的操作流程不能只是简单透传。一个可靠的实现应该包含以下步骤根据集群名找到对应的clusters/name.yaml配置文件读取全局config.yaml做变量替换解析 YAML检查必填字段执行pcluster create-cluster轮询describe-cluster直到状态变为CREATE_COMPLETE或CREATE_FAILED根据结果返回退出码。命令示例pcm create research-dev \ --region cn-north-1 \ --wait \ --timeout-min 30--wait参数决定是否阻塞等待创建完成。不加时只提交创建请求并返回加时则持续轮询。--timeout-min用于控制最长的等待时间避免脚本卡死。输出可能类似cluster name research-dev region cn-north-1 status CREATE_COMPLETE head node ec2-1-2-3-4.cn-north-1.compute.amazonaws.com.cn duration 12m 34s3.3 status统一状态展示不依赖人工解析 JSON原生pcluster describe-cluster输出的是完整 JSON包含大量字段。对日常巡检来说更友好的是简洁表格。工具内部可以只挑关键字段展示pcm status research-dev --region cn-north-1输出Name Status HeadNode IP Compute UpdatedAt research-dev CREATE_COMPLETE 1.2.3.4 Stopped 2024-12-01T10:00:00Z实现时通过 boto3 或官方 CLI 的 JSON 输出读取clusterStatus、headNode、computeFleetStatus等字段然后格式化为表格。这样在巡检多个集群时一眼就能看出哪个集群状态异常。3.4 update更新配置前先做变更保护更新集群比创建更危险因为更新可能影响正在运行的任务。工具应当设计明显的安全门槛更新前自动备份当前配置只允许指定字段变更避免误改关键网络参数执行前先做一次validate更新过程中显示变更进度失败时提供回滚提示。命令示例pcm update research-dev \ --configuration clusters/research-dev.yaml \ --region cn-north-1 \ --backup \ --wait需要提醒的是ParallelCluster 对不同字段的更新支持程度不同。有的参数支持在线更新有的需要停机重建节点。工具层最好能在更新前对比旧配置和新配置给出变更摘要diff summary: Scheduling.SlurmQueues[0].ComputeResources[0].MinCount4 - Scheduling.SlurmQueues[0].ComputeResources[0].MinCount2这类输出能显著降低误操作风险。3.5 delete清理要彻底日志要保留删除集群的命令需要谨慎处理。直接调用pcluster delete-cluster虽然能删除集群对应 stack但如果没有提前备份日志排障信息会丢失。工具可以设计成两步先收集集群日志保存到本地logs/name目录再执行删除命令并清理本地配置文件中的无效记录。命令示例pcm delete research-dev \ --region cn-north-1 \ --dump-logs \ --confirm--confirm是为了避免误删它要求用户在交互式输入中确认集群名或输入yes。在自动化脚本中可以通过环境变量跳过交互但必须在代码里显式设置PCM_CONFIRMyes pcm delete research-dev注意删除集群是不可逆操作。生产环境建议在删除前自动把配置文件和日志打成 tar 归档至少保留 30 天。4. 配置文件与变量替换机制4.1 全局 config.yaml 设计全局配置用来存放跨集群共享的参数例如默认区域、默认 KeyName、默认子网、默认 S3 bucket。这样每个集群配置文件不需要重复填写这些内容。region: cn-north-1 key_name: hpc-key vpc_id: vpc-0123456789abcdef0 subnet_id: subnet-0123456789abcdef0 s3_bucket: my-hpc-config-bucket default_ami: ami-0123456789abcdef0 tags: Owner: hpc-team Environment: dev4.2 集群配置模板示例在 ParallelCluster 中一个最小配置通常包含HeadNode、Scheduling和SharedStorage。工具可以在此基础上扩展变量占位符Region: {{ region }} Image: Os: {{ os }} HeadNode: InstanceType: {{ head_node_instance_type }} Networking: SubnetId: {{ subnet_id }} Ssh: KeyName: {{ key_name }} Scheduling: Scheduler: {{ scheduler }} SlurmQueues: - Name: {{ queue_name }} ComputeResources: - Name: compute InstanceType: {{ compute_instance_type }} MinCount: {{ min_count }} MaxCount: {{ max_count }} Networking: SubnetIds: - {{ subnet_id }} SharedStorage: - Name: shared MountDir: /shared StorageType: Ebs4.3 变量替换和敏感信息管理变量替换是工具的核心能力。它让同一套模板可以被不同环境重复使用。典型的替换方式有两种基于模板引擎变量替换基于环境变量注入。例如在clusters/research-dev.yaml中只写差异项cluster_name: research-dev os: alinux2 head_node_instance_type: c5.xlarge compute_instance_type: c5n.2xlarge min_count: 2 max_count: 10 queue_name: queue-dev工具在生成最终配置文件时会合并全局配置和这个集群配置再渲染模板。最终生成的config.yaml才传给pcluster。敏感信息如子网 ID、AMI ID 这类基础设施标识可以放在 git 仓库但 IAM 密钥、密码等一律不能写入集群配置。工具应该提供环境变量注入能力export PCM_VPC_IDvpc-xxxxxxxx pcm create research-dev模板里使用{{ vpc_id }}工具替换时优先读取环境变量找不到再读取配置文件的字段。这样既安全又灵活。4.4 生成结果的单独目录每次生成最终配置时建议保留产物便于事后核对“这次创建到底用了什么配置”。.build/ └── research-dev/ ├── config.yaml ├── variables.yaml └── command.log这个目录不提交到 git只作为运行记录。排查问题时可以直接查看当时的实际配置而不是依赖记忆。5. 运行验证从 dry-run 到创建完成5.1 本地校验不调用 AWS API 先发现问题在真正触发创建集群前一定要先做本地校验。工具至少应该做到YAML 可以正确解析必填字段存在变量全部完成替换没有残留占位符集群名符合 AWS 命名规则。命令示例pcm validate research-dev预期输出config file: clusters/research-dev.yaml syntax OK variables resolved: 14/14 target config: .build/research-dev/config.yaml如果输出出现unresolved variable: {{ subnet_id }}说明变量替换存在问题不需要继续执行创建命令。5.2 创建后的检查链创建命令执行成功后不能只看CREATE_COMPLETE就认为全部结束。推荐按下面的链路做检查查看集群状态pcluster describe-cluster --cluster-name research-dev查看计算队列pcluster describe-compute-fleet --cluster-name research-dev登录头节点pcluster ssh --cluster-name research-dev在头节点上确认存储挂载df -h /shared工具可以在create --wait完成后把这几个检查项汇总为一张表check result [ok] cluster status: CREATE_COMPLETE [ok] compute fleet: RUNNING [ok] ssh to head node: ok [ok] shared storage mounted: /shared通过检查后才返回退出码 0任何一项失败都返回非 0 退出码方便 CI/CD 拦截。5.3 常见输出与状态含义在轮询或巡检时会看到多种集群状态。下面是常见的状态字段及含义状态含义建议操作CREATE_IN_PROGRESS集群正在创建等待CREATE_COMPLETE集群创建成功可以继续使用CREATE_FAILED创建失败cloudformation 已回滚查看日志修复后重新创建UPDATE_IN_PROGRESS配置正在更新等待避免再次发起更新UPDATE_COMPLETE更新成功检查新配置生效UPDATE_FAILED更新失败根据日志决定回滚或重试DELETE_IN_PROGRESS删除中等待DELETE_FAILED删除失败查看 stack 状态DELETE_COMPLETE删除完成无工具在打印这些状态时应同时打印 CloudFormation stack 的StackStatus和事件记录方便快速定位是哪一层资源出了问题。6. 常见问题排查链路6.1 配置校验失败现象Configuration validation failed可能原因YAML 缩进错误字段名称拼写错误变量替换后残留了模板占位符某个字段的值不在允许范围内。排查路径先执行pcm validate确认本地校验结果查看生成的.build/cluster/config.yaml确认替换后的内容使用官方命令做一次只读校验pcluster validate-configuration \ --cluster-configuration .build/research-dev/config.yaml \ --region cn-north-1根据校验输出定位到具体字段。预防方式在 git 提交前执行pcm validate --ci让 CI 拦截错误配置。6.2 AWS 认证或权限不足现象An error occurred (AccessDenied) when calling the CreateCluster operation可能原因IAM 用户或角色缺少parallelcluster:CreateCluster权限使用了错误的 profile区域不支持该服务。排查路径检查当前身份aws sts get-caller-identity检查AWS_PROFILE环境变量是否指向错误 profile使用最小权限策略逐步放权查看 CloudFormation 的Events确认具体资源失败原因。工具可以在执行前主动检查sts get-caller-identity如果身份不可用就提前退出而不是让用户在创建失败后才发现认证问题。6.3 更新失败且集群进入不可用状态现象cluster status: UPDATE_FAILED这通常意味着配置变更与当前运行资源冲突。ParallelCluster 对部分参数不能在已有集群上做不兼容变更比如更换 VPC、修改子网 CIDR、替换调度器类型等。排查路径获取 stack 事件aws cloudformation describe-stack-events \ --stack-name research-dev \ --region cn-north-1找到UPDATE_FAILED对应的资源判断是网络依赖、AMI 不兼容还是参数冲突如果无法修复考虑删除集群并使用新配置重建或者回滚到上一个可用配置。预防方式更新前生成 diff并把“不允许变更的字段清单”硬编码到工具的校验逻辑中。例如HeadNode.Networking.SubnetId创建后不允许修改工具应直接拦截。6.4 计算节点无法加入集群现象集群状态为CREATE_COMPLETE但计算节点一直处于DOWN或PLACEMENT_FAILEDSlurm 队列看不到可用的计算节点。可能原因子网无法访问共享存储安全组不允许头节点和计算节点之间通信AMI 与当前调度器版本不匹配实例数超出配额或子网 IP 不足IAM 实例角色没有描述集群权限。排查路径登录头节点查看 Slurm 状态sudo -u slurm /opt/slurm/bin/sinfo查看计算节点日志journalctl -u slurmctld journalctl -u slurmdbd检查安全组规则头节点与计算节点之间是否放通了TCP 6820-6829Slurm 通信端口等必要端口检查子网剩余 IP 数是否充足。预防方式在工具中内置最少安全组规则模板并在创建前检查子网可用 IP 数量。6.5 日志收集与快速定位模板为方便日常排障可以给工具增加一个logs子命令自动收集常见日志pcm logs research-dev --output-dir logs/research-dev收集内容至少包括logs/ └── research-dev/ ├── cloudformation-events.json ├── cluster-config.yaml ├── head-node-syslog.txt └── slurm-queue-status.txt这样排查问题时不需要在多个控制台页面之间切换。7. 最佳实践及向生产级工具演进7.1 生产环境使用清单在把 ParallelClusterMaker 或同类工具接入生产环境前需要额外检查下列事项检查项说明是否必须配置备份更新前自动备份旧配置必须日志落盘每次运行保留到独立目录必须IAM 最小权限工具进程只使用必要权限必须更新 diff 预览执行更新前先展示变更摘要必须超时熔断--timeout-min默认给一个上限建议告警通知创建失败或节点 DOWN 时需要通知建议多云区域配置不同 region 的 AMI、子网分离建议7.2 接入 CI/CD 的典型流程在自动发布流水线中工具可以承担“配置渲染 校验 触发创建”的职责。典型流程如下git push - CI 拉取配置 - 安装依赖pcluster pcm - pcm validate --ci --cluster research-dev - pcm create research-dev --wait --timeout-min 30 - 检查输出退出码 - 成功后更新集群状态文档失败时CI 应该把.build/research-dev/*.log作为制品上传并保留 7 天。7.3 扩展方向一个成熟管理工具还可以继续扩展多集群批量操作一条命令对多个集群执行相同更新事件驱动根据 CloudWatch Event 自动触发失败告警配额检查创建前预检查 EC2 配额、子网 IP 余量费用标签管理自动为不同环境打上成本标签配置漂移检测定期比较实际集群配置和仓库中保存的预期配置。这些能力可以让工具从“命令封装器”逐步变成团队的基础设施管理入口。回到最初的问题管理多个 AWS ParallelCluster stack难点不在单条命令而在配置、状态、变更和历史记录的一致性。ParallelClusterMaker 这类 CLI toolkit 的核心价值是把容易出错的人工操作变成可校验、可记录、可重复执行的工程化流程。如果你刚开始搭建自己的 HPC 集群管理工具不要急着实现大量新功能先把配置模板、变量替换、状态轮询、日志落盘和退出码规范这五件事做好就已经能解决绝大多数日常运维问题。
返回列表