【问题标题】:gcloud compute on hadoop cluster has insufficient permissionhadoop集群上的gcloud计算权限不足
【发布时间】:2015-01-02 12:35:15
【问题描述】:

我在开发控制台上使用点击部署机制安装了 hadoop 集群。我对自定义设置进行了一些修改,例如机器种类,机器数量。集群已部署。

但是现在当我登录 master 并运行以下命令时

sudo gcloud 计算防火墙规则列表

我收到错误:权限不足

我检查了主节点的权限,我看到了这个:

权限

用户信息-禁用, 计算禁用 存储满 任务队列-禁用 BigQuery - 已停用 Cloud SQL 已禁用 云数据存储 - 已禁用 云平台-禁用

当我启动一个单独的虚拟机时,我可以为这些方面启用它的权限,但是当我启动一个集群时,我不能。这是我在 hadoop master 上看到权限错误的原因吗?

如何解决?

更多背景:我需要启用防火墙端口,以便我可以使用 ip http://:50030/ 查看作业状态

【问题讨论】:

    标签: hadoop google-compute-engine


    【解决方案1】:

    您的 GCE 实例需要通过服务帐户获得读取权限,才能通过项目中的 Cloud SDK(即 gcloud 计算)列出实例。通常,默认情况下,实例仅被授予对 Google Cloud Storage 的读取权限。您可以在此处找到有关将 Cloud SDK 工具与服务帐户一起使用的更多信息:https://cloud.google.com/compute/docs/authentication#tools

    一旦创建了与实例关联的服务帐户,就无法修改。这些范围只能在创建时授予。

    或者,您可以通过在实例中键入以下内容然后按照说明操作来向 Cloud SDK 进行身份验证:(这是使用您的凭据而不是服务帐户)

    gcloud auth login --no-launch-browser

    这些都与修改防火墙规则没有直接关系。此处有使用 Cloud SDK 操作防火墙规则的综合指南:

    https://cloud.google.com/sdk/gcloud/reference/compute/firewall-rules/create

    【讨论】:

    • 我想出了这部分。我必须在 GCE_SERVICE_ACCOUNT_SCOPES 中添加范围计算 rw。并使用 bdutil 启动 hadoop 集群。但是 bdutil 默认安装 hadoop 1.2 但可以更改。我无法确定的是防火墙部分,因此可以访问 url http://{IP}:50030/jobtracker_jsp.html。我尝试了以下命令: gcloud compute firewall-rules create allow-http-tcp --description "Incoming http allowed." --allow tcp:50030 --format json
    • 我在这里问了一个相关问题:stackoverflow.com/questions/27764286/…
    【解决方案2】:

    打开不安全端口的问题

    注意:这是一个普遍的问题,并不局限于 Hadoop。

    当前开放端口的解决方案不是一个好主意,因为 Hadoop 状态页面是通过 HTTP(不是 HTTPS)提供的,这意味着它们以纯文本形式提供,因此,互联网上的任何人也可以访问您的实例并查看或控制您的 Hadoop 作业或集群或它们包含的数据。

    解决方案备选方案

    相反,您应该通过加密通道(HTTPS/SSL 或使用 SSH 隧道)发送所有流量,并通过该通道发送您的浏览器流量。

    据我所知,Hadoop 目前不提供 HTTPS,因此您可以创建一个 SSH 隧道并通过该安全隧道进行浏览。

    此解决方案的好处是:

    • 它是安全的:您的浏览器和虚拟机实例之间的所有通信都是通过您的 SSH 连接进行的,因此即使连接使用的是 HTTP 而不是 HTTPS,它对外部用户仍然是安全的
    • 您可以连接到主机名(即直接连接您的 VM 名称),就好像它们在您的本地网络上一样,例如,http://my-host:5392
    • 您可以连接到任何主机上的任何端口,而无需单独打开每个端口

    安全连接到 GCE 虚拟机的完整指南

    请参阅“Securely Connecting to VM Instances”指南了解以下 SOCKS 代理指南之外的更多详细信息,包括防火墙、HTTPS 和 SSL、SSH 端口转发、SSH SOCKS 代理、堡垒主机、VPN、NAT 等。

    通过 SSH 隧道 + SOCKS 代理安全连接

    这样做的方法是设置一个SOCKS proxy,它将使用 SSH 隧道来保护您与 GCE 上的 Hadoop 集群的通信。您可以使用full script 或创建您自己的,如下所示:

    #!/bin/bash
    
    # Modify these variables to match your deployment.
    export PROJECT="curious-lemming-42"  # Google Cloud Platform Project
    export ZONE="us-central-1"           # zone of Hadoop cluster
    export PORT="9000"                   # port on local machine to run proxy;
                                         # just choose an open port
    export SERVER="my-instance"          # any VM instance in the cluster
    
    # This command starts the SOCKS proxy on $PORT.
    gcloud compute ssh \
        --project="${PROJECT}" \
        --zone="${ZONE}" \
        --ssh-flag="-D" \
        --ssh-flag="${PORT}" \
        --ssh-flag="-N" \
        "${SERVER}"
    

    在您的本地机器(不是 GCE 虚拟机)上打开一个新终端并在那里运行此脚本。当此脚本运行时,您将通过 SSH 为您的 Hadoop 集群设置一个安全代理。

    然后,假设您使用的是 Google Chrome,您也可以在本地机器上(而不是在 GCE 虚拟机上)使用此脚本来安全地连接到您的 Hadoop 集群:

    #!/bin/bash
    
    # This port must match the port in the other script above.
    declare -r PORT="9000"
    
    # Create a directory for the proxy profile to separate it from the others.
    # You can change this directory if you wish.
    declare -r CHROME_PROXY_PROFILE="${HOME}/chrome-proxy-profile"
    if ! [ -d "${CHROME_PROXY_PROFILE}" ]; then
      mkdir -p "${CHROME_PROXY_PROFILE}"
    fi
    
    # Run a new instance of Chrome using the custom proxy profile.
    declare -r OS_NAME="$(uname -s)"
    if [[ "${OS_NAME}" == "Linux" ]]; then
      /usr/bin/google-chrome \
          --user-data-dir="${CHROME_PROXY_PROFILE}" \
          --proxy-server="socks5://localhost:${PORT}"
    elif [[ "${OS_NAME}" == "Darwin" ]]; then
      "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
          --user-data-dir="${CHROME_PROXY_PROFILE}" \
          --proxy-server="socks5://localhost:${PORT}"
    else
      echo "Unrecognized OS: ${OS_NAME}" >&2
      exit 1
    fi
    

    如果您想设置 Firefox,请参阅 these directions,此时无法编写脚本。

    有关其运作方式和原因的背景和详细信息

    您可以从以下来源阅读更多关于 SSH 隧道、它是什么以及它如何工作的信息:

    【讨论】:

    • 感谢您的详细解答。我想出了上面提到的解决方案。所以我最终没有尝试你的解决方案。
    • @user3279103 请至少阅读我的解决方案的第一段,了解为什么不应该为 Hadoop 开放端口。这个解决方案最终也变得更容易,因为您可以使用主机名而不是 IP 地址,并且所有内部链接在 Hadoop 环境中透明地工作,无需手动重写 URL。
    • 我阅读了您的解决方案。我认为它很有价值,但安全性对我来说不是问题。所以我决定避免它。顺便说一句,我打开了另一个相关问题bit.ly/14mjlSN(我看到你在谷歌云上工作,我发现在谷歌云上运行一个 hadoop 工作涉及很多问题,所以我可以直接通过电子邮件向你发送问题吗?
    • @user3279103 请根据gcp-hadoop-announce 上的帖子将问题发送至 gcp-hadoop-contact@google.com。
    • 为我工作。谢谢!
    【解决方案3】:

    在 GCE 平台上使用的防火墙规则是在网络级别定义的,而不是在每个虚拟机的基础上定义的。在每个防火墙规则中,您可以指定它适用的实例等。为此,一个非常方便的做法是使用标签:为一个虚拟机或一组虚拟机(或集群)定义相同的标签,以便该规则适用于所有带有该标签的虚拟机。

    默认情况下,同一网络内的实例之间的流量是未过滤的,只有选定的几个端口会从虚拟机过滤到开放的互联网。传入连接不是这样:为此,您必须定义所述防火墙规则,打开传入连接的端口,定义所述连接的目的地,如上所述。

    您收到的权限消息是由于您尝试从系统(集群主服务器)访问您的项目,而这两个系统都没有机器权限(由 VM 的服务帐户定义)来修改您的项目(在这种情况下,修改防火墙规则集),当前也没有使用您的用户/所有者凭据登录,有权执行相同的任务。这也不是必需的:您可以在自己的工作站上使用 SDK / gcutil 命令定义所述规则集......也就是说,只要您登录到您的用户/所有者帐户。

    在您的特定情况下,默认情况下,可以从同一网络中的所有 VM 访问 TCP 端口 50030。如果您从开放网络访问所述端口,则必须在项目范围内定义防火墙规则,以允许所述传入通信。另外,请注意,集群部署系统已经添加了几个参考集群的规则。

    查看/管理防火墙规则最方便的方法是使用开发者控制台

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-01
      • 2016-05-04
      • 1970-01-01
      • 1970-01-01
      • 2019-06-06
      • 2019-08-13
      • 1970-01-01
      相关资源
      最近更新 更多