千家信息网

怎么通过Heketi管理GlusterFS为K8S集群提供持久化存储

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇内容介绍了"怎么通过Heketi管理GlusterFS为K8S集群提供持久化存储"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希
千家信息网最后更新 2026年11月03日怎么通过Heketi管理GlusterFS为K8S集群提供持久化存储

本篇内容介绍了"怎么通过Heketi管理GlusterFS为K8S集群提供持久化存储"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

参考文档:

  1. Github project:https://github.com/heketi/heketi

  2. MANAGING VOLUMES USING HEKETI:https://access.redhat.com/documentation/en-us/red_hat_gluster_storage/3.3/html/administration_guide/ch05s02

  3. StorageClass:https://kubernetes.io/docs/concepts/storage/storage-classes/

  4. StorageClass(中文):https://k8smeetup.github.io/docs/concepts/storage/storage-classes/

  5. Dynamic Volume Provisioning:https://kubernetes.io/docs/concepts/storage/dynamic-provisioning/

  6. nfs- provisioner:https://github.com/kubernetes-incubator/external-storage/tree/master/nfs

一.Heketi简介

1. 简介

Heketi是一个提供RESTful API管理GlusterFS卷的框架,便于管理员对GlusterFS进行操作:

  1. 可以用于管理GlusterFS卷的生命周期;

  2. 能够在OpenStack,Kubernetes,Openshift等云平台上实现动态存储资源供应(动态在GlusterFS集群内选择bricks构建volume);

  3. 支持GlusterFS多集群管理。

2. 框架

  1. Heketi支持GlusterFS多集群管理;

  2. 在集群中通过zone区分故障域。

二.环境

1. 环境

Kubernetes与GlusterFS集群已提前部署完成,请参考:

  1. Kubernetes:https://www.cnblogs.com/netonline/tag/kubernetes/

  2. GlusterFS:https://www.cnblogs.com/netonline/p/9102004.html

    注意:GlusterFS只需要安装并启动即可,不必组建受信存储池(trusted storage pools)

Hostname

IP

Remark

kubenode1

172.30.200.21

kubenode2

172.30.200.22

kubenode3

172.30.200.23

heketi

172.30.200.80

selinux disabled

glusterfs01

172.30.200.81

glusterfs02

172.30.200.82

glusterfs03

172.30.200.83

2. 设置iptables

# 设置iptables,heketi默认以tcp8080端口提供RESTful API服务;[root@heketi ~]# vim /etc/sysconfig/iptables-A INPUT -p tcp -m state --state NEW -m tcp --dport 8080 -j ACCEPT[root@heketi ~]# service iptables restart

三.部署heketi

1. 安装heketi

# 添加gluster yum源,默认yum源中无相关package;# heketi:heketi服务;# heketi-client:heketi客户端/命令行工具[root@heketi ~]# yum install -y centos-release-gluster[root@heketi ~]# yum install -y heketi heketi-client

2. 配置heketi.json

# 注意红色字体是修改部分[root@heketi ~]# vim /etc/heketi/heketi.json {  # 默认端口tcp8080  "_port_comment": "Heketi Server Port Number",  "port": "8080",  # 默认值false,不需要认证  "_use_auth": "Enable JWT authorization. Please enable for deployment",  "use_auth": true,  "_jwt": "Private keys for access",  "jwt": {    "_admin": "Admin has access to all APIs",    "admin": {      "key": "admin@123"    },    "_user": "User only has access to /volumes endpoint",    "user": {      "key": "user@123"    }  },  "_glusterfs_comment": "GlusterFS Configuration",  "glusterfs": {    "_executor_comment": [      "Execute plugin. Possible choices: mock, ssh",      "mock: This setting is used for testing and development.",      ">ssh",    "_sshexec_comment": "SSH username and private key file information",    "sshexec": {      "keyfile": "/etc/heketi/heketi_key",      "user": "root",      "port": "22",      "fstab": "/etc/fstab"    },    "_kubeexec_comment": "Kubernetes configuration",    "kubeexec": {      "host" :"https://kubernetes.host:8443",      "cert" : "/path/to/crt.file",      "insecure": false,      "user": "kubernetes username",      "password": "password for kubernetes user",      "namespace": "OpenShift project or Kubernetes namespace",      "fstab": "Optional: Specify fstab file on node.  Default is /etc/fstab"    },    "_db_comment": "Database file name",    "db": "/var/lib/heketi/heketi.db",    "_loglevel_comment": [      "Set log level. Choices are:",      "  none, critical, error, warning, info, debug",      "Default is warning"],# 默认设置为debug,不设置时的默认值即是warning;# 日志信息输出在/var/log/message    "loglevel" : "warning"  }}

