1. 1. 简介
    1. 1. 能干什么
    2. 2. 架构介绍
  2. 2. 安装部署
    1. 1. Helm安装
  3. 3. pod正常情况下都是Running状态
  4. 4. 查看存储类
    1. 1. 高级参数配置
  5. 5. 默认的存储类配置
  6. 6. 文件系统类型ext4与xfs选择一个
  7. 7. 使用ext4文件系统允许设置其他创建参数,以支持旧版本系统内核
  8. 8. 默认数据位置,默认选项为disabled,还有best-effort,表示使用卷的pod是否与卷尽量在同一个node节点,默认为不进行这个限制, 如果是跨云节点best-effort
  9. 9. 全局配置可以ui配置
  10. 10. 备份相关, 控制台可配置
  11. 11. 仅在具有node.longhorn.io/create-default-disk=true标签的节点上初始化数据目录,默认为false在所有节点初始化数据目录
  12. 12. 默认数据目录位置,不配置默认为/var/lib/longhorn/
  13. 13. 默认数据位置,默认选项为disabled,还有best-effort,表示使用卷的pod是否与卷尽量在同一个node节点,默认为不进行这个限制。
  14. 14. 卷副本是否为软亲和,默认false表示相同卷的副本强制调度到不同节点,如果为true则表示同一个卷的副本可以在同一个节点
  15. 15. 副本是否进行自动平衡。默认为disabled关闭,least-effort平衡副本以获得最小冗余,best-effort此选项指示 Longhorn 尝试平衡副本以实现冗余
  16. 16. 存储最小可用百分比默认,默认设置为 25,Longhorn 管理器仅在可用磁盘空间(可用存储空间)减去磁盘空间量且可用磁盘空间仍超过实际磁盘容量(存储空间)的 25%后才允许调度新副本)。否则磁盘将变得不可调度,直到释放更多空间
  17. 17. 创建卷时的默认副本数默认为3
  18. 18. 默认Longhorn静态存储类名称,默认值longhorn-static
  19. 19. 卷出现问题自动修复,默认为true
  20. 20. 允许Longhorn在副本重建后自动清理系统生成的快照,默认true
    1. 1. 参考文档

傻瓜式教学:部署云原生存储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: ~

参考文档

Sponsor

Like this article? $1 reward

Comments

猪猪 ·v1 北京 Reply

沙发