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