Java k8s 通过YAML配置文件映射的方式创建Job,Job的优点是执行完可以自动删除,可以启动多份等,具体代码如下,可以把固定数据在配置文件中设置,变量在java映射成对象后动态赋值。

@Slf4j
@Service
public class K8sClientImpl implements K8sClient {

    @Override
    public void createJob(String no,String imageNameWithTag,Integer datasetId) throws IOException, ApiException {
        //job名称和标签名称
        String jobName = "prec-job-" + no;
        //容器名称
        String containerName = "prec-container-" + no;
        //挂载路径
        String datasetPath = "/nfs/shared/filepath/" + datasetId;

        //获取客户端
        ApiClient client = Config.defaultClient();
        Configuration.setDefaultApiClient(client);

        //指定分类
        Yaml.addModelMap("batch/v1", "Job", V1Job.class);

        //加载配置文件
        File file = ResourceUtils.getFile("classpath:Job.yaml");

        //对象映射
        V1Job v1Job = (V1Job) Yaml.load(file);

        //设置metadata
        V1ObjectMeta metadata = v1Job.getMetadata();
        metadata.setName(jobName);
        Map<String, String> labels = new HashMap<>();
        labels.put("app",jobName);
        metadata.setLabels(labels);
        v1Job.setMetadata(metadata);

        //v1JobSpec
        V1JobSpec v1JobSpec = v1Job.getSpec();

        //template
        V1PodTemplateSpec template = v1JobSpec.getTemplate();
        V1PodSpec spec = template.getSpec();

        //containers
        List<V1Container> containers = spec.getContainers();
        V1Container v1Container = spec.getContainers().get(0);
        v1Container.setName(containerName);
        v1Container.setImage(imageNameWithTag);

        //ENV
        List<V1EnvVar> env = new ArrayList<>();
        V1EnvVar v1EnvVar1 = new V1EnvVar();
        v1EnvVar1.setName("ENV_DATASET");
        v1EnvVar1.setValue("/dataset");
        env.add(v1EnvVar1);
        V1EnvVar v1EnvVar2 = new V1EnvVar();
        v1EnvVar2.setName("ENV_NO");
        v1EnvVar2.setValue(no);
        env.add(v1EnvVar2);
        v1Container.setEnv(env);
        spec.setContainers(containers);

        //本地挂载目录
        List<V1Volume> volumes = new ArrayList<>();
        V1Volume volume = new V1Volume();
        volume.setName("volume-filepath-dir");
        V1HostPathVolumeSource hostPath = new V1HostPathVolumeSource();
        hostPath.setPath(datasetPath);
        volume.setHostPath(hostPath);
        volumes.add(volume);
        spec.setVolumes(volumes);
        template.setSpec(spec);

        //template
        v1JobSpec.setTemplate(template);
        //spec
        v1Job.setSpec(v1JobSpec);

        //创建Job
        BatchV1Api batchV1Api = new BatchV1Api();
        V1Job job = batchV1Api.createNamespacedJob("default", v1Job, "false", null, null);

        log.info("V1Job执行完成的格式:{}",Yaml.dump(job));
    }
}

Job.yaml配置文件内容:

apiVersion: batch/v1
kind: Job
metadata:
  name: prec-job
  namespace: default
  labels:
    app: prec-demo1
spec:
  # 成功运行Pods的次数。默认值: 1
  # completions: 1
  # 并发运行Pods的数量。默认值: 1
  # parallelism: 1

  # 失败重试次数。默认值:6次。
  backoffLimit: 0

  # Pod多少秒就停止,Pod运行的超时时间
  # activeDeadlineSeconds: 0

  # 任务执行完,多少秒自动删除。 开启需要修改:/etc/kubernetes/manifests下kube-controller-manager.yaml、kube-apiserver.yaml]增加Command[- --feature-gates=TTLAfterFinished=true]
  ttlSecondsAfterFinished: 86400 #默认300

  # 自动选择一个选择器
  # manualSelector: true

  # selector:
  #   matchLabels:
  #     app: prec-demo2

  template:
    # metadata:
    #   labels:
    #     app: prec-demo2
    spec:
      containers:
      - name: prec-container
        image: 192.168.1.100:7005/prec/myImage:latest

        # 每次Pod启动拉取镜像策略,默认值:IfNotPresent。Always总是拉取;Never从不拉取;IfNotPresent本地有不拉取,本地没有才拉取
        imagePullPolicy: Always

        # 将该Pod调度到包含这个label的node上
        # nodeSelector: object

        # 容器启动命令,如不指定使用打包时使用的启动命令
        # command: 

        # 容器的启动命令参数列表
        # args: [string]

        # 容器的工作目录,进入容器的根目录
        # workingDir: /home

        # 环境变量
        env:
          # 数据集路径
        - name: ENV_DATASET
          value: "/filepath"
          # 编号
        - name: ENV_NO
          value: "2020072800000"
        # 结果存放位置
        - name: ENV_RESULT
          value: "/result"
        
        # 挂载到容器内部的存储卷配置
        volumeMounts:
          # 挂载数据集路径
        - name: volume-filepath-dir
          mountPath: /filepath
          readOnly: true

        resources:
          # 容器最大资源、限制设置,cpu单位为core数,将用于docker run --cpu-shares参数,memory单位可以为Mib/Gib,将用于docker run --memory参数
          limits:
            cpu: 1000m
            memory: 1000Mi

          # 容器最小资源、初始化资源
          requests:
            cpu: 100m
            memory: 100Mi


      # Pod重启策略:Job只能为OnFailure/Never
      restartPolicy: Never

      # 是否使用宿主机网络
      hostNetwork: false

      # 镜像仓库拉取所需秘钥名称
      imagePullSecrets:
      - name: prec-java-registry

      # 在该pod上定义共享存储卷列表
      volumes:
      # 挂载指定路径
      - name: volume-filepath-dir
        hostPath: 
          path: /nfs/shared/filepath/1000

创建完成通过命令查看:kubectl get pods -o wide --all-namespaces
job创建成功了
在这里插入图片描述

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