部署指南#

下面我们提供了在不同环境中设置新的 Kubernetes 集群的精简指南,包括云上的托管服务。

本地开发集群

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

本地集群 (RKE2, K3s 等)

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

Google Cloud - GKE

Google 的托管式 Kubernetes 服务。

Amazon - EKS

Amazon 的托管式 Kubernetes 服务。

按需云虚拟机

我们提供在按需云虚拟机上部署 k8s 的脚本。

在您的笔记本电脑上进行本地部署#

为了在您的笔记本电脑上试用 SkyPilot on Kubernetes 或在无需任何云访问的情况下本地运行 SkyPilot 任务,我们提供了 sky local up CLI 来在本地创建一个 1 节点 Kubernetes 集群。

在底层,sky local up 使用 kind,一个用于在您的本地机器上创建 Kubernetes 集群的工具。它在容器内部运行 Kubernetes 集群,因此无需额外设置。

  1. 安装 Dockerkind

  2. 运行 sky local up 来启动一个 Kubernetes 集群并自动配置您的 kubeconfig 文件

    $ sky local up
    
  3. 运行 sky check 并验证 SkyPilot 中已启用 Kubernetes。现在您可以使用 sky launch 在此本地托管的 Kubernetes 集群上运行 SkyPilot 任务。

  4. 在使用完集群后,您可以使用 sky local down 将其移除。这将销毁本地 kubernetes 集群并将您的 kubeconfig 切换回其原始上下文

    $ sky local down
    

注意

我们建议为您的 Docker 运行时分配至少 4 个或更多 CPU,以确保 kind 拥有足够的资源。查看增加 CPU 分配的说明此处

注意

kind 不支持多节点和 GPU。不建议在生产环境中使用。如果您想运行私有本地集群,请参阅关于 本地部署 的部分了解更多信息。

在 Google Cloud GKE 上部署#

  1. 创建一个至少包含 1 个节点的 GKE 标准集群。我们建议创建至少包含 4 个 vCPU 的节点。

    示例:创建一个包含 2 个节点且每个节点有 16 个 CPU 的 GKE 集群。
    PROJECT_ID=$(gcloud config get-value project)
    CLUSTER_NAME=testcluster
    gcloud beta container --project "${PROJECT_ID}" clusters create "${CLUSTER_NAME}" --zone "us-central1-c" --no-enable-basic-auth --cluster-version "1.29.4-gke.1043002" --release-channel "regular" --machine-type "e2-standard-16" --image-type "COS_CONTAINERD" --disk-type "pd-balanced" --disk-size "100" --metadata disable-legacy-endpoints=true --scopes "https://www.googleapis.com/auth/devstorage.read_only","https://www.googleapis.com/auth/logging.write","https://www.googleapis.com/auth/monitoring","https://www.googleapis.com/auth/servicecontrol","https://www.googleapis.com/auth/service.management.readonly","https://www.googleapis.com/auth/trace.append" --num-nodes "2" --logging=SYSTEM,WORKLOAD --monitoring=SYSTEM --enable-ip-alias --network "projects/${PROJECT_ID}/global/networks/default" --subnetwork "projects/${PROJECT_ID}/regions/us-central1/subnetworks/default" --no-enable-intra-node-visibility --default-max-pods-per-node "110" --security-posture=standard --workload-vulnerability-scanning=disabled --no-enable-master-authorized-networks --addons HorizontalPodAutoscaling,HttpLoadBalancing,GcePersistentDiskCsiDriver --enable-autoupgrade --enable-autorepair --max-surge-upgrade 1 --max-unavailable-upgrade 0 --enable-managed-prometheus --enable-shielded-nodes --node-locations "us-central1-c"
    
  2. 获取您集群的 kubeconfig。以下命令将自动更新 ~/.kube/config,为 GKE 集群添加新的 kubecontext。

    $ gcloud container clusters get-credentials <cluster-name> --region <region>
    
    # Example:
    # gcloud container clusters get-credentials testcluster --region us-central1-c
    
  3. [如果使用 GPU] 对于 GKE 版本晚于 1.30.1-gke.115600,NVIDIA 驱动程序已预安装,无需额外设置。如果您使用较旧的 GKE 版本,您可能需要手动安装 NVIDIA 驱动程序以支持 GPU。您可以通过根据节点上的 GPU 和操作系统部署 daemonset 来完成此操作。

    # For Container Optimized OS (COS) based nodes with GPUs other than Nvidia L4 (e.g., V100, A100, ...):
    $ kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/cos/daemonset-preloaded.yaml
    
    # For Container Optimized OS (COS) based nodes with L4 GPUs:
    $ kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/cos/daemonset-preloaded-latest.yaml
    
    # For Ubuntu based nodes with GPUs other than Nvidia L4 (e.g., V100, A100, ...):
    $ kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/ubuntu/daemonset-preloaded.yaml
    
    # For Ubuntu based nodes with L4 GPUs:
    $ kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/ubuntu/daemonset-preloaded-R525.yaml
    

    提示

    要验证 GPU 驱动程序是否已设置,运行 kubectl describe nodes 并验证 nvidia.com/gpu 资源列在 Capacity 部分下方。

  4. 通过运行 sky check 来验证您的 kubernetes 集群是否已正确设置为 SkyPilot 使用

    $ sky check
    
  5. [如果使用 GPU] 使用 sky show-gpus --cloud k8s 检查 kubernetes 集群中的可用 GPU

    $ sky show-gpus --cloud k8s
    GPU   REQUESTABLE_QTY_PER_NODE  UTILIZATION
    L4    1, 2, 4                   6 of 8 free
    A100  1, 2                      2 of 4 free
    
    Kubernetes per node GPU availability
    NODE                       GPU       UTILIZATION
    my-cluster-0               L4        4 of 4 free
    my-cluster-1               L4        2 of 4 free
    my-cluster-2               A100      2 of 2 free
    my-cluster-3               A100      0 of 2 free
    

