aws batch 在eks上配置计算环境和提交任务

news2024/11/15 0:40:13

文档

  • Getting started with Amazon Batch on Amazon EKS
  • Amazon EKS jobs
  • Memory and vCPU considerations for Amazon Batch on Amazon EKS

batch不会管理集群,只是会管理节点(自动扩缩)并运行任务。batch在eks中单独管理自身资源(不会影响其他pod,node和asg),最佳实践是创建一个单独的nsmespace

在batch创建计算环境和eks关联,此时计算环境和eks解耦,用户实际上是在抽象的计算环境中提交任务,任务到pod的转换交给了batch

eks 和 batch job

job是batch的最小单元,eks上的batch job是和pod的映射。当提交jib时,job定义中的eks properties包括了能够在eks上运行的job的参数。

The podProperties of a running job have podName and nodeName parameters set for the current job attempt

aws batch describe-jobs --job 2d044787-c663-4ce6-a6fe-f2baf7e51b04

当向eks提交job时,batch会将job转换成pod定义。通过label和taints确保job运行在batch托管的节点上。eks上的job pod定义默认有以下设置

hostNetwork = true
dnsPolicy = ClusterFirstWithHostNet

使用cloudwatch logs监控eks上batch job的运行,https://docs.amazonaws.cn/en_us/batch/latest/userguide/batch-eks-cloudwatch-logs.html

pod中设置了label标识了batch job的jobid和计算环境的uuid。通过向pod注入环境变量为job runtime指明作业信息

kubectl describe pod aws-batch.14638eb9-d218-372d-ba5c-1c9ab9c7f2a1 -n my-aws-batch-namespace

在eks上运行基于gpu的作业,https://docs.amazonaws.cn/en_us/batch/latest/userguide/run-eks-gpu-workload.html

eks上内存和cpu的预留逻辑和GKE有区别,尤其在内存这块。batch的可能会受到预留资源的影响

eks 和 batch 计算环境

配置工具(awscli,kuebctl),配置权限(访问eks),创建集群

注意:batch只支持公共访问的eks集群

在eks创建的资源包括

  • 专用名称空间ns

  • clusterrolebinding,batchh监控node和pod

  • role,在ns中创建专用的角色,绑定用户aws-batch

  • 创建iamidentitymapping映射到AWSServiceRoleForBatch(此处有bug尚未解决,这个角色的路径需要删除不饿能直接复制)

注意点:

  • EKS 计算环境仅支持BEST_FIT_PROGRESSIVESPOT_CAPACITY_OPTIMIZED分配策略
  • aws cli工具在2.8.6版本之后才支持创建eks计算环境
  • 实例role盈盈eks node角色,实例sg对应cluster的安全组

使用命令行出现以下错误,通过--generate-cli-skeleton生成模板发现确实没有eksConfiguration配置,检查awscli版本,建议更新到2.8.6之后

Parameter validation failed:
Unknown parameter in input: "eksConfiguration", must be one of: computeEnvironmentName, type, state, unmanagedvCpus, computeResources, serviceRole, tags

再次执行,同时会创建asg,将网络配置填充到对应的启动模板中

可以在--compute-resources中配置 ec2Configuration.imageType 选择gpu类型实例

The image type to match with the instance type to select an AMI. The supported values are different for ECS and EKS resources.

ECS:ECS_AL2,ECS_AL2_NVIDIA,ECS_AL1,ECS

EKS:EKS,EKS_AL2,EKS_AL2_NVIDIA(例如P4 和 G4)

aws batch create-compute-environment --cli-input-json file://./batch-eks-compute-environment.json
{
    "computeEnvironmentName": "My-eks-CE1",
    "computeEnvironmentArn": "arn:aws-cn:batch:cn-north-1:xxxxxxxx:compute-environment/My-eks-CE1"
}
aws batch describe-compute-environments

创建计算队列

