KubernetesPodOperator在Airflow中享有特权security_context

时间:2019-11-22 20:56:12

标签: kubernetes google-kubernetes-engine airflow google-cloud-composer

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

1 个答案:

答案 0 :(得分:1)

KubernetesPodOperator的security_context kwarg设置Pod的安全上下文,而不是Pod中的特定容器,因此它仅支持PodSecurityContext中概述的选项。由于您指定的参数对于Pod的安全性上下文无效,因此将其丢弃。

privilegedcapabilities属性仅在容器的SecurityContext中有效,这意味着您需要以某种方式将它们设置在容器的 container < / strong> 规范。您可以自己定义整个Pod规格(而不是由操作员为您生成)来实现。使用KubernetesPodOperator,可以设置full_pod_specpod_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版本一起使用。