3. 设置heketi免密访问GlusterFS

# 选择ssh执行器,heketi服务器需要免密登陆GlusterFS集群的各节点;# -t:秘钥类型;# -q:安静模式;# -f:指定生成秘钥的目录与名字,注意与heketi.json的ssh执行器中"keyfile"值一致;# -N:秘钥密码,""即为空[root@heketi ~]# ssh-keygen -t rsa -q -f /etc/heketi/heketi_key -N ""# heketi服务由heketi用户启动,heketi用户需要有新生成key的读赋权,否则服务无法启动[root@heketi ~]# chown heketi:heketi /etc/heketi/heketi_key# 分发公钥;# -i:指定公钥[root@heketi ~]# ssh-copy-id -i /etc/heketi/heketi_key.pub root@172.30.200.81[root@heketi ~]# ssh-copy-id -i /etc/heketi/heketi_key.pub root@172.30.200.82[root@heketi ~]# ssh-copy-id -i /etc/heketi/heketi_key.pub root@172.30.200.83

4. 启动heketi

# 通过yum安装heketi,默认的systemd文件有1处错误;# /usr/lib/systemd/system/heketi.service文件的"-config=/etc/heketi/heketi.json"应该修改为"--config=/etc/heketi/heketi.json";# 否则启动时报"Error: unknown shorthand flag: 'c' in -config=/etc/heketi/heketi.json"错,导致服务无法启动[root@heketi ~]# systemctl enable heketi[root@heketi ~]# systemctl restart heketi[root@heketi ~]# systemctl status heketi
# 验证[root@heketi ~]# curl http://localhost:8080/hello

四.设置GlusterFS集群

1. 创建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各节点的盘符(可以是多块盘),必须是未创建文件系统的裸设备[root@heketi ~]# vim /etc/heketi/topology.json{    "clusters": [        {            "nodes": [                {                    "node": {                        "hostnames": {                            "manage": [                                "172.30.200.81"                            ],                            "storage": [                                "172.30.200.81"                            ]                        },                        "zone": 1                    },                    "devices": [                        "/dev/sdb"                    ]                },                {                    "node": {                        "hostnames": {                            "manage": [                                "172.30.200.82"                            ],                            "storage": [                                "172.30.200.82"                            ]                        },                        "zone": 2                    },                    "devices": [                        "/dev/sdb"                    ]                },                {                    "node": {                        "hostnames": {                            "manage": [                                "172.30.200.83"                            ],                            "storage": [                                "172.30.200.83"                            ]                        },                        "zone": 3                    },                    "devices": [                        "/dev/sdb"                    ]                }            ]        }    ]}

2. 通过topology.json组建GlusterFS集群

# GlusterFS集群各节点的glusterd服务已正常启动,但不必组建受信存储池;# heketi-cli命令行也可手动逐层添加cluster,node,device,volume等;# "--server http://localhost:8080":localhost执行heketi-cli时,可不指定;# "--user admin --secret admin@123 ":heketi.json中设置了认证,执行heketi-cli时需要带上认证信息,否则报"Error: Invalid JWT token: Unknown user"错[root@heketi ~]# heketi-cli --server http://localhost:8080 --user admin --secret admin@123 topology load --json=/etc/heketi/topology.json

# 查看heketi topology信息,此时volume与brick等未创建;# 通过"heketi-cli cluster info"可以查看集群相关信息;# 通过"heketi-cli node info"可以查看节点相关信息;# 通过"heketi-cli device info"可以查看device相关信息[root@heketi ~]# heketi-cli --user admin --secret admin@123 topology info

五.K8S集群动态挂载GlusterFS存储

1. 基于StorageClass的动态存储流程

kubernetes共享存储供应模式:

  1. 静态模式(Static):集群管理员手工创建PV,在定义PV时需设置后端存储的特性;

  2. 动态模式(Dynamic):集群管理员不需要手工创建PV,而是通过StorageClass的设置对后端存储进行描述,标记为某种"类型(Class)";此时要求PVC对存储的类型进行说明,系统将自动完成PV的创建及与PVC的绑定;PVC可以声明Class为"",说明PVC禁止使用动态模式。