aws batch create-job-queue --cli-input-json file://./batch-eks-job-queue.json
{
    "jobQueueName": "My-eks-JQ1",
    "jobQueueArn": "arn:aws-cn:batch:cn-north-1:xxxxxx:job-queue/My-eks-JQ1"
}

创建任务定义,和ecs的任务定义类似,其中有eksProperties配pod参数,可以对pod的command等参数进行覆盖

aws batch register-job-definition --cli-input-json file://./batch-eks-job-definition.json
{
    "jobDefinitionName": "MyJobOnEks_Sleep
    "jobDefinitionArn": "arn:aws-cn:batch:cn-north-1:xxxxxxx:job-definition/MyJobOnEks_Sleep:2",
    "revision": 2
}

创建简单任务并提交到作业队列,通过以下方式设置job调度

  • 设定任务队列的优先级。为任务设定调度优先级

  • 调度策略。在创建作业队列时未指定调度策略,作业调度程序默认使用先进先出(FIFO)策略

  • 公平调度。使用共享标识标记job,调度器从共享标识的作业中选择使用率最低的作业

aws batch submit-job --job-queue My-eks-JQ1 \
>     --job-definition MyJobOnEks_Sleep --job-name My-eks-Job1
{
    "jobArn": "arn:aws-cn:batch:cn-north-1:xxxxxxxxxxxx:job/fe10768a-a3b5-4596-93f1-b48083332e73",
    "jobName": "My-eks-Job1",
    "jobId": "fe10768a-a3b5-4596-93f1-b48083332e73"
}

aws batch describe-jobs --job fe10768a-a3b5-4596-93f1-b48083332e73

控制台查看提交的任务json

在这里插入图片描述

此后新的m5.large实例启动,使用eks优化ami,配置添加了如下userdate

#!/bin/bash
set -ex

if [ -f /etc/aws-batch/batch.config ]; then
  while read line; do
    [ $(expr "$line" : "^[A-Za-z_][0-9A-Za-z_]*=.*") -gt 0 ] && eval export $line
  done < /etc/aws-batch/batch.config
fi

[ -z "$AWS_BATCH_KUBELET_EXTRA_ARGS" ] && AWS_BATCH_KUBELET_EXTRA_ARGS=""

/etc/eks/bootstrap.sh worklearn \
  --kubelet-extra-args ' '"$AWS_BATCH_KUBELET_EXTRA_ARGS"'  ... '

节点加入集群失败,出现如下错误Failed to contact API server when waiting for CSINode publishing: Unauthorized

kubelet_node_status.go:70] "Attempting to register node" node="ip-192-168-30-56.cn-north-1.compute.internal"
kubelet.go:2469] "Error getting node" err="node \"ip-192-168-30-56.cn-north-1.compute.internal\" not found"
kubelet_node_status.go:92] "Unable to register node with API server" err="Unauthorized" node="ip-192-168-30-56.cn-north-1.compute.internal"
kubelet.go:2469] "Error getting node" err="node \"ip-192-168-30-56.cn-north-1.compute.internal\" not found"
csi_plugin.go:1063] Failed to contact API server when waiting for CSINode publishing: Unauthorized

最终发现是忘记将node的角色加入eks集群的aws-auth configmap中,加入一下

- groups:
  - system:bootstrappers
  - system:nodes
  rolearn: arn:aws-cn:iam::xxxxxx:role/myEKSNodeRole

这里总结一下batch 节点启动逻辑,batch会在配置的子网中通过dry-run的方式确认实例能够正常启动,随后batch修改ags的启动模板中的desired count数量,将节点启动。在cloudtrail中会看到以下意料中错误

An error occurred (InvalidParameter) when calling the RunInstances operation: Security group sg-0b1e6f21a1a04d078 and subnet subnet-027025e9d9760acdd belong to different networks.

修改之后计算环境启动,并且任务成功执行

node配置如下,节点通过污点排斥其他pod

