本文给出Python SDK操作Kubernetes Job的更多示例代码,以及相关解释。

pip install kubernetes

初始化

from kubernetes.client import BatchV1Api

from kubernetes.config import load_kube_config

load_kube_config()

batch = BatchV1Api()

load_kube_config 是从默认位置,也就是 ~/.kube/config 加载配置。如果在其它位置,可以通过第一个参数传入其路径。

BatchV1Api() 可以当做Job的客户端来用。命名上,Batch和Job是类似的概念,前者强调批量。

创建Job

以下来自官方样例job_crud.py。

def create_job_object():

container = client.V1Container(

name="pi",

image="perl",

command=["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"])

template = client.V1PodTemplateSpec(

metadata=client.V1ObjectMeta(labels={"app": "pi"}),

spec=client.V1PodSpec(restart_policy="Never", containers=[container]))

spec = client.V1JobSpec(

template=template,

backoff_limit=4)

job = client.V1Job(

api_version="batch/v1",

kind="Job",

metadata=client.V1ObjectMeta(name=JOB_NAME),

spec=spec)

return job

def create_job(api_instance, job):

api_response = api_instance.create_namespaced_job(

body=job,

namespace="default")

print("Job created. status='%s'" % str(api_response.status))

虽然,根据官方教程这样的写法,也能得到可用的 V1Job ,拿去执行创建操作。但还是过于陌生和偏门,不如主流、常见的YAML方便、易读写。

这里该出两种更方便的做法。

直接使用YAML

---

apiVersion: batch/v1

kind: Job

metadata:

name: hello

spec:

template:

spec:

containers:

- name: echo

image: alpine:3.11

args:

- 'echo'

- 'Hello world!'

以上是一个最精简的Job配置样例,

通过读取文件为dict,可以直接拿去使用。

from kubernetes.client import V1Job

import yaml

with open('job.yaml') as file:

cfg = yaml.safe_load(file)

job = batch.create_namespaced_job(namespace='default', body=cfg)

assert isinstance(job, V1Job)

create_namespaced_job 同样接受字典作为body输入,因此YAML配置可以读出后直接传入。

这里返回的 V1Job 只是创建时的状态,但是会包含更多集群中的信息。

使用dict

由于 create_namespaced_job 接受字典作为 body 输入,因此直接使用 dict 也是可行的。

cfg = {

'apiVersion': 'batch/v1',

'kind': 'Job',

'metadata': {

'name': 'hello'

},

'spec': {

'template': {

'spec': {

'restartPolicy':

'Never',

'containers': [{

'name': 'upload',

'image': 'alpine:3.11',

'args': ['echo', 'Hello world!']

}]

}

}

}

}

batch.create_namespaced_job(namespace='default', body=cfg)

由于 dict 结构与YAML相同,而又没有类的束缚,所以也很灵活方便。

此外,从YAML读出为 dict 后,也可以通过修改部分字段,达到动态变化的效果。这种结合YAML和dict的使用方式,是对官方用法的最佳替代。

监控Job运行

在创建Job后,通常需要监控Job的运行,做一些外围处理。轮询当然是下下策,而Kubernetes提供了一个 Watch 机制,通过接收Event,实现对状态变化的掌控。Event只有在状态变化时才会有,所以是非常理想的回调。

from kubernetes.client import V1Job

from kubernetes.watch import Watch

job_name = 'hello'

watcher = Watch()

for event in watcher.stream(

batch.list_namespaced_job,

namespace='default',

label_selector=f'job-name={job_name}',

):

assert isinstance(event, dict)

job = event['object']

assert isinstance(job, V1Job)

Watch().stream 就是前面说的理想回调,它第一个参数是列出类的函数,这里选择 list_namespaced_job 。后面的参数,都是 list_namespaced_job 的参数。除了必备的namespace以外, label_selector也 是一个常用参数,可以避免关注无关的Job。每个Job在创建后,都会自动带一个 f'job-name={job_name}' 的Label,可以借此筛选。 job_name 就是 metadata 里设置的 name ,如这里 job-name=hello 。

event是一个dict,只有三个值。其中 event['raw_object'] 只是 event['object'] 的 dict 形式,没有太大意义。 event['type'] 常见三个值,对应增删改。

ADDED ,创建时的信息,和

create_namespaced_job 的返回值通常没有区别。

MODIFIED ,Job状态变化时的信息。

DELETED ,Job删除时的信息。

以上三个状态值,对其它类型的资源也是通用的,比如Pod、Deployment等。

V1Job的使用

