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文件吗?如果不能,是否可以执行某些操作?
感谢您的阅读-感谢您提供的任何建议。
答案 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()