生產(chǎn)實(shí)踐:使用 GlusterFS 搭建 Kubernetes 存儲(chǔ)卷集群
我們將重點(diǎn)討論如何使用 GlusterFS 搭建一個(gè)可靠的存儲(chǔ)解決方案,以供 Kubernetes 集群使用。
1.服務(wù)器列表:
- 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服務(wù)端
在三個(gè)節(jié)點(diǎn)分別執(zhí)行
yum -y install centos-release-gluster5.noarch
yum -y install glusterfs-server
設(shè)置開(kāi)機(jī)啟動(dòng),并啟動(dòng)
在三個(gè)節(jié)點(diǎn)分別執(zhí)行
systemctl start glusterd
systemctl status glusterd
systemctl enable glusterd
關(guān)閉節(jié)點(diǎn)防火墻
在三個(gè)節(jié)點(diǎn)分別執(zhí)行
systemctl stop firewalld
組建集群
在172.18.1.52服務(wù)器上執(zhí)行以下命令:
#IP地址為其他集群節(jié)點(diǎn)的IP,多個(gè)ip執(zhí)行多次
gluster peer probe 172.18.1.53
gluster peer probe 172.18.1.54
查看集群狀態(tài)
gluster peer status
4.heketi安裝
Heketi 是一個(gè)用于管理和配置 GlusterFS 分布式文件系統(tǒng)的開(kāi)源項(xiàng)目,Heketi的主要目標(biāo)是簡(jiǎn)化 GlusterFS 的管理和配置。它提供了一個(gè) RESTful API,使用戶能夠輕松地創(chuàng)建、調(diào)整和刪除 GlusterFS 卷
設(shè)置免密登錄glusterfs node節(jié)點(diǎn)
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執(zhí)行
yum install -y heketi heketi-client
修改heketi 配置文件
訪問(wèn)/etc/heketi/heketi.json,并修改
修改啟動(dòng)文件/usr/lib/systemd/system/heketi.service,否則啟動(dòng)報(bào)錯(cuò)
執(zhí)行以下命令
systemctl daemon-reload
systemctl enable heketi
systemctl start heketi
驗(yàn)證是否啟動(dòng)成功
返回 Hello from Heketi 則成功
curl -s 127.0.0.1:8080/hello | awk '{print $0}'
使用heketi創(chuàng)建glusterfs集群
執(zhí)行fdisk -l查看可掛載磁盤(pán),可以看到/dev/vdb為未掛載
創(chuàng)建 /etc/heketi/heketi-topology.json,配置內(nèi)容如下:
# 通過(guò)topology.json文件定義組建GlusterFS集群;
# topology指定了層級(jí)關(guān)系:clusters-->nodes-->node/devices-->hostnames/zone;
# node/hostnames字段的manage填寫(xiě)主機(jī)ip,指管理通道,在heketi服務(wù)器不能通過(guò)hostname訪問(wèn)GlusterFS節(jié)點(diǎn)時(shí)不能填寫(xiě)hostname;
# node/hostnames字段的storage填寫(xiě)主機(jī)ip,指存儲(chǔ)數(shù)據(jù)通道,與manage可以不一樣;
# node/zone字段指定了node所處的故障域,heketi通過(guò)跨故障域創(chuàng)建副本,提高數(shù)據(jù)高可用性質(zhì),如可以通過(guò)rack的不同區(qū)分zone值,創(chuàng)建跨機(jī)架的故障域;
# devices字段指定GlusterFS各節(jié)點(diǎn)的盤(pán)符(可以是多塊盤(pán)),必須是未創(chuàng)建文件系統(tǒng)的裸設(shè)備
{
"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"
]
}
]
}
]
}
執(zhí)行以下命令創(chuàng)建集群
heketi-cli --user=admin --secret=12123 --server http://127.0.0.1:8080 topology load --json=/etc/heketi/heketi-topology.json
5.創(chuàng)建k8s StorageClass
k8s中的StorageClass用于定義和配置持久卷(Persistent Volume)的資源對(duì)象。StorageClass 提供了一種抽象層,使得管理員能夠定義不同類型的存儲(chǔ)和訪問(wèn)模式,并將其提供給應(yīng)用程序開(kāi)發(fā)人員使用。
創(chuàng)建gfs-secret.yaml
執(zhí)行echo -n "mypassword" | base64,對(duì)上面配置的admin密碼進(jìn)行加密,并修改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
創(chuàng)建gfs-StorageClass.yaml
創(chuàng)建gfs-StorageClass.yaml需要提前準(zhǔn)備以下兩個(gè)參數(shù)
- 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"
執(zhí)行以下命令部署到k8s集群
執(zhí)行以下命令
kubectl apply -f gfs-secret.yaml
kubectl apply -f gfs-StorageClass.yaml
查詢創(chuàng)建結(jié)果
kubectl get secret
kubectl get sc
以上結(jié)果表明,創(chuàng)建成功
6.測(cè)試
下面我們部署一個(gè)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與系統(tǒng)日志看到掛載成功
驗(yàn)證掛載是否成功
登錄文件服務(wù)器,執(zhí)行df -h查看掛載日志文件,如下所圖
由于掛載名稱無(wú)法識(shí)別,導(dǎo)致無(wú)法定位目標(biāo)文件,因此執(zhí)行mount.sh(輔助命令章節(jié))腳本,把fs卷掛載到/data/web_log/目錄下并以namespace+pvcName命名,如下圖執(zhí)行完腳本,進(jìn)入/data/web_log/default_backend-log-pvc目錄,查看掛載日志
7.輔助命令
mount.sh
在heketi節(jié)點(diǎn)上執(zhí)行以下命令,把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
初始化磁盤(pán)數(shù)據(jù)
pvremove /dev/vdb --force --force