在 Kubernetes 集群间持久化 SkyPilot API Server 状态#

通过 Helm Chart 部署 SkyPilot API Server 时,API Server 具有容错能力,所有状态都通过 Kubernetes 集群中的 PVC 进行持久化。

为了进一步增强 SkyPilot API Server 在灾难性 Kubernetes 集群故障中的弹性,本指南将介绍如何配置 GCP 持久性卷 来持久化备份 SkyPilot 状态。

注意

此配置是可选的,仅建议用于应对罕见的灾难性集群故障(例如,整个集群删除)以增强弹性。

虽然本文档使用带有 GCP 持久性磁盘作为后端卷的 GKE 集群,但本指南也适用于提供 CSI Provider 到持久存储设备的其它托管 Kubernetes 产品。

TL;DR(太长不看):在另一个 GKE 集群上恢复 API Server#

如果您按照本指南在 GKE 集群上部署了 API Server,可以通过以下步骤在另一个 GKE 集群上恢复 API Server:

  1. 创建云凭据密钥

  2. 创建持久卷定义

  3. 使用 helm chart 部署 API Server,并指定相同的持久卷。

以下是端到端设置 GKE 集群和持久卷以创建持久 API Server 的说明。

先决条件#

在 GCP 上创建持久性磁盘#

首先,在 GCP 上创建一个持久性磁盘。此磁盘用于持久化 API Server 的状态。

export ZONE=us-east5-b
export DISK_SIZE=10G
export DISK_NAME=sky-api-server-state
# This variable will be used later in the example.
export PV_CLASS_NAME=sky-api-server-pv-class
gcloud compute disks create $DISK_NAME --zone=$ZONE --size $DISK_SIZE

请注意,$ZONE 变量必须与 GKE 集群的区域匹配。

在 GKE 上创建持久卷#

接下来,在 GKE 上创建一个持久卷,该卷使用刚刚创建的持久性磁盘。

sky-pv.yaml:

apiVersion: v1
kind: PersistentVolume
metadata:
    name: sky-api-server-pv
spec:
    storageClassName: $PV_CLASS_NAME
    capacity:
        storage: $DISK_SIZE
    accessModes:
        - ReadWriteOnce
    persistentVolumeReclaimPolicy: Retain
    csi:
        driver: pd.csi.storage.gke.io
        volumeHandle: projects/$PROJECT/zones/$ZONE/disks/$DISK_NAME
        fsType: ext4

替换上述 YAML 中的变量。

请注意,$PROJECT$ZONE 变量必须与 GKE 集群的项目和区域匹配。此外,$DISK_SIZE$DISK_NAME 必须与在 GCP 上创建的持久性磁盘的大小和名称匹配。

将持久卷应用到 Kubernetes 集群。

$ kubectl apply -f sky-pv.yaml

然后,验证持久卷是否以正确的保留策略创建

$ kubectl get persistentvolume/sky-api-server-pv
NAME                CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS              VOLUMEATTRIBUTESCLASS   REASON   AGE
sky-api-server-pv   10G        RWO            Retain           Available           sky-api-server-pv-class   <unset>                          18s

RECLAIM POLICY 应设置为 Retain

使用 Helm 部署 API Server#

接下来,使用以下命令通过 Helm 部署 API Server。

# NAMESPACE is the namespace to deploy the API server in
export NAMESPACE=skypilot
# RELEASE_NAME is the name of the helm release, must be unique within the namespace
export RELEASE_NAME=skypilot
# Replace with your username and password to configure the basic auth credentials for the API server
export WEB_USERNAME=skypilot
export WEB_PASSWORD=yourpassword
export AUTH_STRING=$(htpasswd -nb $WEB_USERNAME $WEB_PASSWORD)
# Deploy the API server
helm upgrade --install $RELEASE_NAME skypilot/skypilot-nightly --devel \
--namespace $NAMESPACE \
--create-namespace \
--set ingress.authCredentials=$AUTH_STRING \
--set storage.storageClassName=$PV_CLASS_NAME \
--set storage.size=$DISK_SIZE

请注意命令的最后两行

--set storage.storageClassName=$PV_CLASS_NAME
--set storage.size=$DISK_SIZE.

这些行将 API Server 与在 在 GKE 上创建持久卷 中创建的持久卷相关联,从而允许 API Server 使用该持久卷存储其状态。

清理#

删除用于此练习的 GKE 集群。

删除 GCP 上的持久性磁盘。

gcloud compute disks delete $DISK_NAME --zone=$ZONE