我有一个谷歌云作曲环境。在我的DAG中,我想在GKE中创建一个pod。当我开始部署一个基于docker容器的简单应用程序时,它不需要任何卷配置或秘密,一切都很好,例如:
kubernetes_max = GKEStartPodOperator(
# The ID specified for the task.
task_id="python-simple-app",
# Name of task you want to run, used to generate Pod ID.
name="python-demo-app",
project_id=PROJECT_ID,
location=CLUSTER_REGION,
cluster_name=CLUSTER_NAME,
# Entrypoint of the container, if not specified the Docker container's
# entrypoint is used. The cmds parameter is templated.
cmds=["python", "app.py"],
namespace="production",
image="gcr.io/path/to/lab-python-job:latest",
)
但是当我有一个应用程序需要访问我的GKE集群卷时,我需要在我的pod中配置卷。问题是文档对此并不清楚。我发现的唯一的例子是:
volume = k8s.V1Volume(
name='test-volume',
persistent_volume_claim=k8s.V1PersistentVolumeClaimVolumeSource(claim_name='test-volume'),
)
虽然我的清单文件中的卷(我用它来部署我的应用程序从本地)看起来像这样:
volumes:
- name: volume-prod
secret:
secretName: volume-prod
items:
- key: config
path: config.json
- key: another_config
path: another_config.conf
- key: random-ca
path: random-ca.pem
因此,当我比较两个卷在控制台中的样子时(当我手动部署成功运行的清单文件时,以及当我使用失败的clod composer部署pod时):
成功运行清单文件:
volume-prod
名称:volume-prod
类型:secret
源卷标识符:volume-prod运行失败- Composer
GKEStartPodOperator
:volume-prod
名称:volume-prod
类型:emptyDir
源卷标识符:Node的默认介质
如何从cloud composer配置pod,使其能够读取集群的容量?
KubernetesPodOperator
/GKEStartOperator
只是一个python Kubernetes sdk的包装-我同意它在Airflow/Cloud Composer文档中没有很好的文档,但是Kubernetes的python sdk本身有很好的文档。
从kubernetes python sdk文档开始:https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1PodSpec.md
您将注意到KubernetesPodOperator
/GKEStartOperator
所采用的参数与此规范相匹配。如果您深入研究操作符的源代码,您将看到操作符只不过是创建kubernetes.client.models.V1Pod
对象并使用API部署pod的构建器。
操作符接受volumes
形参,该形参的类型应该是List[V1Volume]
,V1Volume
的文档在这里。
所以在你的情况下,你需要提供:
from kubernetes.client import models as k8s
kubernetes_max = GKEStartPodOperator(
# The ID specified for the task.
task_id="python-simple-app",
# Name of task you want to run, used to generate Pod ID.
name="python-demo-app",
project_id=PROJECT_ID,
location=CLUSTER_REGION,
cluster_name=CLUSTER_NAME,
# Entrypoint of the container, if not specified the Docker container's
# entrypoint is used. The cmds parameter is templated.
cmds=["python", "app.py"],
namespace="production",
image="gcr.io/path/to/lab-python-job:latest",
volumes=[
k8s.V1Volume(
name="volume-prod",
secret=k8s.V1SecretVolumeSource(
secret_name="volume-prod",
items=[
k8s.V1KeyToPath(key="config", path="config.json"),
k8s.V1KeyToPath(key="another_config", path="another_config.conf"),
k8s.V1KeyToPath(key="random-ca", path="random-ca.pem"),
],
)
)
]
)
或者,您可以将您的清单提供给GKEStartPodOperator
中的pod_template_file
参数-这将需要对气流中的工人可用。
使用此操作符有3种方法在气流中创建吊舱:
- 使用操作符的参数指定您需要的内容,并让操作符为您构建
V1Pod
。 - 通过传入
pod_template_file
参数提供清单。 使用Kubernetes sdk自己创建一个
V1Pod
对象,并将其传递给full_pod_spec
参数。