kubernetes Python API客户端:执行完整的Yaml文件

时间:2019-06-19 18:36:25

标签: python api kubernetes client yaml

Kubernetes有一个非常好的官方Python API客户端。 API客户端假定您将创建单个资源(例如pod或服务),并假定您将使用Python对象来编写和创建API请求。

但是,我想通过Python接口运行任意kubernetes YAML文件(包含一个或多个k8s资源)。我想知道是否可以利用Python kubernetes客户端来应用任意的YAML文件?

我基本上是在寻找与之等效的Python:

kubectl apply -f some-file-containing-multiple-resources.yaml

我正在寻找一种基本可以加载kubeconfig并通过Python以相当Python方式应用yaml的东西。

我知道我可以用一个Python子进程调用包装kubectl命令,但是我希望能提供比Python更强大的功能,并希望核心K8s Python客户端可以做到这一点。或者,如果还有另一个类似的Python包。

Python kubernetes客户端可以调用任意的k8s yaml文件吗?如果不能,是否可以执行某些操作?

感谢您的阅读-感谢您​​提供的任何建议。

2 个答案:

答案 0 :(得分:3)

您可以按以下方式尝试使用kubernetes.utils提供的def make_folder(folder_path:str, date:str, **context): download_path= folder_path + date os.mkdir(download_path) task_instance = context['task_instance'] task_instance.xcom_push(key="download_path", value=download_path) task_1 = PythonOperator( task_id="make_folder", provide_context=True, python_callable=make_folder, op_kwargs={'folder_path': '/my_path_', 'date':'str(datetime.date(datetime.today()))'} ) task_2 = DockerOperator( task_id='docker', image='file_processor:latest', api_version='auto', auto_remove=False, command='', environment={ 'DPATH': "{{ task_instance.xcom_pull(task_ids='make_folder', key='download_path') }}" }, docker_url="unix://var/run/docker.sock", network_mode="bridge" ) task_1 >> task_2 。 这是多资源定义文件

create_from_yaml

现在,您可以尝试运行以下代码,并检查代码是否适合您。

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
    - name: ngnx-container
      image: nginx:latest
      ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
   - port: 8080
     targetPort: 80

答案 1 :(得分:2)

examples目录中似乎有此示例。特别是https://github.com/kubernetes-client/python/blob/master/examples/create_deployment.py可以做到:

from os import path

import yaml

from kubernetes import client, config


def main():
    # Configs can be set in Configuration class directly or using helper
    # utility. If no argument provided, the config will be loaded from
    # default location.
    config.load_kube_config()

    with open(path.join(path.dirname(__file__), "nginx-deployment.yaml")) as f:
        dep = yaml.safe_load(f)
        k8s_beta = client.ExtensionsV1beta1Api()
        resp = k8s_beta.create_namespaced_deployment(
            body=dep, namespace="default")
        print("Deployment created. status='%s'" % str(resp.status))


if __name__ == '__main__':
    main()