GCP#
通常,管理员可以在三种“级别”的权限中进行选择,从最宽松且设置工作量最少,到最严格且设置工作量较多:
中等权限#
授予用户访问您的GCP项目权限的最简单方法,而不使用Owner角色,是将以下角色添加到用户主体中:
roles/browser
roles/compute.admin
roles/iam.serviceAccountAdmin
roles/iam.serviceAccountUser
roles/serviceusage.serviceUsageConsumer
roles/storage.admin
roles/iam.securityAdmin
注意
如果roles/iam.securityAdmin角色不合适,您可以执行以下操作。首先,包含该角色并让任何用户(例如,管理员)成功运行sky launch --cloud gcp一次。这是为了创建必要的服务账户。然后,在上面的列表中将roles/iam.securityAdmin角色替换为roles/iam.roleViewer。
可选地,要使用TPUs,请添加以下角色:
roles/tpu.admin
您可以通过GCP的IAM & Admin控制台授予这些访问权限。
最小权限#
中等权限 为用户分配了一些GCP服务的管理权限。如果您希望在您的组织/项目中为用户授予更细粒度和更小的权限,您可以按照以下步骤创建自定义角色:
用户#
前往GCP的IAM & 管理控制台并点击创建角色。
给角色一个描述性的名称,例如
minimal-skypilot-role。点击添加权限并搜索以下权限,然后将它们添加到角色中:
compute.disks.create
compute.disks.list
compute.firewalls.create
compute.firewalls.delete
compute.firewalls.get
compute.instances.create
compute.instances.delete
compute.instances.get
compute.instances.list
compute.instances.setLabels
compute.instances.setMetadata
compute.instances.setServiceAccount
compute.instances.start
compute.instances.stop
compute.networks.get
compute.networks.list
compute.networks.getEffectiveFirewalls
compute.globalOperations.get
compute.subnetworks.use
compute.subnetworks.list
compute.subnetworks.useExternalIp
compute.projects.get
compute.zoneOperations.get
iam.roles.get
iam.serviceAccounts.actAs
iam.serviceAccounts.get
serviceusage.services.enable
serviceusage.services.list
serviceusage.services.use
resourcemanager.projects.get
resourcemanager.projects.getIamPolicy
注意
对于自定义VPC用户(在~/.sky/config.yaml中指定了gcp.vpc_name,请查看这里),除非需要通过任务yaml中的resources.ports打开端口,否则compute.firewalls.create和compute.firewalls.delete不是必需的。
注意
(高级)为了进一步限制iam.serviceAccounts.actAs权限仅访问SkyPilot的服务账户,您可以从上述列表中删除该权限,并额外授予您组织的用户使用管理员创建的skypilot-v1服务账户的能力(参见服务账户)。这可以通过转到IAM & Admin console -> Service Accounts -> skypilot-v1 -> Permissions -> GRANT ACCESS并添加具有roles/iam.serviceAccountUser角色的用户来完成。这允许用户使用SkyPilot所需的skypilot-v1服务账户。
可选:如果用户需要访问GCS存储桶,您可以额外添加以下权限:
storage.buckets.create
storage.buckets.get
storage.buckets.delete
storage.objects.create
storage.objects.update
storage.objects.delete
storage.objects.get
storage.objects.list
可选:如果用户需要访问TPU虚拟机,您可以额外添加以下权限(以下可能并不全面,如果您发现任何缺失的权限,请提交问题):
tpu.nodes.create
tpu.nodes.delete
tpu.nodes.list
tpu.nodes.get
tpu.nodes.update
tpu.operations.get
可选:要启用
sky launch --clone-disk-from,您还需要为该角色拥有以下权限:
compute.disks.useReadOnly
compute.images.create
compute.images.get
compute.images.delete
可选:要在GCP集群上启用端口开放,您还需要为角色拥有以下权限:
compute.instances.setTags
compute.firewalls.list
compute.firewalls.update
可选:如果用户需要使用自定义机器镜像与
sky launch --image-id,您可以额外添加以下权限:
compute.disks.get
compute.disks.resize
compute.images.get
compute.images.useReadOnly
可选: 如果你的组织在~/.sky/config.yaml中设置了
gcp.prioritize_reservations或gcp.specific_reservations,你还可以添加以下权限:
compute.reservations.list
点击创建以创建角色。
返回“IAM”选项卡并点击授予访问权限。
在“添加主体”部分填写用户的电子邮件地址,并在“分配角色”部分选择
minimal-skypilot-role。点击保存。
用户应收到项目的邀请,并应能够按照安装中的说明设置SkyPilot。
服务账户#
注意
如果您在“服务账户”选项卡下已经有一个以skypilot-v1@开头的电子邮件地址的服务账户,那么它很可能是由SkyPilot自动创建的,您可以跳过本节。
点击IAM & 管理控制台中的“服务账户”标签,然后点击创建服务账户。
将服务账户ID设置为
skypilot-v1并点击创建并继续。
3. 选择在上一节中创建的minimal-skypilot-role(或您设置的名称),然后点击完成。您也可以选择使用默认或中等权限角色,如前面章节所述。
防火墙规则#
默认情况下,用户不需要设置任何特殊的防火墙规则即可开始使用SkyPilot。如果默认的VPC不满足最低要求的规则,将自动创建并使用一个具有足够规则的新VPC skypilot-vpc。
然而,如果您手动设置并指示SkyPilot使用自定义VPC(请参阅 下方),请确保它具有以下所需的防火墙规则:
# Allow internal connections between SkyPilot VMs:
#
# controller -> head node of a cluster
# head node of a cluster <-> worker node(s) of a cluster
#
# NOTE: these ports are more relaxed than absolute minimum, but the
# sourceRanges restrict the traffic to internal IPs.
{
"direction": "INGRESS",
"allowed": [
{"IPProtocol": "tcp", "ports": ["0-65535"]},
{"IPProtocol": "udp", "ports": ["0-65535"]},
],
"sourceRanges": ["10.128.0.0/9"],
},
# Allow SSH connections from user machine(s)
#
# NOTE: This can be satisfied using the following relaxed sourceRanges
# (0.0.0.0/0), but you can customize it if you want to restrict to certain
# known public IPs (useful when using internal VPN or proxy solutions).
{
"direction": "INGRESS",
"allowed": [
{"IPProtocol": "tcp", "ports": ["22"]},
],
"sourceRanges": ["0.0.0.0/0"],
},
您可以在
https://console.cloud.google.com/net-security/firewall-manager/firewall-policies/list?project=
检查和管理防火墙规则,或者使用任何GCP的SDK。
使用特定的VPC#
默认情况下,SkyPilot 使用以下行为来获取用于所有 GCP 实例的 VPC:
首先,检查项目中所有现有的VPC是否符合SkyPilot运行所需的最低推荐防火墙规则。如果有任何VPC满足这些规则,则使用该VPC。
否则,将自动创建一个名为
skypilot-vpc的新 VPC,并使用推荐的最小防火墙规则。这是一个自动模式的 VPC,每个区域自动启动一个子网。
要指示SkyPilot使用特定的VPC,您可以使用SkyPilot的全局配置文件~/.sky/config.yaml在gcp.vpc_name字段中指定VPC名称:
gcp:
vpc_name: my-vpc-name
详情请参见高级配置。示例用例包括使用私有VPC或具有细粒度约束的VPC,通常通过Terraform或手动创建。
自定义VPC应包含所需的防火墙规则。
使用内部IP#
出于安全原因,用户可能只想为SkyPilot实例使用内部IP。
为此,您可以使用SkyPilot的全局配置文件~/.sky/config.yaml来指定gcp.use_internal_ips和gcp.ssh_proxy_command字段(要查看详细语法,请参阅高级配置):
gcp:
use_internal_ips: true
# VPC with NAT setup, see below
vpc_name: my-vpc-name
ssh_proxy_command: ssh -W %h:%p -o StrictHostKeyChecking=no [email protected]
gcp.ssh_proxy_command 字段是可选的。如果 SkyPilot 在可以直接访问实例内部 IP 的机器上运行,则可以省略。否则,应将其设置为可用于代理 SSH 连接到实例内部 IP 的命令。
云NAT设置#
在GCP上创建的仅具有内部IP的实例默认情况下无法访问公共互联网。为了确保SkyPilot能够在实例上正确安装依赖项,需要为VPC设置云NAT(详情请参阅GCP的文档)。
Cloud NAT 是一个区域性资源,因此需要在 SkyPilot 使用的每个区域中创建。
要限制SkyPilot仅使用某些特定区域,你可以将gcp.ssh_proxy_command指定为一个从区域到该区域的SSH代理命令的字典映射(详情请参见高级配置):
gcp:
use_internal_ips: true
vpc_name: my-vpc-name
ssh_proxy_command:
us-west1: ssh -W %h:%p -o StrictHostKeyChecking=no [email protected]
us-east1: ssh -W %h:%p -o StrictHostKeyChecking=no [email protected]
如果不需要代理,但需要限制区域,可以将gcp.ssh_proxy_command设置为从区域到null的字典映射:
gcp:
use_internal_ips: true
vpc_name: my-vpc-name
ssh_proxy_command:
us-west1: null
us-east1: null
强制启用外部IP#
对于需要访问公共互联网但位于VPC中并通过其内部IP进行通信的实例,设置云NAT的替代方案是强制它们使用外部IP地址创建。
gcp:
use_internal_ips: true
vpc_name: my-vpc-name
force_enable_external_ips: true