基于StorageClass的动态存储供应整体过程如下图所示:

  1. 集群管理员预先创建存储类(StorageClass);

  2. 用户创建使用存储类的持久化存储声明(PVC:PersistentVolumeClaim);

  3. 存储持久化声明通知系统,它需要一个持久化存储(PV: PersistentVolume);

  4. 系统读取存储类的信息;

  5. 系统基于存储类的信息,在后台自动创建PVC需要的PV;

  6. 用户创建一个使用PVC的Pod;

  7. Pod中的应用通过PVC进行数据的持久化;

  8. 而PVC使用PV进行数据的最终持久化处理。

2. 定义StorageClass

# provisioner:表示存储分配器,需要根据后端存储的不同而变更;# reclaimPolicy: 默认即"Delete",删除pvc后,相应的pv及后端的volume,brick(lvm)等一起删除;设置为"Retain"时则保留数据,需要手工处理# resturl:heketi API服务提供的url;# restauthenabled:可选参数,默认值为"false",heketi服务开启认证时必须设置为"true";# restuser:可选参数,开启认证时设置相应用户名;# secretNamespace:可选参数,开启认证时可以设置为使用持久化存储的namespace;# secretName:可选参数,开启认证时,需要将heketi服务的认证密码保存在secret资源中;# clusterid:可选参数,指定集群id,也可以是1个clusterid列表,格式为"id1,id2";# volumetype:可选参数,设置卷类型及其参数,如果未分配卷类型,则有分配器决定卷类型;如"volumetype: replicate:3"表示3副本的replicate卷,"volumetype: disperse:4:2"表示disperse卷,其中'4'是数据,'2'是冗余校验,"volumetype: none"表示distribute卷# [root@kubenode1 ~]# mkdir -p heketi[root@kubenode1 ~]# cd heketi/[root@kubenode1 heketi]# vim gluster-heketi-storageclass.yamlapiVersion: storage.k8s.io/v1kind: StorageClassmetadata:  name: gluster-heketi-storageclassprovisioner: kubernetes.io/glusterfsreclaimPolicy: Deleteparameters:  resturl: "http://172.30.200.80:8080"  restauthenabled: "true"  restuser: "admin"  secretNamespace: "default"  secretName: "heketi-secret"  volumetype: "replicate:2"# 生成secret资源,其中"key"值需要转换为base64编码格式[root@kubenode1 heketi]# echo -n "admin@123" | base64# 注意name/namespace与storageclass资源中定义一致;# 密码必须有"kubernetes.io/glusterfs" type[root@kubenode1 heketi]# cat heketi-secret.yamlapiVersion: v1kind: Secretmetadata:  name: heketi-secret  namespace: defaultdata:  # base64 encoded password. E.g.: echo -n "mypassword" | base64  key: YWRtaW5AMTIztype: kubernetes.io/glusterfs

# 创建secret资源[root@kubenode1 heketi]# kubectl create -f heketi-secret.yaml # 创建storageclass资源;# 注意:storageclass资源创建后不可变更,如修改只能删除后重建[root@kubenode1 heketi]# kubectl create -f gluster-heketi-storageclass.yaml

# 查看storageclass资源[root@kubenode1 heketi]# kubectl describe storageclass gluster-heketi-storageclass

3. 定义PVC

1)定义PVC

# 注意"storageClassName"的对应关系[root@kubenode1 heketi]# vim gluster-heketi-pvc.yamlkind: PersistentVolumeClaimapiVersion: v1metadata:  name: gluster-heketi-pvcspec:  storageClassName: gluster-heketi-storageclass  # ReadWriteOnce:简写RWO,读写权限,且只能被单个node挂载;  # ReadOnlyMany:简写ROX,只读权限,允许被多个node挂载;  # ReadWriteMany:简写RWX,读写权限,允许被多个node挂载;  accessModes:    - ReadWriteOnce  resources:requests:  # 注意格式,不能写"GB"      storage: 1Gi# 创建pvc资源[root@kubenode1 heketi]# kubectl create -f gluster-heketi-pvc.yaml

2)查看k8s资源

# 查看PVC,状态为"Bound";# "Capacity"为2G,是因为同步创建meta数据[root@kubenode1 heketi]# kubectl describe pvc gluster-heketi-pvc

# 查看PV详细信息,除容量,引用storageclass信息,状态,回收策略等外,同时给出GlusterFS的Endpoint与path;[root@kubenode1 heketi]# kubectl get pv[root@kubenode1 heketi]# kubectl describe pv pvc-532cb8c3-cfc6-11e8-8fde-005056bfa8ba

