Java k8s 创建Job
Java k8s 通过YAML配置文件映射的方式创建Job,Job的优点是执行完可以自动删除,可以启动多份等,具体代码如下,可以把固定数据在配置文件中设置,变量在java映射成对象后动态赋值。@Slf4j@Servicepublic class K8sClientImpl implements K8sClient {@Overridepublic void createJob(String no,
·
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创建成功了
更多推荐
已为社区贡献3条内容
所有评论(0)