注意

当前不支持 GKE autopilot 集群。仅支持 GKE 标准集群。

在 Amazon EKS 上部署#

  1. 创建一个至少包含 1 个节点的 EKS 集群。我们建议创建至少包含 4 个 vCPU 的节点。

  2. 获取您集群的 kubeconfig。以下命令将自动更新 ~/.kube/config,为 EKS 集群添加新的 kubecontext。

    $ aws eks update-kubeconfig --name <cluster-name> --region <region>
    
    # Example:
    # aws eks update-kubeconfig --name testcluster --region us-west-2
    
  3. [如果使用 GPU] EKS 集群已预配置 Nvidia 驱动程序。但是,您需要用 GPU 类型标记节点。使用 SkyPilot 节点标记工具来完成此操作

    python -m sky.utils.kubernetes.gpu_labeler
    

    这将在每个节点上创建一个作业,用于从 nvidia-smi 读取 GPU 类型并为节点分配一个 skypilot.co/accelerator 标签。您可以通过运行...来检查这些作业的状态

    kubectl get jobs -n kube-system
    
  4. 通过运行 sky check 来验证您的 kubernetes 集群是否已正确设置为 SkyPilot 使用

    $ sky check
    
  5. [如果使用 GPU] 使用 sky show-gpus --cloud k8s 检查 kubernetes 集群中的可用 GPU

    $ sky show-gpus --cloud k8s
    GPU   REQUESTABLE_QTY_PER_NODE  UTILIZATION
    A100  1, 2                      2 of 2 free
    
    Kubernetes per node GPU availability
    NODE                       GPU       UTILIZATION
    my-cluster-0               A100      2 of 2 free
    

在本地集群上部署#

如果您拥有本地集群的 IP 地址列表和 SSH 凭据,您可以按照我们的 使用现有机器 指南在您的本地集群上设置 SkyPilot。

或者,您也可以使用现成的工具在本地集群上部署 Kubernetes,例如 kubeadmk3sRancher。请按照它们各自的指南来部署您的 Kubernetes 集群。

特定 Kubernetes 发行版的注意事项#

一些 Kubernetes 发行版需要额外步骤来设置 GPU 支持。

Rancher Kubernetes Engine 2 (RKE2)#

通过 helm 在 RKE2 上安装 Nvidia GPU operator 需要额外参数来将 nvidia 设置为 containerd 的默认运行时。

$ helm install gpu-operator -n gpu-operator --create-namespace \
  nvidia/gpu-operator $HELM_OPTIONS \
    --set 'toolkit.env[0].name=CONTAINERD_CONFIG' \
    --set 'toolkit.env[0].value=/var/lib/rancher/rke2/agent/etc/containerd/config.toml.tmpl' \
    --set 'toolkit.env[1].name=CONTAINERD_SOCKET' \
    --set 'toolkit.env[1].value=/run/k3s/containerd/containerd.sock' \
    --set 'toolkit.env[2].name=CONTAINERD_RUNTIME_CLASS' \
    --set 'toolkit.env[2].value=nvidia' \
    --set 'toolkit.env[3].name=CONTAINERD_SET_AS_DEFAULT' \
    --set-string 'toolkit.env[3].value=true'

请参考关于 使用 Helm 在 RKE2 上安装 Nvidia GPU Operator 的说明获取详细信息。

K3s#

在 K3s 上安装 Nvidia GPU operator 类似于 来自 Nvidia 的 RKE2 说明,但需要将 CONTAINERD_CONFIG 变量更改为 /var/lib/rancher/k3s/agent/etc/containerd/config.toml.tmpl。以下是在 K3s 上安装 Nvidia GPU operator 的示例命令

$ helm install gpu-operator -n gpu-operator --create-namespace \
  nvidia/gpu-operator $HELM_OPTIONS \
    --set 'toolkit.env[0].name=CONTAINERD_CONFIG' \
    --set 'toolkit.env[0].value=/var/lib/rancher/k3s/agent/etc/containerd/config.toml' \
    --set 'toolkit.env[1].name=CONTAINERD_SOCKET' \
    --set 'toolkit.env[1].value=/run/k3s/containerd/containerd.sock' \
    --set 'toolkit.env[2].name=CONTAINERD_RUNTIME_CLASS' \
    --set 'toolkit.env[2].value=nvidia'

通过运行 kubectl get pods -n gpu-operator 来检查 GPU operator 安装状态。安装需要几分钟,安装过程中可能会出现一些 CrashLoopBackOff 错误。

提示

如果您的 gpu-operator 安装一直停留在 CrashLoopBackOff 状态,您可能需要为 ldconfig 二进制文件创建符号链接,以解决 已知问题 的 nvidia-docker 运行时问题。在您的节点上运行以下命令

$ ln -s /sbin/ldconfig /sbin/ldconfig.real

安装 GPU operator 后,创建 K3s 所需的 nvidia RuntimeClass。SkyPilot 将自动使用此运行时类来调度 GPU Pod。

$ kubectl apply -f - <<EOF
apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
  name: nvidia
handler: nvidia
EOF

在云虚拟机上部署#

您还可以启动按需云虚拟机并在其上部署 Kubernetes。

我们提供脚本来处理虚拟机的配置、Kubernetes 的安装、GPU 支持的设置以及本地 kubeconfig 的配置。请参考我们的 在虚拟机上部署 Kubernetes 指南 获取更多详细信息。