74.7. Kubernetes 任务生成示例


  • 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 集群上创建一个作业。

示例(如需更多信息,请参阅 创建作业示例

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.