一 前期准备
1.1 基础知识
在 Kubernetes 中, 使用 GlusterFS 文件系统, 操作步骤通常是:
创建 brick-->创建 volume-->创建 PV-->创建 PVC-->Pod 挂载 PVC
如果要创建多个 PV, 则需要手动重复执行, 可通过 Heketi 管理 glusterfs.
Heketi 是用来管理 GlusterFS 卷的生命周期的, 并提供了一个 RESTful API 接口供 Kubernetes 调用, 因为 GlusterFS 没有提供 API 调用的方式, 所以我们借助 heketi. 通过 Heketi,Kubernetes 可以动态配置 GlusterFS 卷, Heketi 会动态在集群内选择 bricks 创建所需的 volumes, 确保数据的副本会分散到集群不同的故障域内, 同时 Heketi 还支持 GlusterFS 多集群管理, 便于管理员对 GlusterFS 进行操作.
Heketi 要求在每个 glusterfs 节点上配备裸磁盘, 用于 Heketi 创建 PV 和 VG. 通过 Hekete,Kubernetes 中使用 PV 步骤为:
创建 StorageClass-->创建 PVC-->Pod 挂载 PVC
这种方式称为基于 StorageClass 的动态资源供应.
提示: 本实验基于 Kubernetes 部署 glusterfs, 同时 glusterfs 管理组件 Heketi 也使用 Kubernetes 部署.
1.2 架构示意
提示: 本实验不涉及 Kubernetes 部署, Kubernetes 部署参考 001-019.
1.3 相关规划
主机 | IP | 磁盘 | 备注 |
k8smaster01 | 172.24.8.71 | Kubernetes master 节点 | |
k8smaster02 | 172.24.8.72 | Kubernetes master 节点 | |
k8smaster03 | 172.24.8.73 | Kubernetes master 节点 | |
k8snode01 | 172.24.8.74 | sdb | Kubernetes node 节点 glusterfs 节点 |
k8snode02 | 172.24.8.75 | sdb | Kubernetes node 节点 glusterfs 节点 |
k8snode03 | 172.24.8.76 | sdb | Kubernetes node 节点 glusterfs 节点 |
磁盘规划
k8snode01 | k8snode02 | k8snode03 | |
PV | sdb1 | sdb1 | sdb1 |
1.4 部署条件
超融合部署需要具有已经部署的 Kubernetes 集群管理访问权限. 如果 Kubernetes 节点满足以下要求, 则可以选择将 GlusterFS 作为超融合服务部署:
必须至少有三个节点用于 glusterfs;
每个节点必须至少连接一个裸磁盘设备, 以供 heketi 使用. 这些设备上不得包含任何数据, heketi 将会格式化和分区此设备;
每个节点必须打开以下端口才能进行 GlusterFS 通信:
2222:GlusterFS pod 的 sshd 端口;
24007:GlusterFS 守护程序;
24008:GlusterFS 管理;
49152--49251: 主机上每个卷的每个 brick 都需要有独立的端口. 对于每块新 brick, 将从 49152 开始使用一个新端口. 建议每台主机的默认范围为 49152-49251, 也可根据需要进行调整.
必须加载以下内核模块:
- dm_snapshot
- dm_mirror
- dm_thin_pool
对于内核模块, 可通过 lsmod | grep <name > 查看模块是否存在, 并 modprobe <name > 加载给定的模块.
每个节点都要求该 mount.glusterfs 命令可用. 在所有基于 Red Hat 的操作系统下, 此命令由 glusterfs-fuse 软件包提供.
注意: 节点上安装的 GlusterFS 客户端版本应尽可能接近服务器的版本. 要获取已安装的版本, 可通过 glusterfs --version 或 kubectl exec <pod> -- glusterfs --version 命令查看.
1.5 其他准备
所有节点 NTP 配置;
所有节点添加相应主机名解析:
- 172.24.8.71 k8smaster01
- 172.24.8.72 k8smaster02
- 172.24.8.73 k8smaster03
- 172.24.8.74 k8snode01
- 172.24.8.75 k8snode02
- 172.24.8.76 k8snode03
注意: 若非必要, 建议关闭防火墙和 SELinux.
二 规划裸设备
2.1 确认磁盘
1 [root@k8snode01 ~]# fdisk /dev/sdb -l # 检查 sdb 是否为裸磁盘
三 安装 glusterfs-fuse
3.1 安装相应 RPM 源
- [root@k8snode01 ~]# yum -y install CentOS-release-gluster
- [root@k8snode01 ~]# yum -y install glusterfs-fuse # 安装 glusterfs-fuse
提示: k8snode01,k8snode02,k8snode03 类似操作, 根据 1.4 要求安装 glusterfs-fuse 组件;
安装相应源之后, 会在 / etc/yum.repos.d / 目录多出文件 CentOS-Storage-common.repo, 内容如下:
- # CentOS-Storage.repo
- #
- # Please see http://wiki.centos.org/SpecialInterestGroup/Storage for more
- # information
- [CentOS-storage-debuginfo]
- name=CentOS-$releasever - Storage SIG - debuginfo
- baseurl=http://debuginfo.centos.org/$contentdir/$releasever/storage/$basearch/
- gpgcheck=1
- enabled=0
- gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-Storage
3.2 加载相应模块
- [root@k8snode01 ~]# cat> /etc/sysconfig/modules/glusterfs.modules <<EOF
- #!/bin/bash
- for kernel_module in dm_snapshot dm_mirror dm_thin_pool;do
- /sbin/modinfo -F filename \${kernel_module}> /dev/null 2>&1
- if [ \$? -eq 0 ]; then
- /sbin/modprobe \${kernel_module}
- fi
- done;
- EOF
- [root@k8snode01 ~]# chmod +x /etc/sysconfig/modules/glusterfs.modules
- [root@k8snode01 ~]# lsmod |egrep "dm_snapshot|dm_mirror|dm_thin_pool" # 所有 glusterfs node 节点检查
提示: 可通过 modprobe <name > 加载给定的模块.
四 Kubernetes 部署 glusterfs
- 4.1 Node tag
- [root@k8smaster01 ~]# kubectl label nodes k8snode01 storagenode=glusterfs
- [root@k8smaster01 ~]# kubectl label nodes k8snode02 storagenode=glusterfs
- [root@k8smaster01 ~]# kubectl label nodes k8snode03 storagenode=glusterfs
提示: 在后续使用 DaemonSet 部署时候 kube-templates/glusterfs-daemonset.YAML 存在如下针对 label 的 Selector:
- spec:
- nodeSelector:
- storagenode: glusterfs
4.2 下载 glusterfs-Kubernetes
- [root@k8smaster01 ~]# yum -y install Git
- [root@k8smaster01 ~]# Git clone https://github.com/gluster/gluster-kubernetes.git
4.3 修改 glusterfs 拓扑
- [root@k8smaster01 ~]# cd gluster-kubernetes/deploy/
- [root@k8smaster01 deploy]# cp topology.JSON.sample topology.JSON
- [root@k8smaster01 deploy]# vi topology.JSON
- {
- "clusters": [
- {
- "nodes": [
- {
- "node": {
- "hostnames": {
- "manage": [
- "k8snode01"
- ],
- "storage": [
- "172.24.8.74"
- ]
- },
- "zone": 1
- },
- "devices": [
- "/dev/sdb"
- ]
- },
- {
- "node": {
- "hostnames": {
- "manage": [
- "k8snode02"
- ],
- "storage": [
- "172.24.8.75"
- ]
- },
- "zone": 1
- },
- "devices": [
- "/dev/sdb"
- ]
- },
- {
- "node": {
- "hostnames": {
- "manage": [
- "k8snode03"
- ],
- "storage": [
- "172.24.8.76"
- ]
- },
- "zone": 1
- },
- "devices": [
- "/dev/sdb"
- ]
- }
- ]
- }
- ]
- }
提示: heketi 配置文件及介绍参考《附 009.Kubernetes 永久存储之 GlusterFS 独立部署》.
若需要修改 heketi 的暴露方式, 若需要修改为 NodePort, 可参考 https://lichi6174.github.io/glusterfs-heketi/.
所有部署相关 YAML 位于 / root/gluster-kubernetes/deploy/kube-templates, 本实验采用默认参数.
4.4 配置 heketi
- [root@k8smaster01 deploy]# cp heketi.JSON.template heketi.JSON
- [root@k8smaster01 deploy]# vi heketi.JSON
- {
- "_port_comment": "Heketi Server Port Number",
- "port" : "8080",
- "_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" : "admin123" # 管理员密码
- },
- "_user" : "User only has access to /volumes endpoint",
- "user" : {
- "key" : "xianghy" # 用户密码
- }
- },
- "_glusterfs_comment": "GlusterFS Configuration",
- "glusterfs" : {
- "_executor_comment": "Execute plugin. Possible choices: mock, kubernetes, ssh",
- "executor" : "${HEKETI_EXECUTOR}", #本实验使用 Kubernetes 方式
- "_db_comment": "Database file name",
- "db" : "/var/lib/heketi/heketi.db", #heketi 数据存储
- "kubeexec" : {
- "rebalance_on_expansion": true
- },
- "sshexec" : {
- "rebalance_on_expansion": true,
- "keyfile" : "/etc/heketi/private_key",
- "port" : "${SSH_PORT}",
- "user" : "${SSH_USER}",
- "sudo" : ${SSH_SUDO}
- }
- },
- "backup_db_to_kube_secret": false
- }
4.5 相关修正
新版 Kubernetes 的# kubectl get pod 命令无 --show-all 选项, 需要如下操作修正部署 gk-deploy 脚本.
- [root@k8smaster01 deploy]# vi gk-deploy
- 924 #heketi_pod=$(${CLI} get pod --no-headers --show-all --selector="heketi" | awk '{print $1}')
- 925 heketi_pod=$(${CLI} get pod --no-headers --selector="heketi" | awk '{print $1}')
由于国内 glusterfs 镜像可能无法 pull, 建议通过 VPN 等方式提前 pull 镜像, 然后上传至所有 glusterfs node 节点.
- [root@VPN ~]# docker pull gluster/gluster-CentOS:latest
- [root@VPN ~]# docker pull heketi/heketi:dev
- [root@VPN ~]# docker save -o gluster_latest.tar gluster/gluster-CentOS:latest
- [root@VPN ~]# docker save -o heketi_dev.tar heketi/heketi:dev
- [root@k8snode01 ~]# docker load -i gluster_latest.tar
- [root@k8snode01 ~]# docker load -i heketi_dev.tar
- [root@k8snode01 ~]# docker images
4.6 正式部署
- [root@k8smaster01 deploy]# ./gk-deploy -h # 查看部署参数
- [root@k8smaster01 deploy]# kubectl create ns heketi # 建议部署在独立的 namespace 中
- [root@k8smaster01 deploy]# ./gk-deploy -g -n heketi topology.JSON --admin-key admin123 --user-key xianghy
- ......
- Do you wish to proceed with deployment?
- [Y]es, [N]o? [Default: Y]: y
提示: 部署脚本更多参数参考: https://github.com/gluster/gluster-kubernetes/blob/master/deploy/gk-deploy.
注意: 若部署失败, 需要通过下方式彻底删除后重新部署:
- [root@k8smaster01 deploy]# ./gk-deploy --abort --admin-key admin123 --user-key xianghy -y -n heketi
- [root@k8smaster01 deploy]# kubectl delete -f kube-templates/ -n heketi
glusterfs node 节点需要执行如下彻底清理:
- [root@k8snode01 ~]# dmsetup ls
- [root@k8snode01 ~]# dmsetup remove_all
- [root@k8snode01 ~]# rm -rf /var/log/glusterfs/
- [root@k8snode01 ~]# rm -rf /var/lib/heketi
- [root@k8snode01 ~]# rm -rf /var/lib/glusterd/
- [root@k8snode01 ~]# rm -rf /etc/glusterfs/
- [root@k8snode01 ~]# dd if=/dev/zero of=/dev/sdb bs=512k count=1
- [root@k8snode01 ~]# wipefs -af /dev/sdb
4.7 Kubernetes 集群查看验证
- [root@k8smaster01 ~]# kubectl get nodes --show-labels | grep -E 'NAME|node'
- [root@k8smaster01 ~]# kubectl get all -n heketi
1 [root@k8smaster01 ~]# kubectl get pods -o wide -n heketi
4.8 gluster 集群查看验证
- [root@k8smaster01 ~]# kubectl exec -it heketi-65f4555d74-72hrf -n heketi -- heketi-cli cluster list --user admin --secret admin123 # 集群列表
- [root@k8smaster01 ~]# kubectl -n heketi exec -ti heketi-65f4555d74-72hrf /bin/bash [root@heketi-65f4555d74-72hrf /]# heketi-cli cluster list --user admin --secret admin123 # 进入 heketi 容器查看
- [root@k8smaster01 ~]# curl http://10.254.111.219:8080/hello
- Hello from Heketi
注意: 使用 4.6 脚本为一键部署, 也可使用 gluster-kubernetes/deploy / 目录下的文件, 分开逐步部署, 整理部署思路如下:
使用 glusterfs-daemonset.JSON 部署 glusterfs DaemonSet;
对 node 节点进行打标签;
使用 heketi-service-account.JSON 部署 Heketi 的服务帐户;
对 Heketi 所创建的服务帐户授权;
创建 secret;
转发本地 8080 端口至 deploy-heketi.
独立部署完整过程参考: https://jimmysong.io/kubernetes-handbook/practice/using-heketi-gluster-for-persistent-storage.html.
五 安装 heketi-cli
由于在 master 节点管理 heketi 需要进入 heketi 容器或者使用 kubectl exec -ti 方式, 建议直接在 master 节点安装 heketi 客户端, 直接管理,
5.1 安装 heketi 服务
- [root@k8smaster01 ~]# yum -y install CentOS-release-gluster
- [root@k8smaster01 ~]# yum -y install heketi-client
5.2 配置 heketi
- [root@k8smaster01 ~]# echo "export HEKETI_CLI_SERVER=http://$(kubectl get svc heketi -n heketi -o go-template='{{.spec.clusterIP}}'):8080">> /etc/profile.d/heketi.sh
- [root@k8smaster01 ~]# echo "alias heketi-cli='heketi-cli --user admin --secret admin123'">> ~/.bashrc
- [root@k8smaster01 ~]# source /etc/profile.d/heketi.sh
- [root@k8smaster01 ~]# source ~/.bashrc
- [root@k8smaster01 ~]# echo $HEKETI_CLI_SERVER
- http://heketi:8080
5.3 集群管理
- [root@k8smaster01 ~]# heketi-cli cluster list
- Clusters:
- Id:67004a06fbcb4fa525bcec1fbaa9ef2d [file][block]
- [root@k8smaster01 ~]# heketi-cli cluster info 67004a06fbcb4fa525bcec1fbaa9ef2d # 集群详细信息
- Cluster id: 67004a06fbcb4fa525bcec1fbaa9ef2d
- Nodes:
- 40cdd4c1d0c389939193d6dea3c5bfe8
- 62873c54cf61025fda91e6d44433378b
- d48986357840d28653304e7170599da5
- Volumes:
- 5f15f201d623e56b66af56313a1975e7
- Block: true
- File: true
- [root@k8smaster01 ~]# heketi-cli topology info 67004a06fbcb4fa525bcec1fbaa9ef2d # 查看拓扑信息
- [root@k8smaster01 ~]# heketi-cli node list #查看所有 node
- Id:40cdd4c1d0c389939193d6dea3c5bfe8 Cluster:67004a06fbcb4fa525bcec1fbaa9ef2d
- Id:62873c54cf61025fda91e6d44433378b Cluster:67004a06fbcb4fa525bcec1fbaa9ef2d
- Id:d48986357840d28653304e7170599da5 Cluster:67004a06fbcb4fa525bcec1fbaa9ef2d
- [root@k8smaster01 ~]# heketi-cli node info 40cdd4c1d0c389939193d6dea3c5bfe8 #node 节点信息
- [root@k8smaster01 ~]# heketi-cli volume create --size=2 --replica=2 #默认为 3 副本的 replica 模式
- [root@k8smaster01 ~]# heketi-cli volume list # 列出所有卷
- [root@k8smaster01 ~]# heketi-cli volume info fc296ab350dcc36e00dd3b3643a04645 # 卷信息
- [root@k8smaster01 ~]# heketi-cli volume delete fc296ab350dcc36e00dd3b3643a04645 # 删除卷
六 Kubernetes 动态挂载 glusterfs
6.1 StorageClass 动态存储
kubernetes 共享存储 provider 模式:
静态模式(Static): 集群管理员手工创建 PV, 在定义 PV 时设置后端存储的特性;
动态模式(Dynamic): 集群管理员不需要手工创建 PV, 而是通过 StorageClass 的设置对后端存储进行描述, 标记为某种 "类型(Class)"; 此时要求 PVC 对存储的类型进行说明, 系统将自动完成 PV 的创建及与 PVC 的绑定; PVC 可以声明 Class 为 "", 说明 PVC 禁止使用动态模式.
基于 StorageClass 的动态存储供应整体过程如下图所示:
集群管理员预先创建存储类(StorageClass);
用户创建使用存储类的持久化存储声明(PVC:PersistentVolumeClaim);
存储持久化声明通知系统, 它需要一个持久化存储(PV: PersistentVolume);
系统读取存储类的信息;
系统基于存储类的信息, 在后台自动创建 PVC 需要的 PV;
用户创建一个使用 PVC 的 Pod;
Pod 中的应用通过 PVC 进行数据的持久化;
而 PVC 使用 PV 进行数据的最终持久化处理.
提示: 关于 Kubernetes 的部署参考《附 003.Kubeadm 部署 Kubernetes》.
6.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 卷
提示: 关于 glusterfs 各种不同类型的卷见《004.RHGS - 创建 volume》.
- [root@k8smaster01 ~]# echo -n "admin123" | base64 # 将密码转换为 64 位编码
- YWRtaW4xMjM=
- [root@k8smaster01 ~]# mkdir -p heketi
- [root@k8smaster01 ~]# cd heketi/
- [root@k8smaster01 ~]# vi heketi-secret.YAML # 创建用于保存密码的 secret
- apiVersion: v1
- kind: Secret
- metadata:
- name: heketi-secret
- namespace: heketi
- data:
- # base64 encoded password. E.g.: echo -n "mypassword" | base64
- key: YWRtaW4xMjM=
- type: kubernetes.io/glusterfs
- [root@k8smaster01 heketi]# kubectl create -f heketi-secret.YAML # 创建 heketi
- [root@k8smaster01 heketi]# kubectl get secrets -n heketi
- NAME TYPE DATA AGE
- default-token-6n746 kubernetes.io/service-account-token 3 144m
- heketi-config-secret Opaque 3 142m
- heketi-secret kubernetes.io/glusterfs 1 3m1s
- heketi-service-account-token-ljlkb kubernetes.io/service-account-token 3 143m
- [root@kubenode1 heketi]# VIM gluster-heketi-storageclass.YAML # 正式创建 StorageClass
- apiVersion: storage.k8s.io/v1
- kind: StorageClass
- metadata:
- name: gluster-heketi-storageclass
- parameters:
- resturl: "http://10.254.111.219:8080"
- clusterid: "67004a06fbcb4fa525bcec1fbaa9ef2d"
- restauthenabled: "true" # 若 heketi 开启认证此处也必须开启 auth 认证
- restuser: "admin"
- secretName: "heketi-secret" #name/namespace 与 secret 资源中定义一致
- secretNamespace: "heketi"
- volumetype: "replicate:3"
- provisioner: kubernetes.io/glusterfs
- reclaimPolicy: Delete
- [root@k8smaster01 heketi]# kubectl create -f gluster-heketi-storageclass.YAML
注意: storageclass 资源创建后不可变更, 如修改只能删除后重建.
- [root@k8smaster01 heketi]# kubectl get storageclasses # 查看确认
- NAME PROVISIONER AGE
- gluster-heketi-storageclass kubernetes.io/glusterfs 85s
- [root@k8smaster01 heketi]# kubectl describe storageclasses gluster-heketi-storageclass
6.3 定义 PVC
- [root@k8smaster01 heketi]# vi gluster-heketi-pvc.YAML
- apiVersion: v1
- kind: PersistentVolumeClaim
- metadata:
- name: gluster-heketi-pvc
- annotations:
- volume.beta.kubernetes.io/storage-class: gluster-heketi-storageclass
- spec:
- accessModes:
- - ReadWriteOnce
- resources:
- requests:
- storage: 1Gi
注意: accessModes 可有如下简写:
ReadWriteOnce: 简写 RWO, 读写权限, 且只能被单个 node 挂载;
ReadOnlyMany: 简写 ROX, 只读权限, 允许被多个 node 挂载;
ReadWriteMany: 简写 RWX, 读写权限, 允许被多个 node 挂载.
- [root@k8smaster01 heketi]# kubectl create -f gluster-heketi-pvc.YAML -n heketi
- [root@k8smaster01 heketi]# kubectl get pvc -n heketi
- [root@k8smaster01 heketi]# kubectl describe pvc gluster-heketi-pvc -n heketi
- [root@k8smaster01 heketi]# kubectl get pv -n heketi
- [root@k8smaster01 heketi]# kubectl describe pv pvc-ca949559-094a-11ea-8b3c-000c29fa7a79 -n heketi
1 [root@k8smaster01 heketi]# kubectl describe endpoints glusterfs-dynamic-ca949559-094a-11ea-8b3c-000c29fa7a79 -n heketi
提示: 由上可知: PVC 状态为 Bound,Capacity 为 1G. 查看 PV 详细信息, 除容量, 引用 storageclass 信息, 状态, 回收策略等外, 同时可知 GlusterFS 的 Endpoint 与 path.EndpointsName 为固定格式: glusterfs-dynamic-PV_NAME, 且 endpoints 资源中指定了挂载存储时的具体地址.
6.4 确认查看
通过 5.3 所创建的信息:
volume 与 brick 已经创建;
主挂载点 (通信) 在 172.24.8.41 节点, 其余两个节点备选;
三副本的情况下, 所有节点都会创建 brick.
- [root@k8smaster01 ~]# kubectl get pod -n heketi
- [root@k8smaster01 ~]# kubectl exec -ti glusterfs-b854k -n heketi -- lsblk #glusterfs 节点查看
- [root@k8smaster01 ~]# kubectl exec -ti glusterfs-b854k -n heketi -- df -hT #glusterfs 节点查看
- [root@k8smaster01 ~]# kubectl exec -ti glusterfs-b854k -n heketi -- gluster volume list
- [root@k8smaster01 ~]# kubectl exec -ti glusterfs-b854k -n heketi -- gluster volume info vol_29ba6f9665522ad5893412e61799a433 #glusterfs 节点查看
6.5 Pod 挂载测试
- [root@xxx ~]# yum -y install CentOS-release-gluster
- [root@xxx ~]# yum -y install glusterfs-fuse # 安装 glusterfs-fuse
提示: 本环境 master 节点也允许分发 pod, 因此所有 master 也必须安装 glusterfs-fuse 以便于正常挂载, 同时版本需要和 glusterfs 节点一致.
- [root@k8smaster01 heketi]# vi gluster-heketi-pod.YAML
- kind: Pod
- apiVersion: v1
- metadata:
- name: gluster-heketi-pod
- spec:
- containers:
- - name: gluster-heketi-container
- image: busybox
- command:
- - sleep
- - "3600"
- volumeMounts:
- - name: gluster-heketi-volume # 必须和 volumes 中 name 一致
- mountPath: "/pv-data"
- readOnly: false
- volumes:
- - name: gluster-heketi-volume
- persistentVolumeClaim:
- claimName: gluster-heketi-pvc # 必须和 5.3 创建的 PVC 中的 name 一致
- [root@k8smaster01 heketi]# kubectl create -f gluster-heketi-pod.YAML -n heketi # 创建 Pod
6.6 确认验证
- [root@k8smaster01 ~]# kubectl get pod -n heketi | grep gluster-heketi
- gluster-heketi-pod 1/1 Running 0 4m58s
- [root@k8smaster01 ~]# kubectl exec -it gluster-heketi-pod /bin/sh -n heketi # 进入 Pod 写入测试文件
- / # cd /pv-data/
- /pv-data # echo "This is a file!">> a.txt
- /pv-data # echo "This is b file!">> b.txt
- /pv-data # ls
- a.txt b.txt
- [root@k8smaster01 ~]# kubectl exec -it gluster-heketi-pod -n heketi -- df -h # 查看所挂载的 glusterfs
1 [root@k8smaster01 ~]# kubectl get pods -n heketi -o wide # 查看对应的 glusterfs node
- [root@k8smaster01 ~]# kubectl exec -ti glusterfs-b854k -n heketi -- cat /var/lib/heketi/mounts/vg_2c7a02d1b1b7c1f165283b6691062102/brick_16e37a18a5e5fd40e14338ba78d99565/brick/a.txt
- This is a file!
提示: 通过 Pod 写入相应的测试文件, 然后通过 glusterfs node 节点查看是否存在.
6.7 删除资源
- [root@k8smaster01 ~]# cd heketi/
- [root@k8smaster01 heketi]# kubectl delete -f gluster-heketi-pod.YAML -n heketi
- [root@k8smaster01 heketi]# kubectl delete -f gluster-heketi-pvc.YAML
- [root@k8smaster01 heketi]# kubectl get pvc -n heketi
- [root@k8smaster01 heketi]# kubectl get pv -n heketi
- [root@k8smaster01 heketi]# kubectl exec -ti glusterfs-b854k -n heketi gluster volume list | grep gluster
参考: https://www.linuxba.com/archives/8152
https://www.cnblogs.com/blackmood/p/11389811.html
来源: https://www.cnblogs.com/itzgr/p/11917414.html