简介

Longhorn 是一个轻量级、可靠且功能强大的分布式块存储系统,专为 Kubernetes 而设计。它实现了可靠的持久化存储,支持快照、备份和跨集群灾难恢复等企业级功能。

主要特性

  • 企业级分布式块存储
  • 跨节点数据复制和自动重建
  • 无中心化架构
  • 非侵入式架构
  • 图形化管理界面
  • 快照和备份支持
  • 跨集群灾备能力

环境要求

在安装 Longhorn 之前,请确保您的环境满足以下要求:

环境检查

在部署 Longhorn 之前,强烈建议运行环境检查脚本来验证您的环境是否满足所有必要条件:

bash
1
2
# 下载环境检查脚本
curl -sSfL https://raw.githubusercontent.com/longhorn/longhorn/v1.8.1/scripts/environment_check.sh | bash

这个脚本会检查:

  • 操作系统依赖
  • 内核模块
  • 挂载点
  • 系统工具
  • 网络配置
  • SELinux 状态
  • iscsi 服务状态

硬件要求

  • CPU: 最低 1 核
  • 内存: 最低 1GB
  • 磁盘: 每个节点至少 20GB 可用空间

软件要求

  • Kubernetes v1.21+
  • 所有节点已安装 open-iscsi
  • 所有节点已安装 curl、findmnt、grep、awk、blkid、lsblk 等工具

节点要求

bash
1
2
3
4
# 在所有节点执行以下命令安装必要组件
apt-get install open-iscsi curl util-linux grep awk -y
systemctl enable iscsid
systemctl start iscsid

安装方法

方法一:使用 Helm 安装(推荐)

  1. 添加 Longhorn 的 Helm 仓库:
bash
1
2
helm repo add longhorn https://charts.longhorn.io
helm repo update
  1. 创建 longhorn-system 命名空间:
bash
1
kubectl create namespace longhorn-system
  1. 安装 Longhorn:
bash
1
helm install longhorn longhorn/longhorn --namespace longhorn-system --create-namespace --version 1.8.1

默认数据目录是/var/lib/longhorn, 可以通过配置values.yaml按照自己的存储规划要求设置自定义的目录。 如: –set defaultSettings.defaultDataPath=”/data/longhorn”

方法二:使用 kubectl 安装

  1. 直接应用官方的安装清单:
bash
1
kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/v1.5.3/deploy/longhorn.yaml

方法三:使用 ArgoCD 安装

如果您的集群使用 ArgoCD 进行 GitOps 管理,可以通过以下方式部署 Longhorn:

  1. 创建 Application 配置文件 longhorn-application.yaml
yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: longhorn
namespace: argocd
spec:
project: default
source:
chart: longhorn
repoURL: https://charts.longhorn.io
targetRevision: 1.8.1
helm:
values: |
defaultSettings:
defaultDataPath: /data/longhorn
# 可选:配置备份存储位置
backupTarget: s3://backups@us-east-1/
backupTargetCredentialSecret: longhorn-backup-secret
persistence:
defaultClass: true
defaultClassReplicaCount: 3
destination:
server: https://kubernetes.default.svc
namespace: longhorn-system
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
  1. 如果需要配置备份到 S3,创建密钥文件 backup-secret.yaml
yaml
1
2
3
4
5
6
7
8
9
10
apiVersion: v1
kind: Secret
metadata:
name: longhorn-backup-secret
namespace: longhorn-system
type: Opaque
stringData:
AWS_ACCESS_KEY_ID: your-access-key
AWS_SECRET_ACCESS_KEY: your-secret-key
AWS_ENDPOINTS: https://s3.us-east-1.amazonaws.com/
  1. 应用配置:
bash
1
2
3
4
5
6
7
8
# 创建 namespace(如果不存在)
kubectl create namespace longhorn-system

# 如果配置了备份,先创建 secret
kubectl apply -f backup-secret.yaml

# 创建 ArgoCD Application
kubectl apply -f longhorn-application.yaml
  1. 验证部署状态:
    • 在 ArgoCD UI 中查看应用同步状态
    • 等待所有资源创建完成
    • 检查 Pod 状态:
      bash
      1
      kubectl get pods -n longhorn-system

验证安装

  1. 检查所有 Pod 是否正常运行:
bash
1
kubectl get pods -n longhorn-system

预期输出应该显示所有 Pod 都处于 Running 状态:

plaintext
1
2
3
4
5
6
7
8
NAME                                        READY   STATUS    RESTARTS   AGE
longhorn-manager-pzqsp 1/1 Running 0 5m
longhorn-driver-deployer-7fd7f8b5c-shpkj 1/1 Running 0 5m
longhorn-ui-78f64844b9-mb7t2 1/1 Running 0 5m
csi-attacher-7bf4b7f996-df8v6 1/1 Running 0 4m
csi-provisioner-869bdc4b79-mzrwf 1/1 Running 0 4m
csi-resizer-6d8cf5f99f-fd2ck 1/1 Running 0 4m
csi-snapshotter-588457fcdf-22bqp 1/1 Running 0 4m
  1. 验证 StorageClass 是否创建:
bash
1
kubectl get sc

应该能看到 longhorn StorageClass:

