生产实践:使用 GlusterFS 搭建 Kubernetes 存储卷集群
source link: https://www.51cto.com/article/775924.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
生产实践:使用 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 [email protected]
ssh-copy-id -p 22 [email protected]
ssh-copy-id -p 22 [email protected]
安装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
以上结果表明,创建成功
下面我们部署一个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
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK