多 Kubernetes 集群#

SkyPilot 允许您通过一个单一的界面管理跨多个 Kubernetes 集群的开发 Pod、作业和服务。

您可能有多个 Kubernetes 集群用于不同的

  • 用例:例如,生产集群和开发/测试集群。

  • 区域或云:例如,美国和欧盟区域;或 AWS 和 Lambda 云。

  • 加速器:例如,NVIDIA H100 集群和 Google TPU 集群。

  • 配置:例如,用于单个节点的小型集群和用于多个节点的大型集群。

  • Kubernetes 版本:例如,要将集群从 Kubernetes 1.20 升级到 1.21,您可以创建一个新的 Kubernetes 集群以避免停机或意外错误。

../../_images/multi-kubernetes.svg

配置#

步骤 1:设置凭据#

要使用多个 Kubernetes 集群,必须在本地的 ~/.kube/config 文件中将它们的凭据设置为单独的上下文(context)

有关部署新集群和获取凭据的信息,请参阅部署指南

例如,一个 ~/.kube/config 文件可能如下所示

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data:
    ...
    server: https://xx.xx.xx.xx:45819
  name: my-h100-cluster
- cluster:
    certificate-authority-data:
    ...
    server: https://yy.yy.yy.yy:45819
  name: my-tpu-cluster
contexts:
- context:
    cluster: my-h100-cluster
    user: my-h100-cluster
  name: my-h100-cluster
- context:
    cluster: my-tpu-cluster
    namespace: my-namespace
    user: my-tpu-cluster
  name: my-tpu-cluster
current-context: my-h100-cluster
...

在这个示例中,我们有两个 Kubernetes 集群:my-h100-clustermy-tpu-cluster,并且每个 Kubernetes 集群都有一个对应的上下文。

步骤 2:设置 SkyPilot 以访问多个 Kubernetes 集群#

与云不同,SkyPilot 默认不会通过不同的 Kubernetes 集群(区域)进行故障转移,因为每个 Kubernetes 集群可能有不同的用途。

默认情况下,SkyPilot 只使用 kubeconfig 中 current-context 设置的上下文。您可以通过运行 kubectl config current-context 来获取当前上下文。

要允许 SkyPilot 访问多个 Kubernetes 集群,您可以在 SkyPilot 全局配置文件 ~/.sky/config.yaml 中设置 kubernetes.allowed_contexts

kubernetes:
  allowed_contexts:
    - my-h100-cluster
    - my-tpu-cluster

要检查已启用的 Kubernetes 集群,您可以运行 sky check k8s

$ sky check k8s

🎉 Enabled clouds 🎉
  ✔ Kubernetes
    Allowed contexts:
    ├── my-h100-cluster
    └── my-tpu-cluster

要检查 Kubernetes 集群中可用的 GPU,您可以运行 sky show-gpus --cloud k8s

$ sky show-gpus --cloud k8s
Kubernetes GPUs
GPU   UTILIZATION
H100  16 of 16 free
A100  8 of 8 free
Context: my-h100-cluster
GPU   REQUESTABLE_QTY_PER_NODE  UTILIZATION
H100  1, 2, 4, 8                16 of 16 free
Context: kind-skypilot
GPU   REQUESTABLE_QTY_PER_NODE  UTILIZATION
A100  1, 2, 4, 8                8 of 8 free
Kubernetes per-node GPU availability
CONTEXT          NODE                                          GPU       UTILIZATION
my-h100-cluster  gke-skypilotalpha-default-pool-ff931856-6uvd  -         0 of 0 free
my-h100-cluster  gke-skypilotalpha-largecpu-05dae726-1usy      H100      8 of 8 free
my-h100-cluster  gke-skypilotalpha-largecpu-05dae726-4rxa      H100      8 of 8 free
kind-skypilot    skypilot-control-plane                        A100      8 of 8 free

跨多个 Kubernetes 集群的故障转移#

设置 kubernetes.allowed_contexts 配置后,SkyPilot 将按照该字段中指定的顺序在 Kubernetes 集群之间进行故障转移。

$ sky launch --gpus H100 --cloud k8s echo 'Hello World'

Considered resources (1 node):
------------------------------------------------------------------------------------------------------------
CLOUD        INSTANCE           vCPUs   Mem(GB)   ACCELERATORS   REGION/ZONE           COST ($)   CHOSEN
------------------------------------------------------------------------------------------------------------
Kubernetes   2CPU--8GB--1H100   2       8         H100:1         my-h100-cluster-gke   0.00          ✔
Kubernetes   2CPU--8GB--1H100   2       8         H100:1         my-h100-cluster-eks   0.00
------------------------------------------------------------------------------------------------------------

在特定的 Kubernetes 集群中启动#

SkyPilot 使用 region 字段来表示 Kubernetes 上下文。您可以通过指定该集群的上下文名称作为 --region 来指向一个 Kubernetes 集群。

$ # Launch in a specific Kubernetes cluster.
$ sky launch --cloud k8s --region my-tpu-cluster echo 'Hello World'

$ # Check the GPUs available in a Kubernetes cluster
$ sky show-gpus --cloud k8s --region my-h100-cluster                                                   Kubernetes GPUs
Context: my-h100-cluster
GPU   REQUESTABLE_QTY_PER_NODE  UTILIZATION
H100  1, 2, 4, 8                16 of 16 free
Kubernetes per-node GPU availability
CONTEXT          NODE                                          GPU       UTILIZATION
my-h100-cluster  gke-skypilotalpha-default-pool-ff931856-6uvd  -         0 of 0 free
my-h100-cluster  gke-skypilotalpha-largecpu-05dae726-1usy      H100      8 of 8 free
my-h100-cluster  gke-skypilotalpha-largecpu-05dae726-4rxa      H100      8 of 8 free

启动 SkyPilot 集群或任务时,您也可以通过 --region 指定上下文名称,以在该集群中启动集群或任务。

动态更新要使用的集群#

您可以配置 SkyPilot 动态获取 Kubernetes 集群配置并强制限制使用哪些集群。更多信息请参阅动态更新要使用的 Kubernetes 上下文