Kubernetes集群设置#

注意

这是集群管理员关于如何设置Kubernetes集群以与SkyPilot一起使用的指南。

如果您是SkyPilot用户,并且您的集群管理员已经设置了一个集群并与您共享了一个kubeconfig文件,向Kubernetes提交任务解释了如何向您的集群提交任务。

⚙️ Setup Kubernetes Cluster

配置您的Kubernetes集群以运行SkyPilot。

✅️ Verify Setup

确保您的集群已正确设置为SkyPilot。

👀️ Observability

使用您现有的Kubernetes工具来监控SkyPilot资源。

为SkyPilot设置Kubernetes集群#

为了准备一个Kubernetes集群来运行SkyPilot,集群管理员必须:

  1. 部署一个集群 运行 Kubernetes v1.20 或更高版本。

  2. 设置 GPU 支持

  3. [可选] 设置端口 用于暴露服务。

  4. [可选] 设置权限: 为您的用户创建一个命名空间和/或为SkyPilot创建一个具有最小权限的服务账户。

完成这些步骤后,管理员可以与用户共享kubeconfig文件,用户随后可以使用SkyPilot向集群提交任务。

步骤 1 - 部署一个 Kubernetes 集群#

提示

如果您已经有一个Kubernetes集群,请跳过此步骤。

下面我们链接到在不同环境中设置新Kubernetes集群的简要指南,包括云上的托管服务。

Local Development Cluster

在您的笔记本电脑上使用 sky local up 运行一个本地 Kubernetes 集群。

On-prem Clusters (RKE2, K3s, etc.)

适用于使用kubeadm、RKE2、K3s或其他发行版的本地部署。

Google Cloud - GKE

谷歌托管的Kubernetes服务。

Amazon - EKS

亚马逊托管的Kubernetes服务。

步骤2 - 设置GPU支持#

要在Kubernetes上使用GPU,您的集群必须:

  1. 在所有GPU节点上提供nvidia.com/gpu 资源,并将nvidia设置为容器引擎的默认运行时。

  2. 每个节点上都有一个标签,指定GPU类型。有关更多详细信息,请参阅设置GPU标签

提示

要验证在步骤1之后是否安装了Nvidia GPU Operator并且nvidia运行时已设置为默认值,请运行:

$ kubectl apply -f https://raw.githubusercontent.com/skypilot-org/skypilot/master/tests/kubernetes/gpu_test_pod.yaml
$ watch kubectl get pods
# If the pod status changes to completed after a few minutes, Nvidia GPU driver is set up correctly. Move on to setting up GPU labels.

注意

请参考特定Kubernetes发行版的注意事项以获取在特定Kubernetes发行版(如RKE2和K3s)上设置GPU支持的额外说明。

设置GPU标签#

提示

如果您的集群已安装Nvidia GPU Operator或您正在使用GKE或Karpenter,您的集群已经具有必要的GPU标签。您可以跳过此部分。

要使用SkyPilot的GPU,集群节点必须标记GPU类型。这告诉SkyPilot集群上可用的GPU类型。

当前支持的标签有:

  • nvidia.com/gpu.product: 由Nvidia GPU Operator自动创建。

  • cloud.google.com/gke-accelerator: 由GKE集群使用。

  • karpenter.k8s.aws/instance-gpu-name: 由Karpenter使用。

  • skypilot.co/accelerator: 如果上述标签都不存在,SkyPilot 使用的自定义标签。

这些标签中的任何一个都足以让SkyPilot在集群上检测到GPU。

提示

要检查您的节点是否包含必要的标签,请运行:

output=$(kubectl get nodes --show-labels | awk -F'[, ]' '{for (i=1; i<=NF; i++) if ($i ~ /nvidia.com\/gpu.product=|cloud.google.com\/gke-accelerator=|karpenter.k8s.aws\/instance-gpu-name=|skypilot.co\/accelerator=/) print $i}')
if [ -z "$output" ]; then
  echo "No valid GPU labels found."
else
  echo "GPU Labels found:"
  echo "$output"
fi

自动标记节点#

如果您的集群上没有上述任何标签,我们提供了一个便捷的脚本,可以自动检测GPU类型并使用skypilot.co/accelerator标签标记每个节点。您可以通过以下方式运行它:

$ python -m sky.utils.kubernetes.gpu_labeler

Created GPU labeler job for node ip-192-168-54-76.us-west-2.compute.internal
Created GPU labeler job for node ip-192-168-93-215.us-west-2.compute.internal
GPU labeling started - this may take 10 min or more to complete.
To check the status of GPU labeling jobs, run `kubectl get jobs --namespace=kube-system -l job=sky-gpu-labeler`
You can check if nodes have been labeled by running `kubectl describe nodes` and looking for labels of the format `skypilot.co/accelerator: <gpu_name>`.

注意

如果GPU标记过程失败,您可以运行python -m sky.utils.kubernetes.gpu_labeler --cleanup来清理失败的任务。

手动标记节点#

如果需要,您也可以手动标记节点。标签的格式必须为 skypilot.co/accelerator: ,其中 是 GPU 的小写名称。

例如,一个带有H100 GPU的节点必须有一个标签 skypilot.co/accelerator: h100

使用以下命令来标记一个节点:

kubectl label nodes <node-name> skypilot.co/accelerator=<gpu_name>

注意

GPU标签区分大小写。如果您使用的是skypilot.co/accelerator标签,请确保GPU名称为小写。

[可选] 步骤 3 - 设置暴露服务#

提示

如果您正在使用GKE或EKS,或者不打算在Kubernetes上公开端口(例如sky launch --ports,SkyServe),则不需要额外的设置。在GKE和EKS上,SkyPilot将自动创建一个LoadBalancer服务。

