我在Google的Cloud Composer上运行Airflow。我正在使用KubernetesPodOperator,并希望通过gcsfuse将Google存储桶挂载到Pod中的目录。似乎要做到这一点,我需要给予k8s指定的here特权安全上下文。看起来airflow最近向KubernetesPodOperator添加了security_context参数。我在操作符中指定的安全上下文是:
security_context = {
'securityContext': {
'privileged': True,
'capabilities':
{'add': ['SYS_ADMIN']}
}
}
当我尝试在airflow worker中运行airflow test dag_id task_id date
时,pod启动,当代码尝试通过gcsfuse挂载bucket时,它抛出错误"fusermount: fuse device not found, try 'modprobe fuse' first"
。这使得security_context看起来不起作用(ex.)。
我是否误解了运算符中的security_context参数和/或我的securityContext字典定义无效?
2条答案
按热度按时间dgtucam11#
KubernetesPodOperator的
security_context
kwarg为pod设置安全上下文,而不是pod中的特定容器,因此它只支持PodSecurityContext
中列出的选项。由于您指定的参数对于pod的安全上下文无效,因此将丢弃它们。privileged
和capabilities
属性仅作为容器的SecurityContext
的一部分有效,这意味着您需要以某种方式在pod的***container***规范上设置它们。您可以通过自己定义整个pod规范来实现这一点(而不是让操作员为您生成它)。使用KubernetesPodOperator,您可以设置full_pod_spec
或pod_template_file
来指定Kubernetes API Python对象或对象YAML的路径,然后将其用于生成pod。使用前者的示例:如果你想在Cloud Composer中使用
pod_template_file
,你可以上传一个pod YAML到GCS,并将其设置为mapped storage paths(例如:例如,如果将其放在DAG目录中,则为/home/airflow/gcs/dags/my-pod.yaml
。阅读
airflow.providers.google.cloud
版本的KubernetesPodOperator,可能full_pod_spec
在新版本的操作符中被破坏。但是,它应该与旧的contrib版本一起工作。6ss1mwsb2#
我也在这个问题上挣扎。上面的回答和评论很有帮助。这是我解决问题的代码。