apiVersion: v1
kind: Node
metadata:
  annotations:
    alpha.kubernetes.io/provided-node-ip: 192.168.15.116
    csi.volume.kubernetes.io/nodeid: '{"efs.csi.aws.com":"i-xxxxxxxx"}'
    node.alpha.kubernetes.io/ttl: "0"
    volumes.kubernetes.io/controller-managed-attach-detach: "true"
  labels:
    batch.amazonaws.com/compute-environment-revision: "4"
    batch.amazonaws.com/compute-environment-uuid: 6c63cab8-8b00-3021-bb3d-fb990cef9c60
    beta.kubernetes.io/arch: amd64
    beta.kubernetes.io/instance-type: m5.xlarge
    beta.kubernetes.io/os: linux
    failure-domain.beta.kubernetes.io/region: cn-north-1
    failure-domain.beta.kubernetes.io/zone: cn-north-1a
    k8s.io/cloud-provider-aws: f48c3b996b9bce33df562d04d847dfaf
    kubernetes.io/arch: amd64
    kubernetes.io/hostname: ip-192-168-15-116.cn-north-1.compute.internal
    kubernetes.io/os: linux
    node.kubernetes.io/instance-type: m5.xlarge
    topology.kubernetes.io/region: cn-north-1
    topology.kubernetes.io/zone: cn-north-1a
  name: ip-192-168-15-116.cn-north-1.compute.internal
  resourceVersion: "34308242"
  uid: ffc8beb4-f326-4135-a471-e0b1d9511012
spec:
  providerID: aws:///cn-north-1a/i-xxxxxxx
  taints:
  - effect: NoSchedule
    key: batch.amazonaws.com/batch-node
  - effect: NoExecute
    key: batch.amazonaws.com/batch-node

pod配置如下,label指明了计算环境和任务id,任务pod上配置了污点容忍和batch环境变量。默认网络模式为hostNetwork=truednsPolicy=ClusterFirstWithHostNet

任务制定完毕pod立刻被清除,可以配置cloudwatch agent收集日志(使用fluentbit组件需要增加污点容忍配置)

apiVersion: v1
kind: Pod
metadata:
  annotations:
    kubernetes.io/psp: eks.privileged
  labels:
    batch.amazonaws.com/compute-environment-uuid: 6c63cab8-8b00-3021-bb3d-fb990cef9c60
    batch.amazonaws.com/job-id: a5b695fc-8847-4a32-bfb5-99c6cf66c1df
    batch.amazonaws.com/node-uid: ffc8beb4-f326-4135-a471-e0b1d9511012
  name: aws-batch.b08aaab0-59e6-39b7-ada4-bbae690412b2
  namespace: my-aws-batch-namespace
spec:
  containers:
  - command:
    - sleep
    - "60"
    env:
    - name: AWS_BATCH_JOB_KUBERNETES_NODE_UID
      value: ffc8beb4-f326-4135-a471-e0b1d9511012
    - name: AWS_BATCH_JOB_ID
      value: a5b695fc-8847-4a32-bfb5-99c6cf66c1df
    - name: AWS_BATCH_JQ_NAME
      value: My-eks-JQ1
    - name: AWS_BATCH_JOB_ATTEMPT
      value: "1"
    - name: AWS_BATCH_CE_NAME
      value: My-eks-CE1
    image: public.ecr.aws/amazonlinux/amazonlinux:2
    imagePullPolicy: IfNotPresent
    name: default
    resources:
      limits:
        cpu: "1"
        memory: 1Gi
      requests:
        cpu: "1"
        memory: 1Gi
    terminationMessagePath: /dev/termination-log
    terminationMessagePolicy: File
    volumeMounts:
    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
      name: kube-api-access-xddn2
      readOnly: true
  dnsPolicy: ClusterFirst
  enableServiceLinks: true
  hostNetwork: true
  nodeName: ip-192-168-15-116.cn-north-1.compute.internal
  preemptionPolicy: PreemptLowerPriority
  priority: 0
  restartPolicy: Never
  schedulerName: default-scheduler
  securityContext: {}
  serviceAccount: default
  serviceAccountName: default
  terminationGracePeriodSeconds: 30
  tolerations:
  - effect: NoSchedule
    key: batch.amazonaws.com/batch-node
    operator: Exists
  - effect: NoExecute
    key: batch.amazonaws.com/batch-node
    operator: Exists
  - effect: NoExecute
    key: node.kubernetes.io/not-ready
    operator: Exists
    tolerationSeconds: 300
  - effect: NoExecute
    key: node.kubernetes.io/unreachable
    operator: Exists
    tolerationSeconds: 300
  volumes:
  - name: kube-api-access-xddn2
    projected:
      defaultMode: 420
      sources:
      - serviceAccountToken:
          expirationSeconds: 3607
          path: token
      - configMap:
          items:
          - key: ca.crt
            path: ca.crt
          name: kube-root-ca.crt
      - downwardAPI:
          items:
          - fieldRef:
              apiVersion: v1
              fieldPath: metadata.namespace
            path: namespace

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/57944.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

