天天看點

GlusterFS + Heketi 的安裝和初始化

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
    • Node a1
    • Node a2
    • Device a11
    • Device a12
    • Cluster a
    • 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/shexport HEKETI_CLI_SERVER=http://127.0.0.1:7070CLUSTER_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      

{

    "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"
  }]
}