job for nginx.service failed_用Python操作Kubernetes的Job
关于Kubernetes的Python SDK,几乎只有官方项目的examples。关于Job的基本增删改查操作,可以参考job_crud.py。但是,这只是基本用法,缺乏一些实用细节。
本文给出Python SDK操作Kubernetes Job的更多示例代码,以及相关解释。
pip install kubernetes
初始化
from kubernetes.client import BatchV1Apifrom 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/v1kind: Jobmetadata: name: hellospec: template: spec: containers: - name: echo image: alpine:3.11 args: - 'echo' - 'Hello world!'
以上是一个最精简的Job配置样例,
通过读取文件为dict,可以直接拿去使用。
from kubernetes.client import V1Jobimport 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 V1Jobfrom 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分类,并使用label_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/
作者:匿蟒
prometheus被称为下一代监控神器。微服务时代,prometheus可以在频繁更新扩容时做到无缝监控,使监控系统部署更加简单,易于维护!锁定25日晚20:00,一节课带你走进prometheus,干货满满!
job for nginx.service failed_用Python操作Kubernetes的Job相关推荐
- 抓狐狸python_用Python操作Kubernetes的Job
本文给出Python SDK操作Kubernetes Job的更多示例代码,以及相关解释. pip install kubernetes 初始化 from kubernetes.client impo ...
- Java api 操作 kubernetes
文章目录 Java api 操作 kubernetes 一.api接口访问方式 授权方式 不授权方式 二.Java api 操作 k8s k8s初始化 创建命名空间 创建Deployment应用 创建 ...
- Ubuntu+Django+Nginx+uWSGI+Mysql搭建Python Web服务器
Ubuntu+Django+Nginx+uWSGI+Mysql搭建Python Web服务器 闲着无聊的时候部署了一个Django项目玩,用vm虚拟机部署的. 准备工作 我使用的系统是Ubuntu16 ...
- Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy
Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度 ...
- python操作RabbitMQ
RabbitMQ介绍 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue)的开源实现的产品,RabbitMQ是一个消息代理,从"生产者" ...
- Windows下安装Redis及使用Python操作Redis的方法
这篇文章主要介绍了Windows下安装Redis及使用Python操作Redis的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下 首先说一下在Windows下安装Redis,安装包可以在htt ...
- python django mysql安装_Django+Nginx+uWSGI+Mysql搭建Python Web服务器
原标题:Django+Nginx+uWSGI+Mysql搭建Python Web服务器 安装的时候全部选择英文,记得以前选择中文的时候安装时出了问题,服务器组件一个不选,Ubuntu安装做的很贴心,基 ...
- Python操作Redis中的hash
Redis 数据库hash数据类型是一个string类型的key和value的映射表,适用于存储对象.Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿). Python的re ...
- Python操作Redis:键(Key)
Python操作Redis:键(Key) Python的redis模块管理键(Key)方法主要实现的Redis命令包括KEYS.GET.DEL(delete).EXISTS.RANDOMKEY,TYP ...
最新文章
- YII显示sql进行调试
- 【转】接口测试Session/Cookie笔记(二)
- 为什么 RestTemplate 那么棒,看这篇就够了!
- 开源大数据周刊-第15期
- Go——从文件路径解析解析GAVC坐标解决方案
- nginx介绍(三) - 虚拟主机
- oracleDBA-D1
- RocketMQ源码解析-Broker的HA实现
- C++ Vector详解
- 贺利坚老师汇编课程49笔记:call和ret
- C#轻量级日志监控器EasyLogMonitor
- 整理:几款好用的Markdown编辑器
- vs 2005 sp1 安装失败的解决方案 安装VS2005 sp1的方法
- OpenCV图像处理之直方图
- 显示器知识:分辨率1080P、2K、4K、8K相关知识介绍,看完你就懂了!
- wordpress footer.php,wordpress的get_footer( )函数功能详解
- Vivo Android9.0 精简内置应用列表
- 写代码时切换insert键,用来解决光标小黑块问题
- 用python对股票期货做时序分析
- 浅谈yolov4中的一部分数据增强
热门文章
- PyTorch核心贡献者开源书:《使用PyTorch进行深度学习》完整版现已发布!
- 如何用数学追到完美情人?
- 微盟创始人孙涛勇回应员工删库;字节跳动推“头条搜索”独立 App;C++ 20 规范完成| 极客头条...
- 李子柒爆红:既然做直播能年薪过亿, 为何还要努力高考?
- ServiceMesh有关sidecar理解
- 显示股票信息页面的开发
- Linux期末复习题库(1)
- 技术19期:1分钟入门数据治理!必看!【技术篇】
- 收藏 |《动手学深度学习》中文版PDF
- 使用傅里叶变换进行图像边缘检测