如何使用Kubernetes Python客户端

1,821 阅读2分钟

读者朋友们好!在这篇文章中,我们将看到如何使用Kubernetes Python客户端创建一个作业。我们都知道,我们使用kubectl命令来创建、列出、更新和删除Kubernetes资源。

什么是K8s Python客户端?

要使用Kubernetes Rest API编写应用程序,你不需要自己实现API调用和请求/响应类型。你可以使用你所使用的编程语言的客户端库。客户端库通常为你处理常见的任务,如认证。

先决条件

在我们继续使用K8s python客户端创建作业之前,我们需要遵循一些先决条件。

Kubernetes库为我们提供了客户端和配置等模块,我们将在这里使用这些模块。所以,让我们来安装Kubernetes Python客户端。

pip3 install kubernetes

在我的例子中,我已经安装了它,这就是为什么它显示我们已经满足。

现在,我们已经安装了python-Kubernetes包。

创建一个作业:

现在,我将创建一个目录,在这个目录中,我将创建一个名为job.py的文件。

mkdir k8s

cd k8s

touch job.py

我的job.py文件包含以下代码,用于使用Kubernetes Python客户端创建一个作业。现在我们已经安装了Python-Kubernetes包,我们可以导入它。

from kubernetes import client, config

在这段代码中,我创建了几个函数,第一个是create_service( ),第二个是create_job_object( ),第三个是create_job( )。我在我的默认命名空间中创建这个工作,如果你想,你也可以使用其他的命名空间。

from os import path
from time import sleep

import yaml

from kubernetes import client, config

JOB_NAME = "pi"


def create_job_object():
    # Configureate Pod template container
    container = client.V1Container(
        name="pi",
        image="perl",
        command=["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"])
    # Create and configure a spec section
    template = client.V1PodTemplateSpec(
        metadata=client.V1ObjectMeta(labels={"app": "pi"}),
        spec=client.V1PodSpec(restart_policy="Never", containers=[container]))
    # Create the specification of deployment
    spec = client.V1JobSpec(
        template=template,
        backoff_limit=4)
    # Instantiate the job object
    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))



def main():
    config.load_kube_config()
    batch_v1 = client.BatchV1Api()
    job = create_job_object()

    create_job(batch_v1, job)


if __name__ == '__main__':
    main()

现在,是时候创建这个工作了。所以,我现在将运行python代码。

$ python3 job.py

正如你在这里看到的,我的工作已经成功创建。

更新作业:

为了更新这个作业,我将创建一个名为update.py的文件。在这个文件中,我将更新这里的容器图像。我的文件包含以下代码来更新作业。

from os import path
from time import sleep

import yaml

from kubernetes import client, config

JOB_NAME = "pi"


def create_job_object():
    # Configureate Pod template container
    container = client.V1Container(
        name="pi",
        image="perl",
        command=["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"])
    # Create and configure a spec section
    template = client.V1PodTemplateSpec(
        metadata=client.V1ObjectMeta(labels={"app": "pi"}),
        spec=client.V1PodSpec(restart_policy="Never", containers=[container]))
    # Create the specification of deployment
    spec = client.V1JobSpec(
        template=template,
        backoff_limit=4)
    # Instantiate the job object
    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))
    get_job_status(api_instance)

def get_job_status(api_instance):
    job_completed = False
    while not job_completed:
        api_response = api_instance.read_namespaced_job_status(
            name=JOB_NAME,
            namespace="default")
        if api_response.status.succeeded is not None or \
                api_response.status.failed is not None:
            job_completed = True
        sleep(1)
        print("Job status='%s'" % str(api_response.status))


def update_job(api_instance, job):
    # Update container image
    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))

def main():
    config.load_kube_config()
    batch_v1 = client.BatchV1Api()
    job = create_job_object()

    create_job(batch_v1, job)

    update_job(batch_v1, job)


if __name__ == '__main__':
    main()

在这段代码中,我使用了 update_job( ) 函数来更新这个作业。在这个函数中,我正在更新容器图像。现在,我将运行更新的代码。

$ python3 update.py

所以,我们现在已经成功完成了。这就是我们如何使用Kubernetes Python客户端的方法。