对于具体的 V1Job 实例,其它字段都是和创建时的配置差不多的,只是多一些集群中的具体信息。所以,常用的还是.status字段。

>>> from kubernetes.client import V1JobStatus

>>> isinstance(job.status, V1JobStatus)

True

>>> print(job.status)

{'active': None,

'completion_time': datetime.datetime(2020, 8, 10, 9, 49, 38, tzinfo=tzutc()),

'conditions': [{'last_probe_time': datetime.datetime(2020, 8, 10, 9, 49, 38, tzinfo=tzutc()),

'last_transition_time': datetime.datetime(2020, 8, 10, 9, 49, 38, tzinfo=tzutc()),

'message': None,

'reason': None,

'status': 'True',

'type': 'Complete'}],

'failed': None,

'start_time': datetime.datetime(2020, 8, 10, 9, 49, 32, tzinfo=tzutc()),

'succeeded': 1}

直接使用 job.status.succeeded ,可以得到成功的Container数量。下面几乎每一级都有特定的类,可以连续使用.操作符。如果有特殊需要,也可以用 job.to_dict() 转换成字典来用。

其它字段,作用基本上也和名称相关,不难推测。

列出Job

列出所有Job的 list_job_for_all_namespaces 不常用,一般只列出指定Namespace的Job。

from kubernetes.client import V1JobList, V1Job

job_list = batch.list_namespaced_job(namespace='default')

assert isinstance(job_list, V1JobList)

assert isinstance(job_list.items, list)

for job in job_list.items:

assert isinstance(job, V1Job)

与监控的示例相比,这里去掉了 label_selector ,可以获取Namespace中所有的Job。如果有需要,可以通过自定义Label把所有Job分类,并使用l abel_selector 获取指定类型的Job。

读取Job

如果知道Job的 name ,可以直接通过 read_* 系列接口,获得指定的 V1Job 。

from kubernetes.client import V1Job

job = batch.read_namespaced_job(name='hello', namespace='default')

assert isinstance(job, V1Job)

如果更看重状态,可以改用 read_namespaced_job_status 。虽然访问的API不同,但在Python的 V1Job 这个结果层面,没有本质差异。

列出一个Job的Pod

Pod是Kubernetes调度的最小单元,也是最常用的一种资源。

from typing import List

from kubernetes.client import CoreV1Api, V1Pod

def get_pods_by(job_name: str) -> List[V1Pod]:

core = CoreV1Api()

pods = core.list_namespaced_pod(

namespace='default',

label_selector=f'job-name={job_name}',

limit=1,

)

return pods.items

这里的 get_pods_by ,可以用 job_name 获取对应的Pod。 limit=1 是在已知Pod只有一个的情况下做出的优化,可按需调整或去掉。

删除Job

删除一个Job:

from kubernetes.client import V1Status

status = batch.delete_namespaced_job(

namespace='default',

name=job_name,

propagation_policy='Background',

)

assert isinstance(status, V1Status)

其中, propagation_policy='Background' 是不可省略的关键,否则默认是 Orphan ,其Pod不会被删除。这属于API设计的一个失误,与 kubectl 的默认行为不符合。而且,应该没有人在删除了Job之后,还要保留Pod的吧。这里也可以选择 'Foreground' ,阻塞等待相关资源的删除完毕。

删除多个、或所有Job:

status = batch.delete_collection_namespaced_job(

namespace='default',

propagation_policy='Background',

label_selector='some-label=your-value',

)

assert isinstance(status, V1Status)

如果没有 label_selector ,那就是删除一个 Namespace 中的所有Job。

更新Job

这个比较少用,因为一般都是建新的。用法其实和 create_namespaced_job 差不多,参考官方样例即可。

def update_job(api_instance, job):

job.spec.template.spec.containers[0].image = "perl"

api_response = api_instance.patch_namespaced_job(

name=JOB_NAME,

namespace="default",

body=job)

print("Job updated. status='%s'" % str(api_response.status))

总结

用Python操作Kubernetes的Job,总体上还是比较方便的,虽然有一些坑。

作者: 匿蟒

原文链接:https://note.qidong.name/2020/08/python-k8s-job/

