Apache DolphinScheduler 需要的sudo,还可以这么玩,长见识了!

Apache DolphinScheduler(incubator)需要的sudo,还可以这么玩,长见识了!


在新一代大数据任务调度 - Apache DolphinScheduler(以下简称dolphin) 官网中部署安装需要对部署OS用户配置sudo且免密

echo 'dolphinscheduler  ALL=(ALL)  NOPASSWD: NOPASSWD: ALL' >> /etc/sudoers

看到这的时候,你是否也对此处产生一点疑问?dolphin部署OS用户需配置可免密操作所有用户的权限?dolphin部署OS用户需拥有和root一样的权限?dolphin部署OS用户使用root权限操作什么?...

DolphinScheduler简介

Apache DolphinScheduler是一个分布式去中心化,易扩展的可视化DAG工作流任务调度系统。致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中开箱即用,目前已累计有 400+ 公司在生产上使用。

特点

  • 高可靠性

中心化的多Master和多Worker, 自身支持HA功能, 采用任务队列来避免过载,不会造成机器卡死;

  • 简单易用

DAG监控界面,所有流程定义都是可视化,通过拖拽任务定制DAG,通过API方式与第三方系统对接, 一键部署;

  • 丰富的使用场景

支持暂停恢复操作. 支持多租户,更好的应对大数据的使用场景. 支持更多的任务类型,如 spark, hive, mr, python, sub_process, shell;

  • 高扩展性

支持自定义任务类型,调度器使用分布式调度,调度能力随集群线性增长,Master和Worker支持动态上下线;

主要能力

  • Task以DAG形式关联,实时监控任务的状态;

  • 支持Shell、MR、Spark、SQL、依赖等10多种任务类型;

  • 工作流优先级、任务优先级,全局参数及局部自定义参数;

  • 工作流可定时、依赖、手动、暂停/停止/恢复;

  • 支持补数、多租户、日志在线查看及资源在线管理;

  • 完善的系统服务监控,任务超时告警/失败;

  • 去中心化设计确保系统的稳定、高可用;

  • 支持每日十万数据量级任务稳定运行;

我非常看好dolphin,但在实施中遇到公司要求不允许开通root权限,那还怎么搞下去?

如果能想怎么玩就怎么玩的大佬请忽略此文章,跪求带带小弟,我会喊666~

问题场景

说一个我在公司遇到的场景,基础设施运营和应用组件归属不同团队,运营团队要求应用层不允许拥有root权限,但dolphin使用需要配置sudo且免密,从官网配置要求看,此时的dolphin部署OS用户是和root账号一样拥有整个系统的最高权限。在运营安全角度来看,很危险。但你还想要玩,运营给了两条路,1.向上级领导审批,特事特办;2.申请机器,独自运营;哪条路都不好走,只能另寻出路。

调度选的好,下班回家早;调度选的对,半夜安心睡;选择dolphin,干就完了。

dolphin引用sudo用途

sudo描述

sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,sudo的权限控制可以在/etc/sudoers文件中查看到。

dolphin配置sudo且免密做什么?

官网解释:以 sudo -u {linux-user} 切换不同linux用户的方式来实现多租户运行作业,所以部署用户需要有 sudo 权限,而且是免密的。

源码分析

dolphin使用sudo工具干了哪些事情

一键部署/执行任务脚本类命令/kill命令

解决方案

自己冥思苦想几种方案,效果都不理想

1.将dolphin部署OS用户配置可以向大数据集群所有租户下提交作业,通过指定队列来区分。缺点:dolphin部署OS用户在大数据集群权限非常大,对不同租户下的作业都有操作权限。

2.修改dolphin源码,移除sudo命令,在每个OS用户下安装一个worker节点,通过worker分组来实现多租户提交作业。缺点:worker节点过多,占有大量系统资源。

这个问题跟sudo配置有关,还得从sudo方面下手,发现sudo在配置的时候可以指定只允许部分OS用户账号。这样dolphin部署OS用户账号只有指定部分OS用户账号的操作权限,完全满足dolphin 使用sudo -u {linux-user}命令来解决实现多租户运行作业问题,也满足dolphin部署OS用户的权限只有普通用户权限和可以操作指定OS用户权限。

开搞

sudo的权限控制在文件/etc/sudoers内配置

root ALL=(ALL:ALL) ALL%wheel ALL=(ALL) ALL
%sudo ALL=(ALL:ALL) ALL

对/etc/sudoers文件进行编辑的代码公式可以概括为:

授权用户/组 主机=[(切换到哪些用户或组)] [是否需要输入密码验证] 命令1,命令2,...

解释

  • '授权用户/组':

    • 以%号开头的表示"将要授权的组";

    • 不以%号开头的表示"将要授权的用户";

  • '主机':允许登录的主机,

    • ALL表示所有;

    • 如果该字段不为ALL,表示授权用户只能在某些机器上登录本服务器来执行sudo命令.

  • '[(切换到哪些用户或组)]':

    • 为(ALL)或者(ALL:ALL), 表示能够提权到(任意用户:任意用户组);

    • 为(),代表省略, 相当于(root:root),表示可以通过sudo提权到root;

  • '[是否需要输入密码验证] ':

    • 为NOPASSWD: 代表执行sudo时可以不需要输入密码

  • '命令1,命令2,...':

    • 多个命令使用逗号分隔,这些命令是授权给用户的操作; 命令都是使用绝对路径,避免目录下同名命令情况;

    • ALL表示允许所有操作

[ ]中的内容, 都能省略

按照上文修改如下

echo 'dolphinscheduler  ALL=(userA,userB,userC)  NOPASSWD: NOPASSWD: ALL' >> /etc/sudoers
  • 其中userA,userB,userC代表是linux OS用户,用于多租户向大数据集群提交作业。

  • 后面有新增租户,提交运营申请dolphin worker节点所在机器新增sudo配置权限控制,也实现了机器OS用户使用权限控制。

注:我是按用户userA,userB,userC去申请sudo控制权限,此处使用用户组去申请sudo控制权限是不是会更好,有待其他小伙伴去探索。

解决了sudo问题,dolphin完全可以使用普通OS用户普通权限运行。

你是否有更好的想法,欢迎留言讨论!

您知道么?

为什么要参与开源?

这里汇总了以下对个人来说比较重要的几点:

参与开源的方式?

参与 DolphinScheduler 社区有非常多的参与贡献的方式,包括文档、翻译、答疑、测试、代码、会议分享等,此外也极其欢迎各种实践文章,DolphinScheduler开源社区非常期待您的参与。

贡献第一个PR(文档、代码) 我们也希望是简单的,用第 1 个 PR 来熟悉社区的流程和友好度,也判断一下这是不是我想参与贡献的社区呐

文档github地址:https://github.com/apache/incubator-dolphinscheduler-website

当然如果您酷爱coding,社区也是非常欢迎“show me the code"的。

戳原文,立刻奔向 

DolphinScheduler  的 github 仓库一起玩耍,来个 star 先收藏也是好的
posted @ 2020-12-16 16:38  海豚调度  阅读(179)  评论(0编辑  收藏  举报