Kubernetes集群设置#
注意
这是集群管理员关于如何设置Kubernetes集群以与SkyPilot一起使用的指南。
如果您是SkyPilot用户,并且您的集群管理员已经设置了一个集群并与您共享了一个kubeconfig文件,向Kubernetes提交任务解释了如何向您的集群提交任务。
为SkyPilot设置Kubernetes集群#
为了准备一个Kubernetes集群来运行SkyPilot,集群管理员必须:
部署一个集群 运行 Kubernetes v1.20 或更高版本。
设置 GPU 支持。
[可选] 设置端口 用于暴露服务。
[可选] 设置权限: 为您的用户创建一个命名空间和/或为SkyPilot创建一个具有最小权限的服务账户。
完成这些步骤后,管理员可以与用户共享kubeconfig文件,用户随后可以使用SkyPilot向集群提交任务。
步骤 1 - 部署一个 Kubernetes 集群#
提示
如果您已经有一个Kubernetes集群,请跳过此步骤。
下面我们链接到在不同环境中设置新Kubernetes集群的简要指南,包括云上的托管服务。
步骤2 - 设置GPU支持#
要在Kubernetes上使用GPU,您的集群必须:
在所有GPU节点上提供
nvidia.com/gpu资源,并将nvidia设置为容器引擎的默认运行时。如果您正在遵循我们的部署指南或使用GKE或EKS,这应该已经设置好了。否则,请安装Nvidia GPU Operator。
每个节点上都有一个标签,指定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 仪表板部署清单,您可以使用以下命令进行部署:
$ 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集群时遇到问题,请参考故障排除指南来诊断和解决问题。