抓狐狸python_​用Python操作Kubernetes的Job相关推荐

  1. job for nginx.service failed_用Python操作Kubernetes的Job

    关于Kubernetes的Python SDK,几乎只有官方项目的examples.关于Job的基本增删改查操作,可以参考job_crud.py.但是,这只是基本用法,缺乏一些实用细节. 本文给出Py ...

  2. redis实例python_使用python操作redis(管道)

    一.redis连接 redis提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令,Redis是StrictRe ...

  3. Python编写人机对战小游戏(抓狐狸)(2)

    封面图片:<中学生可以这样学Python>,董付国.应根球著,清华大学出版社 =========== 很久很久以前,在公众号里推送过一个抓狐狸游戏,详见Python编写人机对战小游戏(抓小 ...

  4. Python实现抓狐狸小游戏

    Python实现抓狐狸小游戏 要求:实现抓狐狸游戏.假设墙上有5个洞(编号分别为0.1.2.3.4),其中一个洞里有狐狸,人类玩家输入洞口编号,如果都里有狐狸就抓到了:如果洞里没有狐狸就第二天抓. 但 ...

  5. Catch fox game 抓狐狸Python代码实现

    Catch fox game 抓狐狸Python代码实现 实验描述 Write a program to simulate a fox catching game. Suppose there are ...

  6. pptx库ppt演示 python_详解 Python 操作 PPT 的各种骚操作!

    1.python-pptx模块简介 使用python操作PPT,需要使用的模块就是python-pptx,下面来对该模块做一个简单的介绍. 这里提前做一个说明:python操作PPT,最好是我们提前设 ...

  7. python——模拟抓狐狸的小游戏

    模拟抓狐狸的小游戏 假设一共有一排5个洞口,小狐狸最开始的时候在其中一个洞口,然后人随机打开一个洞口,如果里面有小狐狸就抓到了.如果洞口里没有小狐狸就明天再来抓,但是第二天小狐狸会在有人来抓之前跳到隔 ...

  8. Python抓狐狸游戏

    要求:实现抓狐狸游戏.假设墙上有5个洞(编号分别为0.1.2.3.4),其中一个洞里有狐狸,人类玩家输入洞口编号,如果都里有狐狸就抓到了:如果洞里没有狐狸就第二天抓.但在第二天人类玩家来抓之前,狐狸会 ...

  9. Python 实验一 抓狐狸小游戏 查找Word中加粗和红色文本

    (1)编写程序,模拟抓狐狸小游戏.假设一共有一排 5 个洞口,狐狸最开始的时候在其中一个洞口,然后玩家随机打开一个洞口,如果里面有狐狸就抓到了,如果洞口里没有狐狸就第二天再来抓,但是第二天狐狸会在玩家 ...

最新文章

  1. linq where 数组_C#中LINQ与数据管道
  2. SHELL脚本 基础一
  3. C#--动态操作DataTable
  4. 怎么把一个结构体的数据包通过串口发送出去?
  5. PHP不及格标红,php语言编写switch判断成绩代码。分别输出优秀、良好、中等、及格和不及格。...
  6. ACL 2020 | 多编码器是否能够捕获篇章级信息?
  7. mysql 导出dmp文件_MySQL数据库基础讲解
  8. 浪潮as5300技术方案_浪潮智能存储AS5300G2双活解决方案
  9. 论文浅尝 | AAAI2020 - 基于生成对抗的知识图谱零样本关系学习
  10. 在VC中如何将float型转换成字符数组
  11. ApiPost自动化测试基础之:接口参数依赖的情景处理...
  12. pr视频剪辑中工具栏功能详解
  13. 用python画皇冠_GitHub - crown-prince/Python_PoC: 一款python编写的Web安全检测PoCEXP框架...
  14. B2C商家怎样在有限的预算下展开营销
  15. redis与ssm整合(mybatis二级缓存)单机版
  16. oracle dbf 超大,system01.dbf文件过大——SYSTEM表空间AUD$使用空间过大问题处理
  17. RIPS-0.55 对securing fuction的检查方法
  18. 【源码】Set集合源码剖析
  19. java 复数_java 中实现复数的加减
  20. MINIO使用说明(附文件上传下载)

热门文章

  1. svchost占用内存过高_是什么导致你的Java服务器内存和CPU占用过高呢
  2. 记录用户转成超级用户的文件名字_一分钟了解Linux用户
  3. hadoop jar包_【大数据学习】Hadoop的MR分布式开发小实战
  4. C++ auto_ptr存在的问题
  5. C++学习之路 | PTA乙级—— 1058 选择题 (20 分)(精简)
  6. CMU本科计算机科学,CMU计算机科学学院本科难录吗?
  7. mongodb 索引详解
  8. springboot 技术图谱_java后台(Springboot)开发知识图谱高频技术汇总-学习路线...
  9. cifs挂载 mount ubuntu_centos或者Ubuntu挂载windows10文件夹
  10. ssm后台数据是为什么是空值_网易后台开发实习生面试总结