# 查看endpoints资源,可以从pv信息中获取,固定格式:glusterfs-dynamic-PVC_NAME;# endpoints资源中指定了挂载存储时的具体地址[root@kubenode1 heketi]# kubectl describe endpoints glusterfs-dynamic-gluster-heketi-pvc

3)查看heketi

# volume与brick已经创建;# 主挂载点(通信)在glusterfs01节点,其余两个节点备选;# 两副本的情况下,glusterfs03节点并未创建brick[root@heketi ~]# heketi-cli --user admin --secret admin@123 topology info

4)查看GlusterFS节点

# 以glusterfs01节点为例[root@glusterfs01 ~]# lsblk

[root@glusterfs01 ~]# df -Th

# 查看volume的具体信息:2副本的replicate卷;# 另有"vgscan","vgdisplay"也可查看逻辑卷组信息等[root@glusterfs01 ~]# gluster volume list[root@glusterfs01 ~]# gluster volume info vol_308342f1ffff3aea7ec6cc72f6d13cd7

4. Pod挂载存储资源

# 设置1个volume被pod引用,volume的类型为"persistentVolumeClaim"[root@kubenode1 heketi]# vim gluster-heketi-pod.yamlkind: PodapiVersion: v1metadata:  name: gluster-heketi-podspec:  containers:  - name: gluster-heketi-container    image: busybox    command:    - sleep    - "3600"    volumeMounts:    - name: gluster-heketi-volume      mountPath: "/pv-data"      readOnly: false  volumes:  - name: gluster-heketi-volume    persistentVolumeClaim:      claimName: gluster-heketi-pvc# 创建pod[root@kubenode1 heketi]# kubectl create -f gluster-heketi-pod.yaml

5. 验证

# 在容器的挂载目录中创建文件[root@kubenode1 heketi]# kubectl exec -it gluster-heketi-pod /bin/sh/ # cd /pv-data/pv-data # echo "This is a file!"># 在GlusterFS节点对应挂载目录查看创建的文件;# 挂载目录通过"df -Th"或"lsblk"获取[root@glusterfs01 ~]# df -Th[root@glusterfs01 ~]# cd /var/lib/heketi/mounts/vg_af339b60319a63a77b05ddbec1b21bbe/brick_d712f1543476c4198d3869c682cdaa9a/brick/[root@glusterfs01 brick]# ls[root@glusterfs01 brick]# cat a.txt [root@glusterfs01 brick]# cat b.txt  6. 验证StorageClass的ReclaimPolicy# 删除Pod应用后,再删除pvc[root@kubenode1 heketi]# kubectl delete -f gluster-heketi-pod.yaml [root@kubenode1 heketi]# kubectl delete -f gluster-heketi-pvc.yaml# k8s资源[root@kubenode1 heketi]# kubectl get pvc[root@kubenode1 heketi]# kubectl get pv[root@kubenode1 heketi]# kubectl get endpoints # heketi[root@heketi ~]# heketi-cli --user admin --secret admin@123 topology info # GlusterFS节点[root@glusterfs01 ~]# lsblk[root@glusterfs01 ~]# df -Th[root@glusterfs01 ~]# gluster volume list

"怎么通过Heketi管理GlusterFS为K8S集群提供持久化存储"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

存储 集群 资源 信息 节点 管理 服务 认证 动态 参数 数据 文件 类型 模式 用户 系统 副本 字段 故障 格式 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技名片 亿人帮互联网科技有限公司 互联网科技媒体 润盈互联网科技 互联网之后的科技是什么 互联网科技与管理 岳阳华臻互联网科技有限公司 互联网5g黑科技有哪些 注册互联网科技公司经营范围大全 天津腾达互联网科技有限公司 为客找房互联网科技公司怎么样 山东子淼互联网科技有限公司 互联网科技融合创新 九思连强互联网电子科技有限公司 陕西九四连强互联网科技有限公司 云南互联网科技学费 北京军民互联网科技公司 互联网领先科技成果宣传视频 互联网科技创业有什么好项目 高科技和互联网的现代国家 互联网科技公司的优势 今日互联网科技 广州互联网络科技有限公司 西安互联网科技公司 安控科技rtu产品工业互联网 互联网汽车科技小镇 欧洲十大科技互联网公司 昊天互联网科技有限公司 佛山市拉法互联网科技有限公司 电子商务与互联网科技的关系
0