我正在进行一项设置,需要通过特定节点上的 Kubernetes CronJob 运行特定容器。工作流程包括:
1️⃣ 在 CronJob 执行之前启动一个新节点。
2️⃣ 在新节点上运行容器。
3️⃣ 容器完成后终止节点。
这是我目前的方法:
第一个 CronJob(上午 10:00):扩展 ASG 以使用 AWS CLI 启动新节点。
第二个 CronJob(上午 10:05):在新节点上运行容器并在完成后缩小 ASG。
设置包括:
这是上下文配置的片段:
第一个 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
这种方法看起来有效吗?有没有更好的方法来处理这种工作量?
更好的解决方案是使用 Karpenter 自动为作业创建新机器。由于节点选择器
java-db-node
存在,这意味着 pod 不会在没有此选择器的任何节点上调度。因此,如果您要创建具有此特定标签的节点池,那么机器数量将保持为 0,直到作业开始。当作业开始时,pod 将保持挂起状态,直到 Karpenter 调度机器。工作完成后,卡彭特将拆除机器。这样你就不需要创建第二个 cronjob。
我们使用 Karpenter 而不是集群自动缩放器,因为 CA 无法缩放到零,并且需要一台带有标签“java-db-node”的机器始终运行,这可能会达不到目的。
当然,这个解决方案可能太复杂,因为您的集群上已经运行了一个技术堆栈,并且使用 Karpenter 可能不可行。在这种情况下,第二个 CronJob 的选项非常好。