部署指南#

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

Local Development Cluster

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

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

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

Google Cloud - GKE

谷歌托管的Kubernetes服务。

Amazon - EKS

亚马逊托管的Kubernetes服务。

On-demand Cloud VMs

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

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

要在您的笔记本电脑上尝试在Kubernetes上运行SkyPilot,或在不需要任何云访问的情况下本地运行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的节点。

    Example: create a GKE cluster with 2 nodes, each having 16 CPUs.
    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] 对于版本高于1.30.1-gke.115600的GKE,NVIDIA驱动程序已预安装,无需额外设置。如果您使用的是较旧的GKE版本,可能需要 手动安装 NVIDIA驱动程序以支持GPU。您可以通过部署守护进程集来实现,具体取决于节点上的GPU和操作系统:

    # 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  TOTAL_GPUS  TOTAL_FREE_GPUS
    L4    1, 2, 4                   8           6
    A100  1, 2                      4           2
    
    Kubernetes per node GPU availability
    NODE_NAME                  GPU_NAME  TOTAL_GPUS  FREE_GPUS
    my-cluster-0               L4        4           4
    my-cluster-1               L4        4           2
    my-cluster-2               A100      2           2
    my-cluster-3               A100      2           0
    

注意

目前不支持GKE自动驾驶集群。仅支持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  TOTAL_GPUS  TOTAL_FREE_GPUS
    A100  1, 2                      4           2
    
    Kubernetes per node GPU availability
    NODE_NAME                  GPU_NAME  TOTAL_GPUS  FREE_GPUS
    my-cluster-0               A100      2           2
    

在本地集群上部署#

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

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

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

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

Rancher Kubernetes Engine 2 (RKE2)#

在RKE2上通过helm安装Nvidia GPU操作符需要额外的标志来将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'

详情请参阅Nvidia GPU Operator installation with Helm on RKE2的说明。

K3s#

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

$ 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操作符的安装状态。安装过程需要几分钟,并且在安装过程中可能会出现一些CrashLoopBackOff错误。

提示

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

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

安装GPU操作符后,创建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指南