在 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:
创建云凭据密钥
创建持久卷定义
使用 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