我正在Google的Cloud Composer上运行Airflow。我正在使用KubernetesPodOperator,并希望通过gcsfuse将google存储桶安装到pod中的目录中。似乎要这样做,我需要给k8s指定here特权的安全上下文。看来airflow最近向KubernetesPodOperator添加了security_context参数。我在运算符中指定的安全上下文是:
security_context = {
'securityContext': {
'privileged': True,
'capabilities':
{'add': ['SYS_ADMIN']}
}
}
当我尝试在气流工作程序中运行airflow test dag_id task_id date
时,pod启动,并且当代码尝试通过gcsfuse安装存储桶时,它将引发错误"fusermount: fuse device not found, try 'modprobe fuse' first"
。这使得似乎security_context无法正常工作(ex.)。
我误解了运算符中的security_context参数是什么,并且/或者我的securityContext词典定义无效吗?
答案 0 :(得分:1)
KubernetesPodOperator的security_context
kwarg设置Pod的安全上下文,而不是Pod中的特定容器,因此它仅支持PodSecurityContext
中概述的选项。由于您指定的参数对于Pod的安全性上下文无效,因此将其丢弃。
privileged
和capabilities
属性仅在容器的SecurityContext
中有效,这意味着您需要以某种方式将它们设置在容器的 container < / strong> 规范。您可以自己定义整个Pod规格(而不是由操作员为您生成)来实现。使用KubernetesPodOperator,可以设置full_pod_spec
或pod_template_file
来指定Kubernetes API Python对象或对象YAML的路径,然后将其用于生成容器。使用前者的示例:
from airflow.contrib.operators.kubernetes_pod_operator import KubernetesPodOperator
import kubernetes.client.models as k8s
pod = k8s.V1Pod()
pod.spec = k8s.V1PodSpec()
pod.spec.containers = [
k8s.V1Container(
...,
security_context={
'privileged': True,
'capabilities': {'add': ['SYS_ADMIN']}
}
)
]
# Equivalent to setting security_context from the operator
pod.spec.security_context = {}
t1 = KubernetesPodOperator(..., full_pod_spec=pod)
如果您想在Cloud Composer中使用pod_template_file
,则可以将Pod YAML上载到GCS并将其设置为mapped storage paths之一(例如,如果将/home/airflow/gcs/dags/my-pod.yaml
放在DAG目录。
通读KubernetesPodOperator的airflow.providers.google.cloud
版本时,full_pod_spec
可能在较新的运算符版本中被破坏。但是,它应该与旧的contrib版本一起使用。