首页 > 解决方案 > 如何使用 kubernetes-client 执行“kubectl apply”

问题描述

我有一个 python 脚本,它基本上运行以下三个命令

kubectl apply -f class.yaml
kubectl apply -f rbac.yaml
kubectl apply -f deployment-arm.yaml

我想用python写的kubernetes-client来代替。我当前的代码,加载那里的 yaml 文件(使用pyyaml),稍微编辑它们,插入文件并使用命令行 kubectl 执行这三个命令。部分代码:

# load files, edit them and dump into new files, part ...
result = run(['kubectl', 'apply', '-f', class_file_path])
# status check part ...
result = run(['kubectl', 'apply', '-f', rbac_file_path])
# status check part ...
result = run(['kubectl', 'apply', '-f', deployment_file_path])
# status check part ...

我想做的:用 python kubernetes-client 替换这三个命令。阅读文档并查看主题,我遇到了create_namespaced_deployment我认为需要用于deployment_file_path文件的方法。但我似乎无法弄清楚我需要对另外两个文件做什么。

假设我已经加载了三个 yaml 文件(使用 pyyaml)并编辑了它们(没有转储到新文件中),现在你有免费的 yaml dicts deployment_dictclass_dictrbac_dict,如何使用客户端执行上述三个方法?

编辑:顺便说一句,如果无法传递三个字典,我可以再次将它们转储到文件中,但我想使用 python 客户端而不是 kubectl。怎么做?

标签: pythonkubernetes

解决方案


每个对象和动作都有一个单独的函数:

from kubernetes import client, config
import yaml

body = yaml.safe_load("my_deployment.yml")
config.load_kube_config()
apps_api = client.AppsV1Api()
apps_api.create_namespaced_deployment(body=body, namespace="default")
apps_api.replace_namespaced_deployment(body=body, namespace="default")
apps_api.patch_namespaced_deployment(body=body, namespace="default")
apps_api.delete_namespaced_deployment(body=body, namespace="default")

body = yaml.safe_load("my_cluster_role.yml")
rbac_api = client.RbacAuthorizationV1Api()
rbac_api.create_cluster_role(body=body)
rbac_api.patch_cluster_role(body=body)
rbac_api.replace_cluster_role(body=body)
rbac_api.delete_cluster_role(body=body)

# And so on

当您使用时,kubectl apply您不必关心对象是否已经存在、要使用什么 API、要应用哪种方法,但对于客户端,您必须这样做。从示例中可以看出,您需要:

  1. 加载 kube-config。
  2. 选择要使用的正确 API(仅在加载配置后创建对象)。
  3. 选择您要使用的方法。请注意,如果已经存在,这create_something将不起作用。something

由于严格的命名模式,很容易从客户端获得所需的功能

getattr(some_k8s_api, f"{verb}_{namespaced_or_not}_{kind.lower()}")

我建议您仔细阅读图书馆提供的示例,它们真的非常适合学习。


推荐阅读