运行SkyServe或暴露端口的任务需要额外的设置来暴露运行服务的端口。 SkyPilot支持两种模式来暴露端口:

有关更多详细信息,请参阅在Kubernetes上暴露服务

[可选] 步骤 4 - 命名空间和服务账户设置#

提示

此步骤是可选的,仅在特定环境中需要。默认情况下,SkyPilot 在当前配置的 kube-context 命名空间中运行,并创建一个名为 skypilot-service-account 的服务账户来运行任务。 如果您使用这些默认设置,则不需要此步骤。

如果您的集群需要将SkyPilot任务隔离到特定的命名空间并限制授予用户的权限,您可以为SkyPilot创建一个新的命名空间和服务账户。

服务账户所需的最低权限可以在Minimal Kubernetes Permissions页面找到。

为了简化设置,我们提供了一个脚本,该脚本为给定的服务账户名称和命名空间创建具有必要权限的命名空间和服务账户。

# Download the script
wget https://raw.githubusercontent.com/skypilot-org/skypilot/master/sky/utils/kubernetes/generate_kubeconfig.sh
chmod +x generate_kubeconfig.sh

# Execute the script to generate a kubeconfig file with the service account and namespace
# Replace my-sa and my-namespace with your desired service account name and namespace
# The script will create the namespace if it does not exist and create a service account with the necessary permissions.
SKYPILOT_SA_NAME=my-sa SKYPILOT_NAMESPACE=my-namespace ./generate_kubeconfig.sh

您可以将生成的kubeconfig文件分发给用户,然后他们可以使用它向集群提交任务。

验证设置#

一旦集群部署完成并且您已将kubeconfig放置在~/.kube/config,通过运行sky check来验证您的设置:

sky check kubernetes

这应该显示 Kubernetes: Enabled 没有任何警告。

你也可以通过运行以下命令来检查节点上可用的GPU:

$ sky show-gpus --cloud k8s
Kubernetes GPUs
GPU   REQUESTABLE_QTY_PER_NODE  TOTAL_GPUS  TOTAL_FREE_GPUS
L4    1, 2, 4                   12          12
H100  1, 2, 4, 8                16          16

Kubernetes per node GPU availability
NODE_NAME                  GPU_NAME  TOTAL_GPUS  FREE_GPUS
my-cluster-0               L4        4           4
my-cluster-1               L4        4           4
my-cluster-2               L4        2           2
my-cluster-3               L4        2           2
my-cluster-4               H100      8           8
my-cluster-5               H100      8           8

管理员的可观测性#

所有的SkyPilot任务都在Kubernetes集群中的pod中运行。作为集群管理员,您可以检查正在运行的pod(例如,使用kubectl get pods -n namespace)以查看哪些任务正在运行以及它们在集群上消耗了多少资源。

下面,我们提供了一些关于如何在您的Kubernetes集群上监控SkyPilot资源的提示。

列出所有用户的SkyPilot资源#

我们提供了一个便捷的命令,sky status --k8s,用于查看集群中所有SkyPilot资源的状态。

sky status仅列出当前用户启动的SkyPilot资源不同, sky status --k8s列出了集群中所有用户的所有SkyPilot资源。

$ sky status --k8s
Kubernetes cluster state (context: mycluster)
SkyPilot clusters
USER     NAME                           LAUNCHED    RESOURCES                                  STATUS
alice    infer-svc-1                    23 hrs ago  1x Kubernetes(cpus=1, mem=1, {'L4': 1})    UP
alice    sky-jobs-controller-80b50983   2 days ago  1x Kubernetes(cpus=4, mem=4)               UP
alice    sky-serve-controller-80b50983  23 hrs ago  1x Kubernetes(cpus=4, mem=4)               UP
bob      dev                            1 day ago   1x Kubernetes(cpus=2, mem=8, {'H100': 1})  UP
bob      multinode-dev                  1 day ago   2x Kubernetes(cpus=2, mem=2)               UP
bob      sky-jobs-controller-2ea485ea   2 days ago  1x Kubernetes(cpus=4, mem=4)               UP

Managed jobs
In progress tasks: 1 STARTING
USER     ID  TASK  NAME      RESOURCES   SUBMITTED   TOT. DURATION  JOB DURATION  #RECOVERIES  STATUS
alice    1   -     eval      1x[CPU:1+]  2 days ago  49s            8s            0            SUCCEEDED
bob      4   -     pretrain  1x[H100:4]  1 day ago   1h 1m 11s      1h 14s        0            SUCCEEDED
bob      3   -     bigjob    1x[CPU:16]  1 day ago   1d 21h 11m 4s  -             0            STARTING
bob      2   -     failjob   1x[CPU:1+]  1 day ago   54s            9s            0            FAILED
bob      1   -     shortjob  1x[CPU:1+]  2 days ago  1h 1m 19s      1h 16s        0            SUCCEEDED

Kubernetes仪表板#

您可以部署诸如Kubernetes仪表板之类的工具,以便轻松查看和管理集群上的SkyPilot资源。

Kubernetes 仪表板

作为演示,我们提供了一个示例 Kubernetes 仪表板部署清单,您可以使用以下命令进行部署:

$ kubectl apply -f https://raw.githubusercontent.com/skypilot-org/skypilot/master/tests/kubernetes/scripts/dashboard.yaml

要访问仪表板,请运行:

$ kubectl proxy

在浏览器中,打开 http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/ 并在提示输入凭据时点击跳过。

请注意,此仪表板只能从执行kubectl proxy命令的机器访问。

注意

演示仪表板不安全,不应在生产环境中使用。请参阅 Kubernetes 文档 以获取有关如何为仪表板设置访问控制的更多信息。

Kubernetes 设置故障排除#

如果您在设置Kubernetes集群时遇到问题,请参考故障排除指南来诊断和解决问题。