Skip to main content

Command Palette

Search for a command to run...

GlusterFS + Heketi 入门(非容器)

Updated
2 min read

GlusterFS 是个开源的分布式文件系统,而 Heketi 在其上提供了 REST 形式的 API,二者协同为 Kubernetes 提供了存储卷的自动供给能力。

一般对这个系统的介绍,都是基于 Docker 的容器内完成的,个人爱好原因,还不太习惯把这个事情放到集群里面,所以介绍一下用 Yum 方式的安装过程。

我们使用三台服务器作为存储集群,操作系统为 CentOS 7。另外假设每台 Gluster FS 服务器挂在有名为 /dev/sdc 的裸设备,安装过程需要有互联网连接。

  • Heketi 服务器:10.211.55.31
  • Gluster 服务器:
    • 10.211.55.31
    • 10.211.55.32
    • 10.211.55.33

Heketi 的安装和初始设置

这个很简单,CentOS 的 EPEL Repository 中就提供了他的安装包。

yum install -y heketi heketi-client

安装之后,会生成 Heketi 的 Service,建立 /etc/heketi,并在其中生成一个叫 heketi.json 的配置文件。这里提供一个样本:

{
  "port": "7070",
  "use_auth": false,
  "jwt": {
    "admin": {
      "key": "My Secret"
    },
    "user": {
      "key": "My Secret"
    }
  },
  "glusterfs": {
    "executor": "ssh",
    "sshexec": {
      "keyfile": "/etc/heketi/heketi_key",
      "user": "root",
      "port": "22",
      "fstab": "/etc/fstab"
    },
    "executor": "ssh",
    "db": "/var/lib/heketi/heketi.db",
    "loglevel": "debug"
  }
}

这个简单的配置文件说明:

  • 在 7070 提供服务。
  • 数据库保存在 /var/lib/heketi/heketi.db
  • 关闭认证
  • 利用 ssh 和 GlusterFS 集群成员进行通信
  • ssh 证书保存在 /etc/heketi/heketi_key

既然提到证书,就用 ssh-keygen 来生成一套:

ssh-keygen -t rsa -q -f /etc/heketi/heketi_key -N ''

后面将会使用这套证书来完成对 GlusterFS 的控制。

注意,这里要保证上面提到的数据库、配置以及证书文件,一定要确认 Heketi 用户有权进行访问。

GlusterFS 安装

  • 启用仓库:yum install -y centos-release-gluster
  • 安装软件:yum install -y glusterfs-server
  • 启用服务:systemctl enable glusterfs-server
  • 启动服务:systemctl start glusterfs-server

注意这里要把上个步骤生成的公钥(heketi_key.pub)加入到本机的信任列表中,例如

cat /tmp/heketi_key.pub >> /root/.ssh/authorized_key

集群初始化

Heketi 对存储的拓扑结构是这样的:

  • Topology
    • Cluster a
      • Node a1
        • Device a11
        • Device a12
      • Node a2
    • Cluster b

所以初始化过程就按照从上到下的方式来进行:

建立集群

heketi-cli create cluster

创建成功后,会显示一个集群 ID。

加入 Node

heketi-cli node add --cluster=[clusterid] \ --management-host-name=[node-host] \ --storage-host-name=[node-host] \ --zone=1

运行成功会显示新加入的 Node 的 Node ID。

Add Node 过程失败可能需要查看一下防火墙

加入 Device

heketi device add \ --name=/dev/sdc --host=[host-id]

自动一点

下面的脚本会把运行参数中指定的第一参数作为主机地址,第二参数作为设备名称加入第一个集群

#!/bin/sh
export HEKETI_CLI_SERVER=http://127.0.0.1:7070
CLUSTER_ID=`heketi-cli cluster list | tail -n 1 | xargs `
CLUSTER="--cluster=$CLUSTER_ID"
HOST="--management-host-name=$1 --storage-host-name=$1"
ZONE="--zone=1"
NODE_ID=`heketi-cli node add $CLUSTER $HOST $ZONE | grep -v -i "Cluster" | grep -i "id" | cut -d : -f 2 | xargs`
heketi-cli device add --name=$2 --node=$NODE_ID

命令需要用 '-s' 开关指定操作的 Heketi 服务地址。 可以用环境变量来简化一下: export HEKETI_CLI_SERVER="http://127.0.0.1:7070"。

Topology

利用 heketi-cli topology info,会输出当前的集群结构。而且也可以用 JSON 格式导入和导出整个 Topology。下面的例子供参考:

