1

我在 Kubernetes 环境中运行 Spring Batch 应用程序。k8s 集群有一个主节点和三个工作节点。我正在高负载下测试弹簧批次,它产生了大约 100 个工作容器。但是,所有 100 个 pod 仅在三个工作节点中的两个上出现。没有对节点进行节点选择器或附加标签。

我已经使用 Spring cloud deployer Kubernetes 在 Kubernetes 中创建了 worker pod。

涉及的版本有:

  • Spring Boot:2.1.9.RELEASE
  • 春云:2020.0.1
  • Spring Cloud 部署器:2.5.0
  • Spring Cloud 任务:2.1.1.RELEASE
  • Kubernetes:1.21

如何确保在所有可用的工作程序节点上均匀地安排工作程序 pod?

以下是负责启动任务的分区处理程序实现。

@Bean
public PartitionHandler partitionHandler(TaskLauncher taskLauncher, JobExplorer jobExplorer) {

    Resource resource = this.resourceLoader.getResource(resourceSpec);

    DeployerPartitionHandler partitionHandler = new DeployerPartitionHandler(taskLauncher, jobExplorer, resource,
        "worker");

    commandLineArgs.add("--spring.profiles.active=worker");
    commandLineArgs.add("--spring.cloud.task.initialize.enable=false");
    commandLineArgs.add("--spring.batch.initializer.enabled=false");
    commandLineArgs.add("--spring.cloud.task.closecontext_enabled=true");
    commandLineArgs.add("--logging.level.root=DEBUG");

    partitionHandler.setCommandLineArgsProvider(new PassThroughCommandLineArgsProvider(commandLineArgs));
    partitionHandler.setEnvironmentVariablesProvider(environmentVariablesProvider());
    partitionHandler.setApplicationName(appName + "worker");
    partitionHandler.setMaxWorkers(maxWorkers);

    return partitionHandler;
}

@Bean
public EnvironmentVariablesProvider environmentVariablesProvider() {
    return new SimpleEnvironmentVariablesProvider(this.environment);
}
4

1 回答 1

1

将此作为社区 wiki 发布在评论中以获得更好的可见性,请随时编辑和扩展。


有一些调度机制可以防止在某些节点上调度 pod:

如果未设置任何内容,则值得尝试重新加入节点。例如,它可能没有正确注册(这解决了上面的问题)。

于 2021-09-14T09:06:46.903 回答