使用Python脚本执行kubectl命令

4

我尝试使用Python脚本执行kubectl命令,但不断收到错误。我需要执行kubectl命令来创建pod并检查pod日志中是否有任何故障。

我在这里做错了什么?

import subprocess

command = 'kubectl apply -f deployment.yaml'


check_output= subprocess.check_output(command)
print(check_output)


错误

Traceback (most recent call last):
  File "/usr/bin/cma-scripts/kubectl.py", line 6, in <module>
    check_output= subprocess.check_output(command)
  File "/usr/local/lib/python3.9/subprocess.py", line 424, in check_output
    return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
  File "/usr/local/lib/python3.9/subprocess.py", line 505, in run
    with Popen(*popenargs, **kwargs) as process:
  File "/usr/local/lib/python3.9/subprocess.py", line 951, in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
  File "/usr/local/lib/python3.9/subprocess.py", line 1821, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: 'kubectl apply -f deployment.yaml'


4
它可能认为你没有使用 apply-f 等参数调用 kubectl,而是想要调用不存在的命令 kubectl apply -f ... 而且没有参数。尝试使用 shell=True 运行它,或者将该命令拆分成列表形式 (["kubectl", "apply", "-f"...])。 - koorkevani
@koorkevani 考虑将您的评论放置为答案。 - P....
你能否在这里使用Kubernetes SDK,而不是尝试调用kubectl?你需要动态调用kubectl exec调试工具吗,还是你的应用程序有一个HTTP端点可以连接到?(请记住,kubectl exec只会针对复制部署的单个Pod,并且您在那里进行的任何更改都将在Pod被删除时丢失。) - David Maze
1个回答

7

您可以使用Python执行kubectl命令,但您也可以使用Kubernetes API的Python客户端

下面我将为两种选项提供示例。

使用Python执行kubectl命令。

您可以使用subprocess模块:

$ cat script-1.py
#!/usr/bin/python3.7

import subprocess
subprocess.run(["kubectl", "apply", "-f", "deployment.yaml"])


$ ./script-1.py
deployment.apps/web-app created

您也可以使用os模块:
$ cat script-1.py
#!/usr/bin/python3.7

import os
os.system("kubectl  apply -f deployment.yaml")

$ ./script-1.py
deployment.apps/web-app created

使用Python客户端访问Kubernetes API

正如之前提到的,您也可以使用Python客户端创建一个Deployment。

基于deployment_create.py示例,我创建了一个脚本在default命名空间中部署deployment.yaml

$ cat script-2.py
#!/usr/bin/python3.7

from os import path

import yaml

from kubernetes import client, config


def main():
    config.load_kube_config()

    with open(path.join(path.dirname(__file__), "deployment-1.yaml")) as f:
        dep = yaml.safe_load(f)
        k8s_apps_v1 = client.AppsV1Api()
        resp = k8s_apps_v1.create_namespaced_deployment(
            body=dep, namespace="default")
        print("Deployment created. status='%s'" % resp.metadata.name)


if __name__ == '__main__':
    main()

$ ./script-2.py
Deployment created. status='web-app'

$ kubectl get deployment
NAME      READY   UP-TO-DATE   AVAILABLE   
web-app   1/1     1            1   

    

Python客户端相对于子进程库的优势是什么?速度吗? - Enis Arik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接