Kubernetes Cronjob 在特定节点上执行

问题描述 投票:0回答:1

我正在进行一项设置,需要通过特定节点上的 Kubernetes CronJob 运行特定容器。工作流程包括:

1️⃣ 在 CronJob 执行之前启动一个新节点。

2️⃣ 在新节点上运行容器。

3️⃣ 容器完成后终止节点。

这是我目前的方法:

  1. 第一个 CronJob(上午 10:00):扩展 ASG 以使用 AWS CLI 启动新节点。

  2. 第二个 CronJob(上午 10:05):在新节点上运行容器并在完成后缩小 ASG。

设置包括:

  • 通过nodeSelector选择节点。
  • 在容器中使用 AWS CLI 命令扩展逻辑。

这是上下文配置的片段:

第一个 CronJob(向上扩展):

apiVersion: batch/v1
kind: CronJob
metadata:
  name: scale-up-asg-job
spec:
  schedule: "0 10 * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
            - name: scale-up-asg
              image: amazon/aws-cli:latest
              command:
                - sh
                - -c
                - |
                  aws autoscaling describe-auto-scaling-groups --query "AutoScalingGroups[*].AutoScalingGroupName" --output text
                  echo "Scaling up the ASG to 1 instance..."
                  aws autoscaling set-desired-capacity --auto-scaling-group-name "eks-java-appp-XXXXXXXXX" --desired-capacity 1 --region us-east-1
          restartPolicy: Never

第二个 CronJob(主要任务和缩小规模):

apiVersion: batch/v1
kind: CronJob
metadata:
  name: schedule-ec2-task-sample-application
spec:
  schedule: "5 10 * * *"
  jobTemplate:
    spec:
      template:
        metadata:
          labels:
            app: atp
        spec:
          restartPolicy: Never
          initContainers: # Scale up the ASG before starting the job
            - name: sample-java-db-app # Main application container
              image: 637423423652.dkr.ecr.us-east-1.amazonaws.com/java-db-app
              command:
                - sh
                - -c
                - |
                  echo "Running the main application..."
                  # Add your application's logic here
                  sleep 120 # Simulating application runtime
                  echo "Main application finished."
          containers:
            - name: scale-down-asg # Sidecar to scale down the ASG after job completion
              image: amazon/aws-cli:latest
              command:
                - sh
                - -c
                - |
                  aws autoscaling describe-auto-scaling-groups --query "AutoScalingGroups[*].AutoScalingGroupName" --output text
                  echo "Scaling up the ASG to 1 instance..."
                  aws autoscaling set-desired-capacity --auto-scaling-group-name "eks-atp-test-76c9cabf-3ae0-ea1b-052b-9ab155498992" --desired-capacity 0 --region us-east-1
          nodeSelector:
            app: java-db-node # Ensure the job runs on the correct node

这种方法看起来有效吗?有没有更好的方法来处理这种工作量?

kubernetes amazon-ec2 cron aws-cli amazon-eks
1个回答
0
投票

更好的解决方案是使用 Karpenter 自动为作业创建新机器。由于节点选择器

java-db-node
存在,这意味着 pod 不会在没有此选择器的任何节点上调度。因此,如果您要创建具有此特定标签的节点池,那么机器数量将保持为 0,直到作业开始。当作业开始时,pod 将保持挂起状态,直到 Karpenter 调度机器。工作完成后,卡彭特将拆除机器。这样你就不需要创建第二个 cronjob。

我们使用 Karpenter 而不是集群自动缩放器,因为 CA 无法缩放到零,并且需要一台带有标签“java-db-node”的机器始终运行,这可能会达不到目的。

当然,这个解决方案可能太复杂,因为您的集群上已经运行了一个技术堆栈,并且使用 Karpenter 可能不可行。在这种情况下,第二个 CronJob 的选项非常好。

© www.soinside.com 2019 - 2024. All rights reserved.