操作指南:持久化调度器任务
调度器服务负责将任务写入其嵌入的Etcd数据库并调度执行。
默认情况下,调度器服务数据库会将数据写入大小为1Gb
的持久卷声明(Persistent Volume Claim),使用集群的默认存储类。
这意味着在大多数Kubernetes部署中运行调度器服务不需要额外参数,但如果没有默认的StorageClass或在生产环境中运行时,您将需要进行额外的配置。
警告
调度器的默认存储大小为1Gi
,这对于大多数生产部署来说可能不够。
请注意,当启用SchedulerReminders预览功能时,调度器会用于actor提醒、工作流以及任务API。
您可能需要考虑重新安装Dapr,并将调度器存储增加到至少16Gi
或更多。
有关更多信息,请参见下面的ETCD存储磁盘大小部分。
生产环境设置
ETCD存储磁盘大小
调度器的默认存储大小为1Gb
。
这个大小对于大多数生产部署来说可能不够。
当存储大小超出时,调度器将记录类似以下的错误:
error running scheduler: etcdserver: mvcc: database space exceeded
确定存储大小的安全上限并不是一门精确的科学,主要取决于应用程序任务的数量、持久性和数据负载大小。 任务API和actor提醒(启用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
要扩展调度器的存储大小,请按照以下步骤操作:
- 首先,确保存储类支持卷扩展,并且
allowVolumeExpansion
字段设置为true
,如果尚未设置。
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: standard
provisioner: my.driver
allowVolumeExpansion: true
...
- 删除调度器StatefulSet,同时保留绑定的持久卷声明。
kubectl delete sts -n dapr-system dapr-scheduler-server --cascade=orphan
- 通过编辑
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
- 通过安装具有所需存储大小的Dapr重新创建调度器StatefulSet。
存储类
如果您的Kubernetes部署没有默认存储类或您正在配置生产集群,则需要定义存储类。
持久卷由托管的云提供商或Kubernetes基础设施平台提供的真实磁盘支持。 磁盘大小由预计一次持久化的任务数量决定;然而,64Gb对于大多数生产场景来说应该绰绰有余。 一些Kubernetes提供商建议使用CSI驱动来配置底层磁盘。 以下是为主要云提供商创建持久磁盘的相关文档的有用链接列表:
- Google Cloud Persistent Disk
- Amazon EBS Volumes
- Azure AKS Storage Options
- Digital Ocean Block Storage
- VMWare vSphere Storage
- OpenShift Persistent Storage
- Alibaba Cloud Disk Storage
一旦存储类可用,您可以使用以下命令安装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
Feedback
Was this page helpful?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.