搜索

200.4. Kubernetes 任务生成示例

download PDF
  • listJob:此操作列出了 kubernetes 集群上的作业

    from("direct:list").
        toF("kubernetes-job:///?kubernetesClient=#kubernetesClient&operation=listJob").
        to("mock:result");

    此操作从集群中返回作业列表

  • listJobByLabels:此操作根据 kubernetes 集群上的标签列出作业

    from("direct:listByLabels").process(new Processor() {
                @Override
                public void process(Exchange exchange) throws Exception {
                    Map<String, String> labels = new HashMap<>();
                    labels.put("key1", "value1");
                    labels.put("key2", "value2");
                    exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_JOB_LABELS, labels);
                }
            });
        toF("kubernetes-job:///?kubernetesClient=#kubernetesClient&operation=listJobByLabels").
        to("mock:result");

    此操作使用标签选择器(带有 key1 和 key2,值为 value1 和 value2)从集群中返回作业列表。

  • CreateJob:此操作在 Kubernetes 集群上创建作业

    得益于此 Java 测试中的 Emmerson Miranda,我们对这个操作有很好的例子

    import java.util.ArrayList;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import javax.inject.Inject;
    
    import org.apache.camel.Endpoint;
    import org.apache.camel.builder.RouteBuilder;
    import org.apache.camel.cdi.Uri;
    import org.apache.camel.component.kubernetes.KubernetesConstants;
    import org.apache.camel.component.kubernetes.KubernetesOperations;
    
    import io.fabric8.kubernetes.api.model.Container;
    import io.fabric8.kubernetes.api.model.ObjectMeta;
    import io.fabric8.kubernetes.api.model.PodSpec;
    import io.fabric8.kubernetes.api.model.PodTemplateSpec;
    import io.fabric8.kubernetes.api.model.batch.JobSpec;
    
    public class KubernetesCreateJob extends RouteBuilder {
    
        @Inject
        @Uri("timer:foo?delay=1000&repeatCount=1")
        private Endpoint inputEndpoint;
    
        @Inject
        @Uri("log:output")
        private Endpoint resultEndpoint;
    
        @Override
        public void configure() {
            // you can configure the route rule with Java DSL here
    
            from(inputEndpoint)
            	.routeId("kubernetes-jobcreate-client")
            	.process(exchange -> {
            		exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_JOB_NAME, "camel-job"); //DNS-1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character (e.g. 'example.com', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*')
                    exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "default");
    
                    Map<String, String> joblabels = new HashMap<String, String>();
                    joblabels.put("jobLabelKey1", "value1");
                    joblabels.put("jobLabelKey2", "value2");
                    joblabels.put("app", "jobFromCamelApp");
                    exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_JOB_LABELS, joblabels);
    
                    exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_JOB_SPEC, generateJobSpec());
            	})
            	.toF("kubernetes-job:///{{kubernetes-master-url}}?oauthToken={{kubernetes-oauth-token:}}&operation=" + KubernetesOperations.CREATE_JOB_OPERATION)
            	.log("Job created:")
            	.process(exchange -> {
            		System.out.println(exchange.getIn().getBody());
            	})
                .to(resultEndpoint);
        }
    
    	private JobSpec generateJobSpec() {
    		JobSpec js = new JobSpec();
    
    		PodTemplateSpec pts = new PodTemplateSpec();
    
    		PodSpec ps = new PodSpec();
    		ps.setRestartPolicy("Never");
    		ps.setContainers(generateContainers());
    		pts.setSpec(ps);
    
    		ObjectMeta metadata = new ObjectMeta();
    		Map<String, String> annotations = new HashMap<String, String>();
    		annotations.put("jobMetadataAnnotation1", "random value");
    		metadata.setAnnotations(annotations);
    
    		Map<String, String> podlabels = new HashMap<String, String>();
    		podlabels.put("podLabelKey1", "value1");
    		podlabels.put("podLabelKey2", "value2");
    		podlabels.put("app", "podFromCamelApp");
    		metadata.setLabels(podlabels);
    
    		pts.setMetadata(metadata);
    		js.setTemplate(pts);
    		return js;
    	}
    
    	private List<Container> generateContainers() {
    		Container container = new Container();
    		container.setName("pi");
    		container.setImage("perl");
    		List<String> command = new ArrayList<String>();
    		command.add("echo");
    		command.add("Job created from Apache Camel code at " + (new Date()));
    		container.setCommand(command);
    		List<Container> containers = new ArrayList<Container>();
    		containers.add(container);
    		return containers;
    	}
    }
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.