异常Exception

1.异常是什么&#xff1f; 程序中可能出出现的问题 2.异常体系的最上层父类是谁&#xff1f;异常分为几类 父类&#xff1a;Exception 异常分为两类&#xff1a;编译时异常、运行时异常 3.编译时异常和运行时异常的区别 编译时异常&#xff1a;除了RuntimeException和他的子类…

华为悦盒ec6108v9c使用ADB卡刷Linux(Ubuntu)

1. adb连接华为ec6108v9c&#xff1a; adb连接盒子IP: adb connect 192.168.3.4进入adb shell: adb shell在安卓后台终端输入以下命令&#xff0c;读取盒子的 reg name 管脚对应名称: cat /dev/block/mmcblk0p1 | grep -a hi3798m 2. 用Hitool工具制作对应你盒子reg名称的烧…

Python测试进阶(一)

文章目录测试框架pytestMarkskip参数化异常处理数据驱动Allure集成生成报告Fixture基操作用域yield数据共享自动应用参数化ini运行规则配置命令行参数指定/忽略执行目录配置日志插件开发常用插件分布式并发自定义插件打包发布hook小结测试框架 先了解unittest问题分析 自动化测…

SAS,Stata,HLM,R,SPSS和Mplus分层线性模型HLM分析学生受欢迎程度数据

全文链接&#xff1a;http://tecdat.cn/?p10809本文用于比较六个不同统计软件程序&#xff08;SAS&#xff0c;Stata&#xff0c;HLM&#xff0c;R&#xff0c;SPSS和Mplus&#xff09;的两级分层线性模型的过程和输出&#xff08;点击文末“阅读原文”获取完整代码数据&#…

Java项目:SSM学生会管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目分为管理员、学生两种角色&#xff0c; 管理员角色包含以下功能&#xff1a; 管理员登陆,管理学生,管理机构,活动信息发布,部门管理,职位…

仿SpringBoot启动Dome实现

文章目录前言环境搭建依赖项目结构实现启动获取服务器自动配置启动Tomcat总结前言 填一下以前这篇博文&#xff1a;如何纯注解整合Spring SpringMVC Mybatis埋下的坑&#xff0c;我们来简单的了解一下SpringBoot它做的一些自动配置是怎么一回事&#xff0c;同时也看看SpringBo…

【人民币识别】人民币序列号识别【含GUI Matlab源码 908期】

