K8s集群运行SCDF样例partitioned-batch-job报Docker URI错误
问题描述
我修改了DataFlow的样例应用partitioned-batch-job,希望通过运行在Kubernetes集群内的SCDF服务器完成部署。我通过仪表盘将该应用作为任务启动,应用本身启动正常,但我提供给DeployerPartitionHandler的Docker资源触发了URI错误,错误栈和修改后的代码片段如下,麻烦帮忙判断我用的URI语法是否正确,如果语法没问题的话,为什么主步骤无法通过提供的Docker镜像引用启动worker节点。
java.lang.IllegalArgumentException: Unable to get URI for class path resource [docker:vrajkuma/partitioned-batch-job:2.3.1-SNAPSHOT] at org.springframework.cloud.deployer.spi.kubernetes.DefaultContainerFactory.create(DefaultContainerFactory.java:80) ~[spring-cloud-deployer-kubernetes-2.6.2.jar:2.6.2] at org.springframework.cloud.deployer.spi.kubernetes.AbstractKubernetesDeployer.createPodSpec(AbstractKubernetesDeployer.java:210) ~[spring-cloud-deployer-kubernetes-2.6.2.jar:2.6.2] at org.springframework.cloud.deployer.spi.kubernetes.KubernetesTaskLauncher.launch(KubernetesTaskLauncher.java:237) ~[spring-cloud-deployer-kubernetes-2.6.2.jar:2.6.2] at org.springframework.cloud.deployer.spi.kubernetes.KubernetesTaskLauncher.launch(KubernetesTaskLauncher.java:119) ~[spring-cloud-deployer-kubernetes-2.6.2.jar:2.6.2] at org.springframework.cloud.task.batch.partition.DeployerPartitionHandler.launchWorker(DeployerPartitionHandler.java:394) [spring-cloud-task-batch-2.3.1-SNAPSHOT.jar:2.3.1-SNAPSHOT] at org.springframework.cloud.task.batch.partition.DeployerPartitionHandler.launchWorkers(DeployerPartitionHandler.java:313) [spring-cloud-task-batch-2.3.1-SNAPSHOT.jar:2.3.1-SNAPSHOT] at org.springframework.cloud.task.batch.partition.DeployerPartitionHandler.handle(DeployerPartitionHandler.java:302) [spring-cloud-task-batch-2.3.1-SNAPSHOT.jar:2.3.1-SNAPSHOT] at org.springframework.batch.core.partition.support.PartitionStep.doExecute(PartitionStep.java:106) [spring-batch-core-4.3.3.jar:4.3.3] at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:208) [spring-batch-core-4.3.3.jar:4.3.3] at org.springframework.batch.core.job.SimpleStepHandler.handleStep(SimpleStepHandler.java:152) [spring-batch-core-4.3.3.jar:4.3.3] at org.springframework.batch.core.job.AbstractJob.handleStep(AbstractJob.java:413) [spring-batch-core-4.3.3.jar:4.3.3] at org.springframework.batch.core.job.SimpleJob.doExecute(SimpleJob.java:136) [spring-batch-core-4.3.3.jar:4.3.3] at org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:320) [spring-batch-core-4.3.3.jar:4.3.3] at org.springframework.batch.core.launch.support.SimpleJobLauncher$1.run(SimpleJobLauncher.java:149) [spring-batch-core-4.3.3.jar:4.3.3] at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:50) [spring-core-5.3.9.jar:5.3.9] at org.springframework.batch.core.launch.support.SimpleJobLauncher.run(SimpleJobLauncher.java:140) [spring-batch-core-4.3.3.jar:4.3.3]
以下是我修改后的JobConfiguration.java文件代码,我只把maven资源替换成了Docker镜像引用,同时修改了pom.xml依赖,把本地部署器替换成了kubernetes部署器。
@Configuration public class JobConfiguration { private static final int GRID_SIZE = 4; // @checkstyle:off @Autowired public JobBuilderFactory jobBuilderFactory; @Autowired public StepBuilderFactory stepBuilderFactory; @Autowired public DataSource dataSource; @Autowired public JobRepository jobRepository; // @checkstyle:on @Autowired private ConfigurableApplicationContext context; @Autowired private DelegatingResourceLoader resourceLoader; @Autowired private Environment environment; @Bean public PartitionHandler partitionHandler(TaskLauncher taskLauncher, JobExplorer jobExplorer, TaskRepository taskRepository, DockerResourceLoader dockerResourceLoader) throws Exception { Resource resource = this.resourceLoader .getResource("docker:vrajkuma/partitioned-batch-job:2.3.1-SNAPSHOT"); DeployerPartitionHandler partitionHandler = new DeployerPartitionHandler(taskLauncher, jobExplorer, resource, "workerStep", taskRepository);
我用到的对应镜像仓库标签在Docker Hub真实存在,且和我在仪表盘注册应用时提交的URI完全一致。我的K8s环境是运行在虚拟机上的本地裸金属集群,通过官方提供的Helm Chart部署了SCDF服务器,其他样例应用(billsetuptask & billrun)都可以在集群中正常运行。
解决方案
你遇到的问题有两个明确的修正点,按以下步骤修改即可:
- 首先修正Docker资源的URI格式:你当前使用的
docker:vrajkuma/partitioned-batch-job:2.3.1-SNAPSHOT不符合标准格式,docker资源的标准URI需要补充两个斜杠,修改为docker://vrajkuma/partitioned-batch-job:2.3.1-SNAPSHOT即可。 - 你代码里已经注入了专门的
DockerResourceLoader,不要用默认的DelegatingResourceLoader加载docker资源。默认的加载器如果没有配置docker前缀识别规则,会把你输入的URI当成classpath资源处理,这也是错误日志里提示class path resource [docker:xxx]的根本原因。把加载资源的代码改成Resource resource = dockerResourceLoader.getResource("docker://vrajkuma/partitioned-batch-job:2.3.1-SNAPSHOT");即可。
修改完成后重新打包部署就能正常加载docker镜像启动worker节点。
内容的提问来源于stack exchange,提问作者vrajkuma
相关产品推荐
相关产品推荐

