GCP#

通常,管理员可以在三种“级别”的权限中进行选择,从最宽松且设置工作量最少,到最严格且设置工作量较多:

  • 默认:无需设置,授予用户所有者级别的权限(即您无需遵循本节中的说明)

  • Medium: 简单设置,具有中等权限集

  • Minimal: 更多设置,具有最小权限集

中等权限#

授予用户访问您的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服务的管理权限。如果您希望在您的组织/项目中为用户授予更细粒度和更小的权限,您可以按照以下步骤创建自定义角色:

用户#

  1. 前往GCP的IAM & 管理控制台并点击创建角色

GCP 创建角色
  1. 给角色一个描述性的名称,例如 minimal-skypilot-role

  2. 点击添加权限并搜索以下权限,然后将它们添加到角色中:

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.createcompute.firewalls.delete不是必需的。

注意

(高级)为了进一步限制iam.serviceAccounts.actAs权限仅访问SkyPilot的服务账户,您可以从上述列表中删除该权限,并额外授予您组织的用户使用管理员创建的skypilot-v1服务账户的能力(参见服务账户)。这可以通过转到IAM & Admin console -> Service Accounts -> skypilot-v1 -> Permissions -> GRANT ACCESS并添加具有roles/iam.serviceAccountUser角色的用户来完成。这允许用户使用SkyPilot所需的skypilot-v1服务账户。

  1. 可选:如果用户需要访问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
  1. 可选:如果用户需要访问TPU虚拟机,您可以额外添加以下权限(以下可能并不全面,如果您发现任何缺失的权限,请提交问题):

tpu.nodes.create
tpu.nodes.delete
tpu.nodes.list
tpu.nodes.get
tpu.nodes.update
tpu.operations.get
  1. 可选:要启用 sky launch --clone-disk-from,您还需要为该角色拥有以下权限:

compute.disks.useReadOnly
compute.images.create
compute.images.get
compute.images.delete
  1. 可选:要在GCP集群上启用端口开放,您还需要为角色拥有以下权限:

compute.instances.setTags
compute.firewalls.list
compute.firewalls.update
  1. 可选:如果用户需要使用自定义机器镜像与sky launch --image-id,您可以额外添加以下权限:

compute.disks.get
compute.disks.resize
compute.images.get
compute.images.useReadOnly
  1. 可选: 如果你的组织在~/.sky/config.yaml中设置了gcp.prioritize_reservationsgcp.specific_reservations,你还可以添加以下权限:

compute.reservations.list
  1. 点击创建以创建角色。

  2. 返回“IAM”选项卡并点击授予访问权限

  3. 在“添加主体”部分填写用户的电子邮件地址,并在“分配角色”部分选择minimal-skypilot-role。点击保存

GCP 授予访问权限
  1. 用户应收到项目的邀请,并应能够按照安装中的说明设置SkyPilot。

注意

使用上述最小权限创建的用户将无法创建要分配给SkyPilot实例的服务账户。

管理员需要按照以下说明创建一个服务账户,供项目中的所有用户共享。

服务账户#

注意

如果您在“服务账户”选项卡下已经有一个以skypilot-v1@开头的电子邮件地址的服务账户,那么它很可能是由SkyPilot自动创建的,您可以跳过本节。

  1. 点击IAM & 管理控制台中的“服务账户”标签,然后点击创建服务账户

GCP 创建服务账户
  1. 将服务账户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.yamlgcp.vpc_name字段中指定VPC名称:

gcp:
  vpc_name: my-vpc-name

详情请参见高级配置。示例用例包括使用私有VPC或具有细粒度约束的VPC,通常通过Terraform或手动创建。

自定义VPC应包含所需的防火墙规则

使用内部IP#

出于安全原因,用户可能只想为SkyPilot实例使用内部IP。 为此,您可以使用SkyPilot的全局配置文件~/.sky/config.yaml来指定gcp.use_internal_ipsgcp.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 使用的每个区域中创建。

GCP Cloud NAT

要限制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