⛄一、简介 本文描述的人民币序列号识别系统实现了从图像预处理到识别结果的过程, 而序列号识别是本文的重要内容.以序列号区域为研究对象, 主要包括图像预处理、图像分割以及序列号识别等过程。 1 图像预处理 人民币图像总体上来说灰度偏高, 灰度值基本上都大于150 (对8位25…

具有平滑正曲线边界的一般凸体的精确闭式闵可夫斯基研究(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

Minecraft 1.19.2 Forge模组开发 04.动画效果物品

我们本次实现一个具有动画效果的物品&#xff0c;本次演示的模型代码均在文末给出 效果演示效果演示效果演示 首先&#xff0c;请确保你的开发包中引入了geckolib依赖&#xff0c;相关教程请参考:Minecraft 1.19.2 Forge模组开发 03.动画生物实体 1.首先我们要使用geckolib制…

(三)操作系统的运行环境

文章目录一、操作系统的运行机制1. 时钟管理2. 中断机制3. 原语4. 系统数据结构5. 系统调用二、操作系统体系结构1. 传统的操作系统结构&#xff08;大内核&#xff09;第一代&#xff1a;无结构OS第二代&#xff1a;模块化结构OS&#xff1a;模块-接口法OS第三代&#xff1a;分…

[附源码]计算机毕业设计springboot学习帮扶网站设计与实现

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

坦克大战②

1. 我方坦克发射单颗子弹 当发射一颗子弹后&#xff0c;就相当于启动一个线程来控制它的位置坐标&#xff1b;Hero[我方坦克]有子弹的对象&#xff0c;当按下J时&#xff0c;就创建一个发射子弹的线程&#xff0c;通过坐标变化让子弹不停的移动&#xff0c;形成一个射击的效果&…

redis 集群搭建的三种方式

文章目录一、Redis主从二、Redis哨兵三、Redis集群一、Redis主从 二、Redis哨兵 三、Redis集群 下载redis wget http://download.redis.io/releases/redis-5.0.3.tar.gz解压redis tar zxvf redis-5.0.3.tar.gz进行重命名 mv redis-5.0.3 redis安装gcc yum install gcc进入red…

如何学习一门技术

如何学习一门技术 同样的生活&#xff0c;在你经历了一些意外和不如意之后&#xff0c;你再回过头来看&#xff0c;之前你所抱怨的生活其实是一个蛮不错的生活。 罗翔&#xff1a;每一个人都应该拥有学习的能力和权力&#xff0c;真正的知识要能走出书斋&#xff0c;去影响每…

StarkNet 性能路线图

目录 前言 区块限制&#xff1a;Validity Rollups vs L1 为什么 L1 吞吐量有限&#xff1f; 为什么相同的障碍不影响validity rollups&#xff1f; Sequencer 并行化 Cairo-VM 的新 Rust 实现 Rust 对 sequencer重新实现 Provers呢&#xff1f; Summary 参考 前言 St…

详解设计模式:迭代器模式

迭代器模式&#xff08;Iterator Pattern&#xff09;也被称为游标模式&#xff08;Cursor Pattern&#xff09;&#xff0c;是在 GoF 23 种设计模式中定义了的行为型模式。是一种最简单也最常见的设计模式。 迭代器模式 可以让用户透过特定的接口巡访容器中的每一个元素而不用…

HTML5期末大作业:美食网页主题网站设计与实现——HTML+CSS+JavaScript月饼美食食品企业网站html模板9页面

&#x1f468;‍&#x1f393;静态网站的编写主要是用HTML DIVCSS JS等来完成页面的排版设计&#x1f469;‍&#x1f393;,常用的网页设计软件有Dreamweaver、EditPlus、HBuilderX、VScode 、Webstorm、Animate等等&#xff0c;用的最多的还是DW&#xff0c;当然不同软件写出的…

[附源码]计算机毕业设计校园运动会管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Linux基本工具——vim

Linux编辑器vim什么是vimvim的三种常用模式vim的基本操作命令模式插入模式底行模式搭配vim环境sudo怎么才能让普通用户使用什么是vim vim是linux下一款功能强大&#xff0c;多模式的编辑器。 现阶段有13种模式。 这就是进入vim的方式。 vim的三种常用模式 命令模式 我们第一…

CentOS7 编译安装最新的Linux Kernel 6.0 rc3

哪个男孩不想手动编译一份自己的内核呢&#xff1f;安装编译环境 CentOS7安装必要的包 yum groupinstall "Development Tools" -y && yum install openssl-devel -y && yum install rpm-build redhat-rpm-config asciidoc hmaccalc perl-ExtUtils-…