hadoop 集群上的 gcloud compute 权限不足
gcloud compute on hadoop cluster has insufficient permission
我在开发控制台上使用点击部署机制安装了 hadoop 集群。我对自定义设置做了一些修改,例如机器种类,机器数量。集群已部署。
但是现在当我登录到 master 并运行以下命令时
sudo gcloud compute 防火墙规则列表
我收到错误:权限不足
我检查了主节点的权限,我看到了这个:
权限
用户信息-已禁用,
计算障碍
存储满
任务队列-禁用
BigQuery - 禁用
Cloud SQL-已禁用
云数据存储 - 禁用
云平台-禁用
当我启动一个单独的虚拟机时,我可以为这些方面启用它的权限,但是当我启动一个集群时,我不能。这是我在 hadoop master 上看到权限错误的原因吗?
如何修复?
更多背景:我需要启用防火墙端口,以便我可以使用 ip http://:50030/
查看作业状态
您的 GCE 实例需要通过服务帐户获得读取权限才能通过项目中的 Cloud SDK(即 gcloud compute)列出实例。通常实例默认只被授予对 Google Cloud Storage 的读取权限。您可以在此处找到有关通过服务帐户使用 Cloud SDK 工具的更多信息:https://cloud.google.com/compute/docs/authentication#tools
与实例关联的服务帐户一旦创建就无法修改。这些范围只能在创建时授予。
或者,您可以通过从实例中键入以下内容然后按照说明操作来向 Cloud SDK 进行身份验证:(这是使用您的凭据而不是服务帐户)
gcloud auth login --no-launch-browser
其中None与修改防火墙规则直接相关。这里有一个使用 Cloud SDK 操作防火墙规则的综合指南:
https://cloud.google.com/sdk/gcloud/reference/compute/firewall-rules/create
打开不安全端口的问题
注意:这是一个普遍的问题,并不局限于Hadoop。
当前开放端口的解决方案不是一个好主意,因为 Hadoop 状态页面是通过 HTTP(而非 HTTPS)提供的,这意味着它们以纯文本形式提供,因此,互联网上的任何人也可以访问您的实例查看或控制您的 Hadoop 作业或集群或它们包含的数据。
备选解决方案
相反,您应该通过加密通道发送所有流量,HTTPS/SSL 或使用 SSH 隧道并通过该通道发送浏览器流量。
据我所知,此时 Hadoop 不提供 HTTPS,因此您可以创建一个 SSH 隧道并通过该安全隧道进行浏览。
此解决方案的好处是:
- 它是安全的:您的浏览器和 VM 实例之间的所有通信都通过您的 SSH 连接,因此即使连接使用 HTTP 而不是 HTTPS,它仍然对外部用户是安全的
- 您可以连接到主机名(即直接连接您的 VM 名称),就像它们在您的本地网络上一样,例如,
http://my-host:5392
- 您可以连接到任何主机上的任何端口,而无需单独打开每个端口
安全连接到 GCE VM 的完整指南
请参阅“Securely Connecting to VM Instances”指南了解除下面的 SOCKS 代理指南之外的更多详细信息,包括防火墙、HTTPS 和 SSL、SSH 端口转发、SSH SOCKS 代理、堡垒主机、VPN、NAT 等。
通过 SSH 隧道 + SOCKS 代理安全连接
执行此操作的方法是设置 SOCKS proxy which will use an SSH tunnel to secure your communication with the Hadoop cluster on GCE. You can either use the 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 VM)上打开一个新终端,然后 运行 那里有这个脚本。虽然此脚本是 运行ning,但您将通过 SSH 为 Hadoop 集群设置一个安全代理。
然后,假设您正在使用 Google Chrome,您可以使用这个脚本,也可以在您的本地计算机上,而不是在 GCE VM 上,安全地连接到您的 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 隧道、它是什么以及它如何工作的信息:
在 GCE 平台上使用的防火墙规则是在网络级别定义的,而不是在每个 VM 的基础上定义的。在每个防火墙规则中,您可以指定它适用的实例等。为此,一个非常方便的做法是使用标签:为一个 VM 或一组 VM(或集群)定义相同的标签,以便规则应用于所有标有该标签的 VM。
默认情况下,同一网络内实例之间的流量未被过滤,并且只有选定的几个端口从 VM 到开放互联网被过滤。传入连接则不然:为此,您必须定义所述防火墙规则,为传入连接打开端口,定义所述连接的目的地,如上所述。
您收到的权限消息是因为您正试图从一个系统(集群主机)访问您的项目,而该系统没有机器权限(由 VM 的服务帐户定义)来修改您的项目(在这种情况下,修改防火墙规则集),当前也没有使用有权执行相同任务的用户/所有者凭据登录。这也不是必需的:您可以使用 SDK / gcutil 命令从您自己的工作站舒适地定义所述规则集......也就是说,只要您登录到您的用户/所有者帐户。
在您的特定情况下,TCP 端口 50030 默认情况下可从同一网络中的所有 VM 访问。如果您从开放网络访问所述端口,则必须在项目范围内定义防火墙规则以允许所述传入通信。另外,请注意集群部署系统已经添加了一些参考集群的规则。
查看/管理防火墙规则的最便捷方式是使用开发人员控制台
我在开发控制台上使用点击部署机制安装了 hadoop 集群。我对自定义设置做了一些修改,例如机器种类,机器数量。集群已部署。
但是现在当我登录到 master 并运行以下命令时
sudo gcloud compute 防火墙规则列表
我收到错误:权限不足
我检查了主节点的权限,我看到了这个:
权限
用户信息-已禁用, 计算障碍 存储满 任务队列-禁用 BigQuery - 禁用 Cloud SQL-已禁用 云数据存储 - 禁用 云平台-禁用
当我启动一个单独的虚拟机时,我可以为这些方面启用它的权限,但是当我启动一个集群时,我不能。这是我在 hadoop master 上看到权限错误的原因吗?
如何修复?
更多背景:我需要启用防火墙端口,以便我可以使用 ip http://:50030/
查看作业状态您的 GCE 实例需要通过服务帐户获得读取权限才能通过项目中的 Cloud SDK(即 gcloud compute)列出实例。通常实例默认只被授予对 Google Cloud Storage 的读取权限。您可以在此处找到有关通过服务帐户使用 Cloud SDK 工具的更多信息:https://cloud.google.com/compute/docs/authentication#tools
与实例关联的服务帐户一旦创建就无法修改。这些范围只能在创建时授予。
或者,您可以通过从实例中键入以下内容然后按照说明操作来向 Cloud SDK 进行身份验证:(这是使用您的凭据而不是服务帐户)
gcloud auth login --no-launch-browser
其中None与修改防火墙规则直接相关。这里有一个使用 Cloud SDK 操作防火墙规则的综合指南:
https://cloud.google.com/sdk/gcloud/reference/compute/firewall-rules/create
打开不安全端口的问题
注意:这是一个普遍的问题,并不局限于Hadoop。
当前开放端口的解决方案不是一个好主意,因为 Hadoop 状态页面是通过 HTTP(而非 HTTPS)提供的,这意味着它们以纯文本形式提供,因此,互联网上的任何人也可以访问您的实例查看或控制您的 Hadoop 作业或集群或它们包含的数据。
备选解决方案
相反,您应该通过加密通道发送所有流量,HTTPS/SSL 或使用 SSH 隧道并通过该通道发送浏览器流量。
据我所知,此时 Hadoop 不提供 HTTPS,因此您可以创建一个 SSH 隧道并通过该安全隧道进行浏览。
此解决方案的好处是:
- 它是安全的:您的浏览器和 VM 实例之间的所有通信都通过您的 SSH 连接,因此即使连接使用 HTTP 而不是 HTTPS,它仍然对外部用户是安全的
- 您可以连接到主机名(即直接连接您的 VM 名称),就像它们在您的本地网络上一样,例如,
http://my-host:5392
- 您可以连接到任何主机上的任何端口,而无需单独打开每个端口
安全连接到 GCE VM 的完整指南
请参阅“Securely Connecting to VM Instances”指南了解除下面的 SOCKS 代理指南之外的更多详细信息,包括防火墙、HTTPS 和 SSL、SSH 端口转发、SSH SOCKS 代理、堡垒主机、VPN、NAT 等。
通过 SSH 隧道 + SOCKS 代理安全连接
执行此操作的方法是设置 SOCKS proxy which will use an SSH tunnel to secure your communication with the Hadoop cluster on GCE. You can either use the 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 VM)上打开一个新终端,然后 运行 那里有这个脚本。虽然此脚本是 运行ning,但您将通过 SSH 为 Hadoop 集群设置一个安全代理。
然后,假设您正在使用 Google Chrome,您可以使用这个脚本,也可以在您的本地计算机上,而不是在 GCE VM 上,安全地连接到您的 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 隧道、它是什么以及它如何工作的信息:
在 GCE 平台上使用的防火墙规则是在网络级别定义的,而不是在每个 VM 的基础上定义的。在每个防火墙规则中,您可以指定它适用的实例等。为此,一个非常方便的做法是使用标签:为一个 VM 或一组 VM(或集群)定义相同的标签,以便规则应用于所有标有该标签的 VM。
默认情况下,同一网络内实例之间的流量未被过滤,并且只有选定的几个端口从 VM 到开放互联网被过滤。传入连接则不然:为此,您必须定义所述防火墙规则,为传入连接打开端口,定义所述连接的目的地,如上所述。
您收到的权限消息是因为您正试图从一个系统(集群主机)访问您的项目,而该系统没有机器权限(由 VM 的服务帐户定义)来修改您的项目(在这种情况下,修改防火墙规则集),当前也没有使用有权执行相同任务的用户/所有者凭据登录。这也不是必需的:您可以使用 SDK / gcutil 命令从您自己的工作站舒适地定义所述规则集......也就是说,只要您登录到您的用户/所有者帐户。
在您的特定情况下,TCP 端口 50030 默认情况下可从同一网络中的所有 VM 访问。如果您从开放网络访问所述端口,则必须在项目范围内定义防火墙规则以允许所述传入通信。另外,请注意集群部署系统已经添加了一些参考集群的规则。
查看/管理防火墙规则的最便捷方式是使用开发人员控制台