傻瓜式教学:部署云原生存储Longhorn
本文最后更新于 504 天前, 如有失效请评论区留言.
傻瓜式教学: 在k3s上部署云原生存储Longhorn, 本文以当前最新版本1.5.1为例.
简介
Longhorn是一个轻量级、可靠且功能强大的分布式块存储系统,适用于 Kubernetes。使用容器和微服务实现分布式块存储。Longhorn 为每个块储存设备卷创建一个专用的存储控制器,并在存储在多个节点上的多个副本之间同步复制该卷。存储控制器和副本本身是使用 Kubernetes 编排的。Longhorn 是免费的开源软件。它最初由Rancher Labs开发,现在作为云原生计算基金会的孵化项目进行开发。
能干什么
仅列出我用的上的,更多功能请参考官方文档
- 提供Kubernetes卷
- 高可用(跨多个节点和数据中心复制块存储)
- 备份数据存储在外部存储(如S3/Minio/NFS)
- 支持跨集群灾难恢复卷
- 定期快照并备份到外部存储
- 备份还原
- 不中断持久卷的情况下升级(刚刚操作过, 从1.4.1升级到1.5.1, 该特效好像1.4版本才支持)
架构介绍
细节可以参考官方文档
这里简单说下:
- 控制平面(
Longhorn Manager
),负责在Kubernetes集群中创建和管理卷, 以及CSI相关API的调用等, 通常以DaemonSet的形式运行在每个节点上 - 数据平面(
Longhorn Engine
)
每个卷都有专门的Longhorn Engine
控制器, 每个LE控制器都有多个副本,当某个副本或者控制器有问题都不会影响所有副本或Pod对卷的访问。
安装部署
注意我的集群已完成下述操作了
- 安装了iscsi和nfs-client等, 请参考官方文档
- 集群runtime是docker, 默认已经配置了docker hub的相关代理
- 集群已安装prometheus
Helm安装
helm repo add longhorn https://charts.longhorn.io
helm repo update
安全起见我给ui配置auth验证:
kubectl create namespace longhorn-system
USER=admin; PASSWORD=12345678; echo "${USER}:$(openssl passwd -stdin -apr1 <<< ${PASSWORD})" >> auth
kubectl -n longhorn-system create secret generic basic-auth --from-file=auth
开始进行安装, 这里提供一下我的配置, 仅供参考:
defaultSettings:
defaultDataPath: /data/k8s/longhorn
longhornUI:
replicas: 1
ingress:
enabled: true
ingressClassName: nginx
host: longhorn.svc.ysicing.net
annotations:
nginx.ingress.kubernetes.io/auth-type: basic
nginx.ingress.kubernetes.io/auth-secret: basic-auth
执行安装
helm upgrade -i longhorn longhorn/longhorn -n longhorn-system -f values.yaml
验证
# pod正常情况下都是Running状态
kubectl get pod -n longhorn-system
# 查看存储类
kubectl get sc
高级参数配置
# 默认的存储类配置
persistence:
defaultClass: true
# 文件系统类型ext4与xfs选择一个
defaultFsType: ext4
# 使用ext4文件系统允许设置其他创建参数,以支持旧版本系统内核
defaultMkfsParams: ""
defaultClassReplicaCount: 3
# 默认数据位置,默认选项为disabled,还有best-effort,表示使用卷的pod是否与卷尽量在同一个node节点,默认为不进行这个限制, 如果是跨云节点best-effort
defaultDataLocality: disabled
reclaimPolicy: Delete
migratable: false
recurringJobSelector:
enable: false
jobList: []
backingImage:
enable: false
name: ~
dataSourceType: ~
dataSourceParameters: ~
expectedChecksum: ~
defaultNodeSelector:
enable: false # disable by default
selector: ""
removeSnapshotsDuringFilesystemTrim: ignored # "enabled" or "disabled" otherwise
# 全局配置可以ui配置
defaultSettings:
# 备份相关, 控制台可配置
backupTarget: ~
backupTargetCredentialSecret: ~
allowRecurringJobWhileVolumeDetached: ~
# 仅在具有node.longhorn.io/create-default-disk=true标签的节点上初始化数据目录,默认为false在所有节点初始化数据目录
createDefaultDiskLabeledNodes: ~
# 默认数据目录位置,不配置默认为/var/lib/longhorn/
defaultDataPath: ~
# 默认数据位置,默认选项为disabled,还有best-effort,表示使用卷的pod是否与卷尽量在同一个node节点,默认为不进行这个限制。
defaultDataLocality: ~
# 卷副本是否为软亲和,默认false表示相同卷的副本强制调度到不同节点,如果为true则表示同一个卷的副本可以在同一个节点
replicaSoftAntiAffinity: ~
# 副本是否进行自动平衡。默认为disabled关闭,least-effort平衡副本以获得最小冗余,best-effort此选项指示 Longhorn 尝试平衡副本以实现冗余
replicaAutoBalance: ~
#存储超配置百分比默认200,已调度存储+已用磁盘空间(存储最大值-保留存储)未超过之后才允许调度新副本实际可用磁盘容量的 200%
storageOverProvisioningPercentage: ~
# 存储最小可用百分比默认,默认设置为 25,Longhorn 管理器仅在可用磁盘空间(可用存储空间)减去磁盘空间量且可用磁盘空间仍超过实际磁盘容量(存储空间)的 25%后才允许调度新副本)。否则磁盘将变得不可调度,直到释放更多空间
storageMinimalAvailablePercentage: ~
upgradeChecker: ~
# 创建卷时的默认副本数默认为3
defaultReplicaCount: ~
# 默认Longhorn静态存储类名称,默认值longhorn-static
defaultLonghornStaticStorageClass: ~
backupstorePollInterval: ~
failedBackupTTL: ~
restoreVolumeRecurringJobs: ~
recurringSuccessfulJobsHistoryLimit: ~
recurringFailedJobsHistoryLimit: ~
supportBundleFailedHistoryLimit: ~
taintToleration: ~
systemManagedComponentsNodeSelector: ~
priorityClass: ~
# 卷出现问题自动修复,默认为true
autoSalvage: ~
autoDeletePodWhenVolumeDetachedUnexpectedly: ~
disableSchedulingOnCordonedNode: ~
replicaZoneSoftAntiAffinity: ~
nodeDownPodDeletionPolicy: ~
nodeDrainPolicy: ~
replicaReplenishmentWaitInterval: ~
concurrentReplicaRebuildPerNodeLimit: ~
concurrentVolumeBackupRestorePerNodeLimit: ~
disableRevisionCounter: ~
systemManagedPodsImagePullPolicy: ~
allowVolumeCreationWithDegradedAvailability: ~
# 允许Longhorn在副本重建后自动清理系统生成的快照,默认true
autoCleanupSystemGeneratedSnapshot: ~
concurrentAutomaticEngineUpgradePerNodeLimit: ~
backingImageCleanupWaitInterval: ~
backingImageRecoveryWaitInterval: ~
guaranteedEngineManagerCPU: ~
guaranteedReplicaManagerCPU: ~
kubernetesClusterAutoscalerEnabled: ~
orphanAutoDeletion: ~
storageNetwork: ~
deletingConfirmationFlag: ~
engineReplicaTimeout: ~
snapshotDataIntegrity: ~
snapshotDataIntegrityImmediateCheckAfterSnapshotCreation: ~
snapshotDataIntegrityCronjob: ~
removeSnapshotsDuringFilesystemTrim: ~
fastReplicaRebuildEnabled: ~
replicaFileSyncHttpClientTimeout: ~
logLevel: ~
backupCompressionMethod: ~
backupConcurrentLimit: ~
restoreConcurrentLimit: ~
v2DataEngine: ~
offlineReplicaRebuilding: ~