生產實踐:使用 GlusterFS 搭建 Kubernetes 存儲卷集群
我們將重點討論如何使用 GlusterFS 搭建一個可靠的存儲解決方案,以供 Kubernetes 集群使用。
1.服務器列表:
- 172.18.1.52
- 172.18.1.53
- 172.18.1.54
2.安裝yum源
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-9.repo
3.安裝glusterfs服務端
在三個節點分別執行
yum -y install centos-release-gluster5.noarch
yum -y install glusterfs-server
設置開機啟動,并啟動
在三個節點分別執行
systemctl start glusterd
systemctl status glusterd
systemctl enable glusterd
關閉節點防火墻
在三個節點分別執行
systemctl stop firewalld
組建集群
在172.18.1.52服務器上執行以下命令:
#IP地址為其他集群節點的IP,多個ip執行多次
gluster peer probe 172.18.1.53
gluster peer probe 172.18.1.54
查看集群狀態
gluster peer status
4.heketi安裝
Heketi 是一個用于管理和配置 GlusterFS 分布式文件系統的開源項目,Heketi的主要目標是簡化 GlusterFS 的管理和配置。它提供了一個 RESTful API,使用戶能夠輕松地創建、調整和刪除 GlusterFS 卷
設置免密登錄glusterfs node節點
ssh-keygen -t rsa
ssh-copy-id -p 22 root@172.18.1.52
ssh-copy-id -p 22 root@172.18.1.53
ssh-copy-id -p 22 root@172.18.1.54
安裝heketi
在172.18.1.52執行
yum install -y heketi heketi-client
修改heketi 配置文件
訪問/etc/heketi/heketi.json,并修改
修改啟動文件/usr/lib/systemd/system/heketi.service,否則啟動報錯
執行以下命令
systemctl daemon-reload
systemctl enable heketi
systemctl start heketi
驗證是否啟動成功
返回 Hello from Heketi 則成功
curl -s 127.0.0.1:8080/hello | awk '{print $0}'
使用heketi創建glusterfs集群
執行fdisk -l查看可掛載磁盤,可以看到/dev/vdb為未掛載
創建 /etc/heketi/heketi-topology.json,配置內容如下:
# 通過topology.json文件定義組建GlusterFS集群;
# topology指定了層級關系:clusters-->nodes-->node/devices-->hostnames/zone;
# node/hostnames字段的manage填寫主機ip,指管理通道,在heketi服務器不能通過hostname訪問GlusterFS節點時不能填寫hostname;
# node/hostnames字段的storage填寫主機ip,指存儲數據通道,與manage可以不一樣;
# node/zone字段指定了node所處的故障域,heketi通過跨故障域創建副本,提高數據高可用性質,如可以通過rack的不同區分zone值,創建跨機架的故障域;
# devices字段指定GlusterFS各節點的盤符(可以是多塊盤),必須是未創建文件系統的裸設備
{
"clusters": [
{
"nodes": [
{
"node": {
"hostnames": {
"manage": [
"172.18.1.52"
],
"storage": [
"172.18.1.52"
]
},
"zone": 1
},
"devices": [
"/dev/vdb"
]
},
{
"node": {
"hostnames": {
"manage": [
"172.18.1.53"
],
"storage": [
"172.18.1.53"
]
},
"zone": 2
},
"devices": [
"/dev/vdb"
]
},
{
"node": {
"hostnames": {
"manage": [
"172.18.1.54"
],
"storage": [
"172.18.1.54"
]
},
"zone": 3
},
"devices": [
"/dev/vdb"
]
}
]
}
]
}
執行以下命令創建集群
heketi-cli --user=admin --secret=12123 --server http://127.0.0.1:8080 topology load --json=/etc/heketi/heketi-topology.json
5.創建k8s StorageClass
k8s中的StorageClass用于定義和配置持久卷(Persistent Volume)的資源對象。StorageClass 提供了一種抽象層,使得管理員能夠定義不同類型的存儲和訪問模式,并將其提供給應用程序開發人員使用。
創建gfs-secret.yaml
執行echo -n "mypassword" | base64,對上面配置的admin密碼進行加密,并修改key值
apiVersion: v1
kind: Secret
metadata:
name: heketi-secret
namespace: default
data:
# base64 encoded password. E.g.: echo -n "mypassword" | base64
key: c2dqcHJvZDIwMjMxcWF6
type: kubernetes.io/glusterfs
創建gfs-StorageClass.yaml
創建gfs-StorageClass.yaml需要提前準備以下兩個參數
- resturl值為搭建好之后的heketi接口地址http://172.18.1.52:8080
- clusterid值,獲取方式如下
heketi-cli --user=admin --secret=1212 --server http://127.0.0.1:8080 cluster list
最終我們的配置文件如下
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: gfs-storage
provisioner: kubernetes.io/glusterfs
parameters:
# resturl 是第二步搭建好之后的heketi 接口地址
resturl: "http://172.18.1.52:8080"
# Clusterid 必填
clusterid: "caf83363937a99eccfd1e1c03112fd2d"
restuser: "admin"
secretNamespace: "default"
secretName: "heketi-secret"
gidMin: "40000"
gidMax: "50000"
# volumetype: "none"
volumenameprefix: "gfs"
執行以下命令部署到k8s集群
執行以下命令
kubectl apply -f gfs-secret.yaml
kubectl apply -f gfs-StorageClass.yaml
查詢創建結果
kubectl get secret
kubectl get sc
以上結果表明,創建成功
6.測試
下面我們部署一個spring boot工程,并把日志文件掛載到gfs中
新建backend-log-pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: backend-log-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
storageClassName: gfs-storage
新建backend-dp.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend
spec:
selector:
matchLabels:
app: backend
replicas: 1
template:
metadata:
labels:
app: backend
version: latest
spec:
containers:
- name: backend
image: "dweizhao/backend:latest"
imagePullPolicy: Always
resources:
limits:
cpu: 1000m
memory: 1G
requests:
cpu: 1m
memory: 200M
volumeMounts:
- mountPath: /data/web_log/java/backend
name: web-log
volumes:
- name: web-log
persistentVolumeClaim:
claimName: backend-log-pvc
部署
kubectl apply -f backend-log-pvc.yaml
kubectl apply -f backend-dp.yaml
部署完成以后,查看pv與系統日志看到掛載成功
驗證掛載是否成功
登錄文件服務器,執行df -h查看掛載日志文件,如下所圖
由于掛載名稱無法識別,導致無法定位目標文件,因此執行mount.sh(輔助命令章節)腳本,把fs卷掛載到/data/web_log/目錄下并以namespace+pvcName命名,如下圖執行完腳本,進入/data/web_log/default_backend-log-pvc目錄,查看掛載日志
7.輔助命令
mount.sh
在heketi節點上執行以下命令,把fs卷掛載到/data/web_log/目錄下,用于查詢一些日志 腳本如下:
#/bin/sh
VolumeList=$(heketi-cli --user=admin --secret=1212 --server http://127.0.0.1:8080 volume list | awk -F ':' '{print $NF}')
for Volume in ${VolumeList[@]}; do
MountDir=$(echo $Volume | awk -F '_' '{for(i=2;i<NF;i++) printf("%s_",$i);printf("\n") }' | sed 's/.$//g')
# 檢查文件夾是否存在
if [ ! -d "/data/web_log/$MountDir" ]; then
mkdir -p "/data/web_log/$MountDir"
echo "create dir /data/web_log/$MountDir"
mount -t glusterfs "127.0.0.1:$Volume" "/data/web_log/$MountDir"
else
echo "Already dir /data/web_log/$MountDir"
fi
done
初始化磁盤數據
pvremove /dev/vdb --force --force