{
    "volumes": [],
    "nodes": [{
      "zone": 1,
      "hostnames": {
        "manage": ["10.211.55.19"],
        "storage": ["10.211.55.19"]
      },
      "cluster": "f6e6de7dc99ca3ed627e2ab3ae68f9ac",
      "id": "95d3d4fec82be4d2a55ae0aa17344af5",
      "state": "online",
      "devices": [{
        "name": "/dev/sdc",
        "storage": {
          "total": 33419264,
          "free": 33419264,
          "used": 0
        },
        "id": "e4e1b97d38ed5ae70323458c1b8e57b5",
        "state": "online",
        "bricks": []
      }]
    }, {
      "zone": 1,
      "hostnames": {
        "manage": ["10.211.55.21"],
        "storage": ["10.211.55.21"]
      },
      "cluster": "f6e6de7dc99ca3ed627e2ab3ae68f9ac",
      "id": "ab36d04dbface40904a05c33f3fd9800",
      "state": "online",
      "devices": [{
        "name": "/dev/sdc",
        "storage": {
          "total": 33419264,
          "free": 33419264,
          "used": 0
        },
        "id": "a33dee6fd8355c6aa9ff5e2783ecef49",
        "state": "online",
        "bricks": []
      }]
    }, {
      "zone": 1,
      "hostnames": {
        "manage": ["10.211.55.20"],
        "storage": ["10.211.55.20"]
      },
      "cluster": "f6e6de7dc99ca3ed627e2ab3ae68f9ac",
      "id": "bfd478cb0a0a562386c06967fb2b31bc",
      "state": "online",
      "devices": [{
        "name": "/dev/sdc",
        "storage": {
          "total": 33419264,
          "free": 33419264,
          "used": 0
        },
        "id": "24c5a97ccad5b3fc35977bc7419c27ee",
        "state": "online",
        "bricks": []
      }]
    }],
    "id": "f6e6de7dc99ca3ed627e2ab3ae68f9ac"
  }]
}

More from this blog

龙虾恐慌:AIOps 又要改名了?

ChatGPT 开始,把 AI 拉近到普罗大众的面前,让无数人感受到 AI 的亲民魅力。而龙虾,则把大模型驱动的自动化能力,突然间变得水灵灵、活泼泼地走进千家万户。它不只是“风口上的猪”,而是风口本身。热度高到让 Mac mini 一度断货,不知道这在不在库克的预料之内。 每代人都有每代人的鸡蛋,春节期间,我就领了我的鸡蛋。翻出古老的 MacBook Air M1,充值各种大模型。当然了,这个工具

Mar 9, 20261 min read

再见 2025

我猜不少人以为这个号废了吧?并没有,只是今年变化有点大,一直有种抄起键盘,无从说起的感觉,所以一直偷懒到今天,2025 的最后一天。 今年是我的第四个本命年,去年末一期播客里,大内说本命年不是灾年,是变化年,有危也有机。可是讲真啊,只看到危,没看到机。 各种因缘际会,从鹅厂跳槽到前东家,已经接近四年,第一个合同期已经进入尾声。除了前两年还在云原生领域嗷嗷叫,后两年基本都是些鸡零狗碎的东西了,用老东家的术语说是——偏离主航道,可谓是前景暗淡了。 一旦确定要滚蛋,反倒心思轻松起来,每天骑着我的小红车...

Jan 5, 20261 min read

辅助编程?dora 说:我知道你很急可是请你别急

从 OpenGPT 把大模型的火烧旺了之后,这三年来,相信很多组织或摩拳擦掌、或躬身入局,希望借助聪明能干的大模型,或想偿还技术宅,或想降本增效,或想弯道超车。一时间,沉寂许久的 AIxx 又活过来了,LLM Ops、Vibe Coding、中医大模型、GPT 算命等等,全都老树发新芽,焕发了勃勃生机。那么视角拉回从业者最关注的饭碗相关的领域之一——AI 辅助开发,产生了什么触动,应该如何拥抱呢? DORA 的年度报告中给出了很有意思的结论——强者恒强。 执行摘要部分总结了几个有趣的点: 问题...

Oct 6, 20251 min read

[译]dora:ai 辅助软件开发状态报告

执行摘要 在 2025 年,科技领导者面临的核心问题已不再是“是否要采用 AI”,而是“如何实现其价值”。 DORA 的研究基于超过 100 小时的定性访谈和来自全球近 5,000 名技术专业人士的问卷调查。研究揭示了一个关键事实:AI 在软件开发中的主要角色是“放大器”。它会放大高效能组织的优势,也会凸显组织的缺陷。 关键结论:AI 是放大器 AI 投资的最大回报并非来自工具本身,而是来自组织底层系统的战略性建设: 高质量的内部平台 清晰的工作流 团队的协同能力 缺少这些基础,AI ...

Oct 2, 202514 min read

僭越了,有人在用 Rust 写 Kubernetes

一个新语言问世,最爱做的事情之一,就是重写存量软件了。 云原生喝酒 SIG 重点扶持项目——rk8s(https://github.com/rk8s-dev/rk8s) 也可以归在这个范畴里,只不过这个项目重写的东西比较大,是 Kubernetes。 从 2025 年 1 月第一个 Commit 开始,到现在有了 200 多次 Commit,十几万行代码。当然距离 Kubernetes 的几百万行代码还差得远——老马就是喜欢整这种大无畏项目。 另外该项目也是国内第一个脱离 Cargo 转向使用 ...

Sep 27, 20253 min read

【伪】架构师

342 posts