操作指南:持久化调度器任务

配置调度器以持久化其数据库,使其在重启时具有弹性

调度器服务负责将任务写入其嵌入的Etcd数据库并调度执行。 默认情况下,调度器服务数据库会将数据写入大小为1Gb的持久卷声明(Persistent Volume Claim),使用集群的默认存储类。 这意味着在大多数Kubernetes部署中运行调度器服务不需要额外参数,但如果没有默认的StorageClass或在生产环境中运行时,您将需要进行额外的配置

生产环境设置

ETCD存储磁盘大小

调度器的默认存储大小为1Gb。 这个大小对于大多数生产部署来说可能不够。 当存储大小超出时,调度器将记录类似以下的错误:

error running scheduler: etcdserver: mvcc: database space exceeded

确定存储大小的安全上限并不是一门精确的科学,主要取决于应用程序任务的数量、持久性和数据负载大小。 任务APIactor提醒(启用SchedulerReminders预览功能时)会根据应用程序的使用情况进行映射。 工作流(启用SchedulerReminders预览功能时)会创建大量的任务作为actor提醒,但这些任务是短暂的,与每个工作流执行的生命周期相匹配。 工作流创建的任务的数据负载通常为空或很小。

调度器使用Etcd作为其存储后端数据库。 根据设计,Etcd以预写日志(WAL)和快照的形式持久化历史事务和数据。 这意味着调度器的实际磁盘使用量将高于当前可观察的数据库状态,通常是多个倍数。

在安装时设置存储大小

如果您需要增加现有调度器的存储大小,请参见下面的增加现有调度器存储大小部分。 要增加Dapr安装的存储大小(在此示例中为16Gi),您可以使用以下命令:


dapr init -k --set dapr_scheduler.cluster.storageSize=16Gi --set dapr_scheduler.etcdSpaceQuota=16Gi

helm upgrade --install dapr dapr/dapr \
--version=1.14 \
--namespace dapr-system \
--create-namespace \
--set dapr_scheduler.cluster.storageSize=16Gi \
--set dapr_scheduler.etcdSpaceQuota=16Gi \
--wait

增加现有调度器存储大小

默认情况下,每个调度器会为每个副本创建一个大小为1Gi的持久卷和持久卷声明,使用默认的standard存储类。 这些将类似于以下内容,在此示例中我们以HA模式运行调度器。

NAMESPACE     NAME                                              STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
dapr-system   dapr-scheduler-data-dir-dapr-scheduler-server-0   Bound    pvc-9f699d2e-f347-43b0-aa98-57dcf38229c5   1Gi        RWO            standard       <unset>                 3m25s
dapr-system   dapr-scheduler-data-dir-dapr-scheduler-server-1   Bound    pvc-f4c8be7b-ffbe-407b-954e-7688f2482caa   1Gi        RWO            standard       <unset>                 3m25s
dapr-system   dapr-scheduler-data-dir-dapr-scheduler-server-2   Bound    pvc-eaad5fb1-98e9-42a5-bcc8-d45dba1c4b9f   1Gi        RWO            standard       <unset>                 3m25s
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                                                         STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE
pvc-9f699d2e-f347-43b0-aa98-57dcf38229c5   1Gi        RWO            Delete           Bound    dapr-system/dapr-scheduler-data-dir-dapr-scheduler-server-0   standard       <unset>                          4m24s
pvc-eaad5fb1-98e9-42a5-bcc8-d45dba1c4b9f   1Gi        RWO            Delete           Bound    dapr-system/dapr-scheduler-data-dir-dapr-scheduler-server-2   standard       <unset>                          4m24s
pvc-f4c8be7b-ffbe-407b-954e-7688f2482caa   1Gi        RWO            Delete           Bound    dapr-system/dapr-scheduler-data-dir-dapr-scheduler-server-1   standard       <unset>                          4m24s

要扩展调度器的存储大小,请按照以下步骤操作:

  1. 首先,确保存储类支持卷扩展,并且allowVolumeExpansion字段设置为true,如果尚未设置。
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: standard
provisioner: my.driver
allowVolumeExpansion: true
...
  1. 删除调度器StatefulSet,同时保留绑定的持久卷声明。
kubectl delete sts -n dapr-system dapr-scheduler-server --cascade=orphan
  1. 通过编辑spec.resources.requests.storage字段,将持久卷声明的大小增加到所需大小。 在这种情况下,我们假设调度器以3个副本的HA模式运行。
kubectl edit pvc -n dapr-system dapr-scheduler-data-dir-dapr-scheduler-server-0 dapr-scheduler-data-dir-dapr-scheduler-server-1 dapr-scheduler-data-dir-dapr-scheduler-server-2
  1. 通过安装具有所需存储大小的Dapr重新创建调度器StatefulSet。

存储类

如果您的Kubernetes部署没有默认存储类或您正在配置生产集群,则需要定义存储类。

持久卷由托管的云提供商或Kubernetes基础设施平台提供的真实磁盘支持。 磁盘大小由预计一次持久化的任务数量决定;然而,64Gb对于大多数生产场景来说应该绰绰有余。 一些Kubernetes提供商建议使用CSI驱动来配置底层磁盘。 以下是为主要云提供商创建持久磁盘的相关文档的有用链接列表:

一旦存储类可用,您可以使用以下命令安装Dapr,并将调度器配置为使用存储类(将my-storage-class替换为存储类的名称):


dapr init -k --set dapr_scheduler.cluster.storageClassName=my-storage-class

helm upgrade --install dapr dapr/dapr \
--version=1.14 \
--namespace dapr-system \
--create-namespace \
--set dapr_scheduler.cluster.storageClassName=my-storage-class \
--wait

临时存储

在非HA模式下运行时,调度器可以选择使用临时存储,即内存存储,这种存储在重启时具有弹性。例如,调度器重启后,所有任务数据都会丢失。 这在非生产部署或测试中很有用,在这些情况下存储不可用或不需要。


dapr init -k --set dapr_scheduler.cluster.inMemoryStorage=true

helm upgrade --install dapr dapr/dapr \
--version=1.14 \
--namespace dapr-system \
--create-namespace \
--set dapr_scheduler.cluster.inMemoryStorage=true \
--wait