如何使用Kubernetes Python Client创建Statefulsets工作负载?

401 阅读2分钟

目录

阅读时间: 3 分钟

读者朋友们,大家好在这篇博客中,我们将看到如何使用kubernetes python客户端创建一个Statefulsets。Kubectl是通过命令行处理和管理集群的主要工具。

通过kubectl ,你可以看到各个节点的状态,这些节点上的pods,策略以及更多的东西。但在这篇博客中,我们将看到如何使用python来做这些事情的资源。

先决条件

在你的系统中安装Kubernetes

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

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

pip3 install kubernetes

statefulsetstatefulset

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

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

所以,让我们开始吧

第一步。创建Statefulsets。

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

mkdir kubernetes

cd kubernetes

touch statefulset.py

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

from kubernetes import client, config

在这段代码中,我创建了几个函数,第一个是create_service( ),第二个是create_stateful_set_object( ),第三个是create_stateful_set( )。我是在我的默认命名空间中创建这些状态集的,如果你想的话,你也可以使用其他的命名空间。

from kubernetes import client, config


def create_service(core_v1_api):
    body = client.V1Service(
        api_version="v1",
        kind="Service",
        metadata=client.V1ObjectMeta(
            name="redis-test-svc"
        ),
        spec=client.V1ServiceSpec(
            selector={"app": "redis"},
            cluster_ip="None",
            type="ClusterIP",
            ports=[client.V1ServicePort(
                port=6379,
                target_port=6379
            )]
        )
    )
    # Create the service in specified namespace
    # (Can replace "default" with a namespace you may have created)
    core_v1_api.create_namespaced_service(namespace="default", body=body)


def create_stateful_set_object():
    container = client.V1Container(
        name="sts-redis",
        image="redis",
        image_pull_policy="IfNotPresent",
        ports=[client.V1ContainerPort(container_port=6379)],
    )
    # Template
    template = client.V1PodTemplateSpec(
        metadata=client.V1ObjectMeta(labels={"app": "redis"}),
        spec=client.V1PodSpec(containers=[container]))
    # Spec
    spec = client.V1StatefulSetSpec(
        replicas=1,
        service_name="redis-test-svc",
        selector=client.V1LabelSelector(
            match_labels={"app": "redis"}
        ),
        template=template)
    # StatefulSet
    statefulset = client.V1StatefulSet(
        api_version="apps/v1",
        kind="StatefulSet",
        metadata=client.V1ObjectMeta(name="statefulset-redis"),
        spec=spec)

    return statefulset


def create_stateful_set(apps_v1_api, stateful_set_object):
    # Create the Statefulset in default namespace
    # You can replace the namespace with you have created
    apps_v1_api.create_namespaced_stateful_set(
        namespace="default", body=stateful_set_object
    )

def main():
    # Loading the local kubeconfig
    config.load_kube_config()
    apps_v1_api = client.AppsV1Api()
    core_v1_api = client.CoreV1Api()
    stateful_set_obj = create_stateful_set_object()

    create_service(core_v1_api)

    create_stateful_set(apps_v1_api, stateful_set_obj)

if __name__ == "__main__":
    main()

现在,是时候创建statefulsets了。所以,我现在将运行python代码。

$ python3 statefulset.py

正如你所看到的,我的statefulset已经成功创建。

第二步。更新状态集。

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

from kubernetes import client, config


def create_stateful_set_object():
    container = client.V1Container(
        name="sts-redis",
        image="redis",
        image_pull_policy="IfNotPresent",
        ports=[client.V1ContainerPort(container_port=6379)],
    )
    # Template
    template = client.V1PodTemplateSpec(
        metadata=client.V1ObjectMeta(labels={"app": "redis"}),
        spec=client.V1PodSpec(containers=[container]))
    # Spec
    spec = client.V1StatefulSetSpec(
        replicas=1,
        service_name="redis-test-svc",
        selector=client.V1LabelSelector(
            match_labels={"app": "redis"}
        ),
        template=template)
    # StatefulSet
    statefulset = client.V1StatefulSet(
        api_version="apps/v1",
        kind="StatefulSet",
        metadata=client.V1ObjectMeta(name="statefulset-redis"),
        spec=spec)

    return statefulset


def create_stateful_set(apps_v1_api, stateful_set_object):
    # Create the Statefulset in default namespace
    # You can replace the namespace with you have created
    apps_v1_api.create_namespaced_stateful_set(
        namespace="default", body=stateful_set_object
    )



def update_stateful_set(apps_v1_api, statefulset):
    # Update container image
    statefulset.spec.template.spec.containers[0].image = "redis:6.2"
    statefulset_name = statefulset.metadata.name
    # Patch the statefulset
    apps_v1_api.patch_namespaced_stateful_set(
        name=statefulset_name, namespace="default", body=statefulset
    )



def main():
    # Loading the local kubeconfig
    config.load_kube_config()
    apps_v1_api = client.AppsV1Api()
    core_v1_api = client.CoreV1Api()
    stateful_set_obj = create_stateful_set_object()
    create_stateful_set(apps_v1_api, stateful_set_obj)

    update_stateful_set(apps_v1_api, stateful_set_obj)


if __name__ == "__main__":
    main()


在这段代码中,我使用了update_stateful_set( ) 函数来更新这个statefulsets。在这个函数中,我正在更新容器镜像。现在,我将运行这个代码进行更新。

$ python3 update.py

正如你在这里看到的,我的容器镜像已经被更新了。

stssts

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

总结。

谢谢你坚持到最后。在这篇博客中,我们看到了如何使用kubernetes python客户端轻松地创建和更新状态集。如果你喜欢这篇博客,请通过竖起大拇指来表示感谢,并分享这篇博客,给我建议如何改进我未来的文章以满足你的需求。以下是我的电子邮件:gayatri.singh@knoldus.com