安全集群中的 YARN 容器使用操作系统设施为容器提供执行隔离。安全容器在作业用户的凭据下执行。操作系统强制执行容器的访问限制。容器必须作为提交应用程序的用户运行。
安全容器仅在安全 YARN 集群的上下文中工作。
容器执行程序必须访问容器所需的本地文件和目录,例如 jar、配置文件、日志文件、共享对象等。尽管它是由 NodeManager 启动的,但容器不应该能够访问 NodeManager 私有文件和配置。由不同用户提交的运行应用程序的容器应该被隔离,并且无法访问彼此的文件和目录。类似的要求适用于其他可保护的非文件系统对象,例如命名管道、临界区、LPC 队列、共享内存等。
在 Linux 环境中,安全容器执行器是 LinuxContainerExecutor
。它使用一个名为 container-executor 的外部程序来启动容器。此程序具有 setuid
访问权限标志设置,允许它使用 YARN 应用程序用户的权限启动容器。
为 yarn.nodemanager.local-dirs
和 yarn.nodemanager.log-dirs
配置的目录必须由已配置的 NodeManager 用户 (yarn
) 和组 (hadoop
) 所有。在这些目录上设置的权限必须是 drwxr-xr-x
。
container-executor
程序必须由 root
所有并具有 ---Sr-s---
权限设置。
要配置 NodeManager
以使用 LinuxContainerExecutor
,请在 conf/yarn-site.xml 中设置以下内容
<property> <name>yarn.nodemanager.container-executor.class</name> <value>org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor</value> </property> <property> <name>yarn.nodemanager.linux-container-executor.group</name> <value>hadoop</value> </property>
此外,LCE 需要 container-executor.cfg
文件,该文件由 container-executor
程序读取。
yarn.nodemanager.linux-container-executor.group=#configured value of yarn.nodemanager.linux-container-executor.group banned.users=#comma separated list of users who can not run applications allowed.system.users=#comma separated list of allowed system users min.user.id=1000#Prevent other super-users feature.terminal.enabled=1
终端功能 (feature.terminal.enabled) 允许通过 YARN UI2 进入安全容器的受限 shell。
Windows 环境安全容器执行器是 WindowsSecureContainerExecutor
。它使用 Windows S4U 基础设施以 YARN 应用程序用户的身份启动容器。WSCE 需要 hadoopwinutilsvc
服务。此服务由 %HADOOP_HOME%\bin\winutils.exe
托管,并使用 service
命令行参数启动。此服务提供一些需要 LocalSystem 权限的特权操作,以便 NM 不需要在提升的上下文中运行整个 JVM 和所有 NM 代码。NM 通过 JNI 调用托管在 hadoop.dll
中的 RCP 客户端,通过本地 RPC (LRPC) 与 hadoopwintulsvc
服务交互。
要配置 NodeManager
以使用 WindowsSecureContainerExecutor
,请在 conf/yarn-site.xml 中设置以下内容
<property> <name>yarn.nodemanager.container-executor.class</name> <value>org.apache.hadoop.yarn.server.nodemanager.WindowsSecureContainerExecutor</value> </property> <property> <name>yarn.nodemanager.windows-secure-container-executor.group</name> <value>yarn</value> </property>
hadoopwinutilsvc 使用 %HADOOP_HOME%\etc\hadoop\wsce_site.xml
来配置对特权操作的访问。
<property> <name>yarn.nodemanager.windows-secure-container-executor.impersonate.allowed</name> <value>HadoopUsers</value> </property> <property> <name>yarn.nodemanager.windows-secure-container-executor.impersonate.denied</name> <value>HadoopServices,Administrators</value> </property> <property> <name>yarn.nodemanager.windows-secure-container-executor.allowed</name> <value>nodemanager</value> </property> <property> <name>yarn.nodemanager.windows-secure-container-executor.local-dirs</name> <value>nm-local-dir, nm-log-dirs</value> </property> <property> <name>yarn.nodemanager.windows-secure-container-executor.job-name</name> <value>nodemanager-job-name</value> </property>
yarn.nodemanager.windows-secure-container-executor.allowed
应包含运行 nodemanager 的服务帐户的名称。此用户将被允许访问 hadoopwintuilsvc 函数。
yarn.nodemanager.windows-secure-container-executor.impersonate.allowed
应包含允许在集群中创建容器的用户。hadoopwinutilsvc 将被允许模拟这些用户。
yarn.nodemanager.windows-secure-container-executor.impersonate.denied
应包含明确禁止创建容器的用户。hadoopwinutilsvc 将拒绝模拟这些用户。
yarn.nodemanager.windows-secure-container-executor.local-dirs
应包含 nodemanager 本地目录。hadoopwinutilsvc 将仅允许在这些目录下进行文件操作。这应包含与 $yarn.nodemanager.local-dirs, $yarn.nodemanager.log-dirs
相同的值,但请注意 hadoopwinutilsvc XML 配置处理不执行替换,因此该值必须为最终值。所有路径都必须是绝对路径,并且不会执行任何环境变量替换。路径使用 LOCAL_INVARIANT 大小写不敏感字符串比较,验证的文件路径必须以 local-dirs 配置中列出的某个路径开头。使用逗号作为路径分隔符:,
yarn.nodemanager.windows-secure-container-executor.job-name
应包含应将所有容器添加到其中的 Windows NT 作业名称。此配置是可选的。如果未设置,则不会将容器添加到全局 NodeManager 作业。通常,这应设置为 NM 分配到的作业,以便在终止 NM 时也终止所有容器。Hadoopwinutilsvc 不会尝试创建此作业,该作业必须在启动容器时存在。如果设置了该值且作业不存在,则容器启动将失败,并出现错误 2 系统找不到指定的文件
。请注意,此全局 NM 作业与容器作业无关,后者始终为每个容器创建,并以容器 ID 命名。此设置控制跨越所有容器和父 NM 的全局作业,因此它需要嵌套作业。嵌套作业仅在 Windows 8 和 Windows Server 2012 之后可用。