plaintext
1
2
NAME                 PROVISIONER          RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
longhorn (default) driver.longhorn.io Delete Immediate true 5m

访问 Longhorn UI

  1. 创建 Ingress(可选):
yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: longhorn-ingress
namespace: longhorn-system
spec:
rules:
- host: longhorn.example.com # 替换为您的域名
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: longhorn-frontend
port:
number: 80
  1. 或者使用端口转发:
bash
1
kubectl port-forward service/longhorn-frontend 8000:80 -n longhorn-system

然后访问 http://localhost:8000

使用示例

创建一个使用 Longhorn 存储的示例 Pod:

yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: longhorn-test-pvc
spec:
accessModes:
- ReadWriteOnce
storageClassName: longhorn
resources:
requests:
storage: 2Gi
---
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
containers:
- name: test-pod
image: nginx:stable-alpine
volumeMounts:
- name: longhorn-test-volume
mountPath: /data
ports:
- containerPort: 80
volumes:
- name: longhorn-test-volume
persistentVolumeClaim:
claimName: longhorn-test-pvc

常见问题处理

  1. Pod 无法调度到节点
  • 检查节点是否满足 Longhorn 的系统要求
  • 确认 iscsid 服务是否正常运行
  • 查看 Longhorn Manager 日志
  1. 存储卷创建失败
  • 检查存储空间是否充足
  • 确认网络连接是否正常
  • 查看 Longhorn UI 中的事件日志

最佳实践

  1. 存储配置
  • 建议使用 SSD 作为存储介质
  • 为不同类型的工作负载创建不同的 StorageClass
  • 根据实际需求配置副本数量
  1. 备份策略
  • 定期创建数据快照
  • 配置远程备份到对象存储
  • 制定灾难恢复计划

存储配置

配置节点默认存储路径

Longhorn 默认使用 /var/lib/longhorn 作为存储路径。您可以通过以下方式修改默认存储路径:

  1. 在 Longhorn UI 中修改:

    • 访问 Longhorn UI
    • 点击 “Setting” -> “General” -> “Default Data Path”
    • 修改为您想要的路径,如 /data/longhorn
  2. 通过 Helm 安装时指定:

bash
1
2
3
4
5
helm install longhorn longhorn/longhorn \
--namespace longhorn-system \
--create-namespace \
--version 1.8.1 \
--set defaultSettings.defaultDataPath="/data/longhorn"

配置额外的存储目录

您可以为节点添加多个存储目录或磁盘:

  1. 准备存储目录:

    bash
    1
    2
    3
    4
    5
    6
    7
    # 在节点上创建目录
    mkdir -p /data/longhorn-1
    mkdir -p /data/longhorn-2

    # 确保目录权限正确
    chmod 700 /data/longhorn-*
    chown root:root /data/longhorn-*
  2. 在 Longhorn UI 中添加磁盘:

    • 进入 “Node” 页面
    • 选择要配置的节点
    • 点击 “Edit Node and Disks”
    • 在 “Add Disk” 部分:
      • 输入磁盘路径(如 /data/longhorn-1
      • 设置磁盘调度选项
      • 设置存储预留空间
      • 点击 “Save” 保存配置

使用原始磁盘设备

如果要使用原始磁盘设备作为存储:

  1. 准备磁盘:

    bash
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 查看可用磁盘
    lsblk

    # 格式化磁盘(假设使用 /dev/sdb)
    mkfs.ext4 /dev/sdb

    # 创建挂载点
    mkdir -p /data/longhorn-disk

    # 挂载磁盘
    mount /dev/sdb /data/longhorn-disk

    # 添加到 fstab 以确保重启后自动挂载
    echo "/dev/sdb /data/longhorn-disk ext4 defaults 0 0" >> /etc/fstab
  2. 在 Longhorn UI 中添加磁盘:

    • 路径填写磁盘的挂载点(如 /data/longhorn-disk
    • 其他步骤同上

存储标签(Storage Tags)

您可以使用存储标签来管理不同性能的存储:

  1. 添加标签:

    • 在 Longhorn UI 中选择节点和磁盘
    • 添加标签,如:
      • ssd=true 用于 SSD 存储
      • hdd=true 用于 HDD 存储
  2. 在创建卷时使用标签:

    yaml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
    name: longhorn-ssd
    provisioner: driver.longhorn.io
    parameters:
    numberOfReplicas: "3"
    diskSelector: "ssd"
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
    name: high-perf-pvc
    spec:
    accessModes:
    - ReadWriteOnce
    storageClassName: longhorn-ssd
    resources:
    requests:
    storage: 10Gi

存储最佳实践

  1. 容量规划

    • 为系统预留足够空间(建议 30% 以上)
    • 考虑副本数量对存储空间的影响
    • 定期监控存储使用情况
  2. 性能优化

    • 使用 SSD 作为主存储
    • 合理设置副本数量(通常为 3)
    • 避免在系统盘上存储数据
  3. 可靠性保障

    • 使用 RAID 配置提高可靠性
    • 配置定期备份
    • 启用磁盘健康检查
  4. 监控告警

    • 配置存储空间告警阈值
    • 监控磁盘 I/O 性能
    • 设置节点状态监控

参考资料

本文由 AI 辅助生成,如有错误或建议,欢迎指出。