使用Python-Kubernetes客户机,一般如何复制“kubectl create f”?

2024-09-26 18:03:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我的Bash脚本使用kubectl create/apply -f ...来部署大量的Kubernetes资源,对于Bash来说太大了。我使用PyPI kubernetes包将其转换为Python。在

有没有一种通用的方法来创建给定YAML清单的资源?否则,我能看到的唯一方法就是创建和维护从Kind到API方法create_namespaced_<kind>的映射。我觉得这很乏味,而且容易出错。在

更新:我正在将许多(10-20)资源部署到许多(10+)GKE集群。在


Tags: 方法脚本pypibashapiyaml部署create
2条回答

为了实现从其json/yaml文件创建k8s资源的功能,我写了以下代码:

def create_from_yaml(yaml_file):
    """

    :param yaml_file:
    :return:
    """

    yaml_object = yaml.loads(common.load_file(yaml_file))
    group, _, version = yaml_object["apiVersion"].partition("/")
    if version == "":
        version = group
        group = "core"

    group = "".join(group.split(".k8s.io,1"))
    func_to_call = "{0}{1}Api".format(group.capitalize(), version.capitalize())

    k8s_api = getattr(client, func_to_call)()

    kind = yaml_object["kind"]
    kind = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', kind)
    kind = re.sub('([a-z0-9])([A-Z])', r'\1_\2', kind).lower()

    if "namespace" in yaml_object["metadata"]:
        namespace = yaml_object["metadata"]["namespace"]
    else:
        namespace = "default"

    try:
        if hasattr(k8s_api, "create_namespaced_{0}".format(kind)):
            resp = getattr(k8s_api, "create_namespaced_{0}".format(kind))(
                body=yaml_object, namespace=namespace)
        else:
            resp = getattr(k8s_api, "create_{0}".format(kind))(
                body=yaml_object)
    except Exception as e:
        raise e

    print("{0} created. status='{1}'".format(kind, str(resp.status)))

    return k8s_api

在上面的函数中,如果您提供了任何一个对象yaml/json文件,它会自动提取API类型和对象类型,并创建statefulset、deployment、service等对象

PS:上面的代码没有在一个文件中处理多个kubernetes资源,因此每个yaml文件应该只有一个对象。在

我明白你在找什么了。其他k8s客户机也可以使用其他语言。Here是java中的一个例子。不幸的是,python客户机库还不支持该功能。我打开了一个新的功能请求请求,您可以选择跟踪它或自己贡献:)。Here是GitHub上问题的链接。在

另一种方法是使用java/golang客户机并将代码放入docker容器中。在

相关问题 更多 >

    热门问题