Airflow中的KubernetesPodOperator特权security_context

6mzjoqzu  于 2023-04-29  发布在  Kubernetes
关注(0)|答案(2)|浏览(284)

我在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字典定义无效?

dgtucam1

dgtucam11#

KubernetesPodOperator的security_context kwarg为pod设置安全上下文,而不是pod中的特定容器,因此它只支持PodSecurityContext中列出的选项。由于您指定的参数对于pod的安全上下文无效,因此将丢弃它们。
privilegedcapabilities属性仅作为容器的SecurityContext的一部分有效,这意味着您需要以某种方式在pod的***container***规范上设置它们。您可以通过自己定义整个pod规范来实现这一点(而不是让操作员为您生成它)。使用KubernetesPodOperator,您可以设置full_pod_specpod_template_file来指定Kubernetes API Python对象或对象YAML的路径,然后将其用于生成pod。使用前者的示例:

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(例如:例如,如果将其放在DAG目录中,则为/home/airflow/gcs/dags/my-pod.yaml
阅读airflow.providers.google.cloud版本的KubernetesPodOperator,可能full_pod_spec在新版本的操作符中被破坏。但是,它应该与旧的contrib版本一起工作。

6ss1mwsb

6ss1mwsb2#

我也在这个问题上挣扎。上面的回答和评论很有帮助。这是我解决问题的代码。

pod = k8s_models.V1Pod()
    containers = [
        k8s_models.V1Container(
            name='container_1',
            security_context={
                'privileged': True,
                'capabilities': {'add': ['SYS_ADMIN']}
            }
        )
    ]
    pod.spec = k8s_models.V1PodSpec(containers=containers)

相关问题