0
点赞
收藏
分享

微信扫一扫

【K8S系列】深入解析Job

醉东枫 2023-05-10 阅读 55

序言

 专栏介绍

序号文章
第一讲深入解析 k8s:入门指南(一)
第二讲深入解析 k8s:入门指南(二)
第三讲深入解析Pod对象(一)
第四讲深入解析Pod对象(二)
第五讲深入解析无状态服务
第六讲深入解析有状态服务
第七讲深入解析控制器

第八讲

深入解析 ReplicaSet
第九讲深入解析滚动升级
第十讲深入解析StatefulSet(一)
第十一讲深入解析StatefulSet(二)
第十二讲深入解析DaemonSet

1 基础介绍

1.1 概念介绍

1.2 Job 的类型

1 单次 Job

单次: 

 并发示意图:

2 CronJob

2 原理介绍

2.1 单次 Job实现原理

2.2 CronJob 的实现原理

3单次job使用案例

3.1 创建一个容器镜像

Dockerfile示例:

FROM ubuntu:latest

RUN apt-get update && apt-get install -y python3 python3-pip

COPY requirements.txt /app/
RUN pip3 install --no-cache-dir -r /app/requirements.txt

COPY main.py /app/

CMD ["python3", "/app/main.py"]

3.2 创建一个k8s Job

from kubernetes import client, config

# 加载k8s集群配置
config.load_kube_config()

# 创建k8s API客户端
api_client = client.BatchV1Api()

# 定义Job对象
job_name = "my-job"
job_namespace = "default"

job = client.V1Job()
job.metadata = client.V1ObjectMeta(name=job_name, namespace=job_namespace)

# 定义Job的Pod模板
pod_template = client.V1PodTemplateSpec()
pod_template.metadata = client.V1ObjectMeta(labels={"app": job_name})
container = client.V1Container(name="my-container", image="my-image:latest")
pod_template.spec = client.V1PodSpec(containers=[container])

# 定义Job的规范
job.spec = client.V1JobSpec(template=pod_template, backoff_limit=0, ttl_seconds_after_finished=600)

# 创建Job
api_client.create_namespaced_job(namespace=job_namespace, body=job)

3.3 查看Job的状态

kubectl命令行示例:

$ kubectl get jobs
NAME      COMPLETIONS   DURATION   AGE
my-job    1/1           1s         5m

Python代码示例:

from kubernetes import client, config

# 加载k8s集群配置
config.load_kube_config()

# 创建k8s API客户端
api_client = client.BatchV1Api()

# 获取Job状态
job_name = "my-job"
job_namespace = "default"
job = api_client.read_namespaced_job(name=job_name, namespace=job_namespace)
status = job.status

if status.succeeded == 1:
    print("Job completed successfully!")
else:
    print("Job failed or is still running.")

3.4 小结:

4 CronJob

4.1 Python代码实现

1 创建一个容器镜像

Dockerfile示例:

FROM ubuntu:latest

RUN apt-get update && apt-get install -y python3 python3-pip

COPY requirements.txt /app/
RUN pip3 install --no-cache-dir -r /app/requirements.txt

COPY main.py /app/

CMD ["python3", "/app/main.py"]

2 创建k8s CronJob

from kubernetes import client, config

# 加载k8s集群配置
config.load_kube_config()

# 创建k8s API客户端
api_client = client.BatchV1beta1Api()

# 定义CronJob对象
cron_job_name = "my-cronjob"
cron_job_namespace = "default"

cron_job = client.V1beta1CronJob()
cron_job.metadata = client.V1ObjectMeta(name=cron_job_name, namespace=cron_job_namespace)

# 定义CronJob的Pod模板
pod_template = client.V1PodTemplateSpec()
pod_template.metadata = client.V1ObjectMeta(labels={"app": cron_job_name})
container = client.V1Container(name="my-container", image="my-image:latest")
pod_template.spec = client.V1PodSpec(containers=[container])

# 定义CronJob的规范
cron_spec = client.V1beta1CronJobSpec(schedule="0 * * * *", job_template=client.V1beta1JobTemplateSpec(spec=pod_template))
cron_job.spec = cron_spec

# 创建CronJob
api_client.create_namespaced_cron_job(namespace=cron_job_namespace, body=cron_job)

3 查看CronJob的状态

kubectl命令行示例:

$ kubectl get cronjobs
NAME         SCHEDULE    SUSPEND   ACTIVE   LAST SCHEDULE   AGE
my-cronjob   0 * * * *   False     0        <none>          1h

Python Kubernetes客户端API示例:

from kubernetes import client, config

# 加载k8s集群配置
config.load_kube_config()

# 创建k8s API客户端
api_client = client.BatchV1beta1Api()

# 获取CronJob状态
cron_job_name = "my-cronjob"
cron_job_namespace = "default"
cron_job = api_client.read_namespaced_cron_job(name=cron_job_name, namespace=cron_job_namespace)
print(cron_job.status)

4 小结:

4.2 yaml配置实现

1 创建一个k8s CronJob

apiVersion: batch/v1beta1
kind: CronJob #资源类型
metadata:
  name: my-cronjob
spec:
  schedule: "0 * * * *"
  jobTemplate:
    spec:
      template:
        metadata:
          labels:
            app: my-cronjob
        spec:
          containers:
          - name: my-container
            image: my-image:latest
            imagePullPolicy: Always
          restartPolicy: OnFailure

2 应用CronJob配置

kubectl命令行示例:

$ kubectl apply -f my-cronjob.yaml

Python Kubernetes客户端API示例:

from kubernetes import client, config, utils

# 加载k8s集群配置
config.load_kube_config()

# 应用yaml文件
utils.create_from_yaml(client.BatchV1beta1Api(), "my-cronjob.yaml")

3 查看CronJob的状态

kubectl命令行示例:

$ kubectl get cronjobs
NAME         SCHEDULE    SUSPEND   ACTIVE   LAST SCHEDULE   AGE
my-cronjob   0 * * * *   False     0        <none>          1m

Python Kubernetes客户端API示例:

from kubernetes import client, config

# 加载k8s集群配置
config.load_kube_config()

# 获取CronJob列表
api_instance = client.BatchV1beta1Api()
cronjobs = api_instance.list_namespaced_cron_job(namespace="default")
for cj in cronjobs.items:
    print(f"{cj.metadata.name}: {cj.status.active}")

4 小结

5 总结

5.1 单次Job

5.2 定期CronJob

6 投票

 

 

举报

相关推荐

0 条评论