一 前期准备

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配置;
所有节点添加相应主机名解析:
  1 172.24.8.71 k8smaster01
2 172.24.8.72 k8smaster02
3 172.24.8.73 k8smaster03
4 172.24.8.74 k8snode01
5 172.24.8.75 k8snode02
6 172.24.8.76 k8snode03
注意:若非必要,建议关闭防火墙和SELinux。

二 规划裸设备

2.1 确认磁盘

  1 [root@k8snode01 ~]# fdisk /dev/sdb -l		#检查sdb是否为裸磁盘

三 安装glusterfs-fuse

3.1 安装相应RPM源

  1 [root@k8snode01 ~]# yum -y install centos-release-gluster
2 [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 加载相应模块

  1 [root@k8snode01 ~]# cat > /etc/sysconfig/modules/glusterfs.modules <<EOF
2 #!/bin/bash
3
4 for kernel_module in dm_snapshot dm_mirror dm_thin_pool;do
5 /sbin/modinfo -F filename \${kernel_module} > /dev/null 2>&1
6 if [ \$? -eq 0 ]; then
7 /sbin/modprobe \${kernel_module}
8 fi
9 done;
10 EOF
11 [root@k8snode01 ~]# chmod +x /etc/sysconfig/modules/glusterfs.modules
12 [root@k8snode01 ~]# lsmod |egrep "dm_snapshot|dm_mirror|dm_thin_pool" #所有glusterfs node节点检查
提示:可通过modprobe <name>加载给定的模块。

四 Kubernetes部署glusterfs

4.1 Node tag

  1 [root@k8smaster01 ~]# kubectl label nodes k8snode01 storagenode=glusterfs
2 [root@k8smaster01 ~]# kubectl label nodes k8snode02 storagenode=glusterfs
3 [root@k8smaster01 ~]# kubectl label nodes k8snode03 storagenode=glusterfs
提示:在后续使用DaemonSet部署时候kube-templates/glusterfs-daemonset.yaml存在如下针对label的Selector:


spec:


nodeSelector:


storagenode: glusterfs

4.2 下载glusterfs-Kubernetes

  1 [root@k8smaster01 ~]# yum -y install git
2 [root@k8smaster01 ~]# git clone https://github.com/gluster/gluster-kubernetes.git

4.3 修改glusterfs拓扑

  1 [root@k8smaster01 ~]# cd gluster-kubernetes/deploy/
2 [root@k8smaster01 deploy]# cp topology.json.sample topology.json
3 [root@k8smaster01 deploy]# vi topology.json
  1 {
2 "clusters": [
3 {
4 "nodes": [
5 {
6 "node": {
7 "hostnames": {
8 "manage": [
9 "k8snode01"
10 ],
11 "storage": [
12 "172.24.8.74"
13 ]
14 },
15 "zone": 1
16 },
17 "devices": [
18 "/dev/sdb"
19 ]
20 },
21 {
22 "node": {
23 "hostnames": {
24 "manage": [
25 "k8snode02"
26 ],
27 "storage": [
28 "172.24.8.75"
29 ]
30 },
31 "zone": 1
32 },
33 "devices": [
34 "/dev/sdb"
35 ]
36 },
37 {
38 "node": {
39 "hostnames": {
40 "manage": [
41 "k8snode03"
42 ],
43 "storage": [
44 "172.24.8.76"
45 ]
46 },
47 "zone": 1
48 },
49 "devices": [
50 "/dev/sdb"
51 ]
52 }
53 ]
54 }
55 ]
56 }
提示:heketi配置文件及介绍参考《附009.Kubernetes永久存储之GlusterFS独立部署》。


若需要修改heketi的暴露方式,若需要修改为NodePort,可参考https://lichi6174.github.io/glusterfs-heketi/。


所有部署相关yaml位于/root/gluster-kubernetes/deploy/kube-templates,本实验采用默认参数。

4.4 配置heketi

  1 [root@k8smaster01 deploy]# cp heketi.json.template heketi.json
2 [root@k8smaster01 deploy]# vi heketi.json
3 {
4 "_port_comment": "Heketi Server Port Number",
5 "port" : "8080",
6
7 "_use_auth": "Enable JWT authorization. Please enable for deployment",
8 "use_auth" : true, #开启用户认证
9
10 "_jwt" : "Private keys for access",
11 "jwt" : {
12 "_admin" : "Admin has access to all APIs",
13 "admin" : {
14 "key" : "admin123" #管理员密码
15 },
16 "_user" : "User only has access to /volumes endpoint",
17 "user" : {
18 "key" : "xianghy" #用户密码
19 }
20 },
21
22 "_glusterfs_comment": "GlusterFS Configuration",
23 "glusterfs" : {
24
25 "_executor_comment": "Execute plugin. Possible choices: mock, kubernetes, ssh",
26 "executor" : "${HEKETI_EXECUTOR}", #本实验使用Kubernetes方式
27
28 "_db_comment": "Database file name",
29 "db" : "/var/lib/heketi/heketi.db", #heketi数据存储
30
31 "kubeexec" : {
32 "rebalance_on_expansion": true
33 },
34
35 "sshexec" : {
36 "rebalance_on_expansion": true,
37 "keyfile" : "/etc/heketi/private_key",
38 "port" : "${SSH_PORT}",
39 "user" : "${SSH_USER}",
40 "sudo" : ${SSH_SUDO}
41 }
42 },
43
44 "backup_db_to_kube_secret": false
45 }

4.5 相关修正

新版Kubernetes的# kubectl get pod命令无--show-all选项,需要如下操作修正部署gk-deploy脚本。
  1 [root@k8smaster01 deploy]# vi gk-deploy
2 924 #heketi_pod=$(${CLI} get pod --no-headers --show-all --selector="heketi" | awk '{print $1}')
3 925 heketi_pod=$(${CLI} get pod --no-headers --selector="heketi" | awk '{print $1}')

由于国内glusterfs镜像可能无法pull,建议通过VPN等方式提前pull镜像,然后上传至所有glusterfs node节点。
  1 [root@VPN ~]# docker pull gluster/gluster-centos:latest
2 [root@VPN ~]# docker pull heketi/heketi:dev
3 [root@VPN ~]# docker save -o gluster_latest.tar gluster/gluster-centos:latest
4 [root@VPN ~]# docker save -o heketi_dev.tar heketi/heketi:dev
5 [root@k8snode01 ~]# docker load -i gluster_latest.tar
6 [root@k8snode01 ~]# docker load -i heketi_dev.tar
7 [root@k8snode01 ~]# docker images
8

4.6 正式部署

  1 [root@k8smaster01 deploy]# ./gk-deploy -h			#查看部署参数
2 [root@k8smaster01 deploy]# kubectl create ns heketi #建议部署在独立的namespace中
3 [root@k8smaster01 deploy]# ./gk-deploy -g -n heketi topology.json --admin-key admin123 --user-key xianghy
4 ……
5 Do you wish to proceed with deployment?
6
7 [Y]es, [N]o? [Default: Y]: y
提示:部署脚本更多参数参考:https://github.com/gluster/gluster-kubernetes/blob/master/deploy/gk-deploy。


注意:若部署失败,需要通过下方式彻底删除后重新部署:
  1 [root@k8smaster01 deploy]# ./gk-deploy --abort --admin-key admin123 --user-key xianghy -y -n heketi
2 [root@k8smaster01 deploy]# kubectl delete -f kube-templates/ -n heketi
glusterfs node节点需要执行如下彻底清理:
  1 [root@k8snode01 ~]# dmsetup ls
2 [root@k8snode01 ~]# dmsetup remove_all
3 [root@k8snode01 ~]# rm -rf /var/log/glusterfs/
4 [root@k8snode01 ~]# rm -rf /var/lib/heketi
5 [root@k8snode01 ~]# rm -rf /var/lib/glusterd/
6 [root@k8snode01 ~]# rm -rf /etc/glusterfs/
7 [root@k8snode01 ~]# dd if=/dev/zero of=/dev/sdb bs=512k count=1
8 [root@k8snode01 ~]# wipefs -af /dev/sdb

4.7 Kubernetes集群查看验证

  1 [root@k8smaster01 ~]# kubectl get nodes --show-labels | grep -E 'NAME|node'
2 [root@k8smaster01 ~]# kubectl get all -n heketi
  1 [root@k8smaster01 ~]# kubectl get pods -o wide -n heketi

4.8 gluster集群查看验证

  1 [root@k8smaster01 ~]# kubectl exec -it heketi-65f4555d74-72hrf -n heketi -- heketi-cli cluster list --user admin --secret admin123								#集群列表
2 [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容器查看
3 [root@k8smaster01 ~]# curl http://10.254.111.219:8080/hello
4 Hello from Heketi
注意:使用4.6脚本为一键部署,也可使用gluster-kubernetes/deploy/目录下的文件,分开逐步部署,整理部署思路如下:




  1. 使用glusterfs-daemonset.json部署glusterfs DaemonSet;

  2. 对node节点进行打标签;

  3. 使用heketi-service-account.json部署Heketi的服务帐户;

  4. 对Heketi所创建的服务帐户授权;

  5. 创建secret;

  6. 转发本地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服务

  1 [root@k8smaster01 ~]# yum -y install centos-release-gluster
2 [root@k8smaster01 ~]# yum -y install heketi-client

5.2 配置heketi

  1 [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
2 [root@k8smaster01 ~]# echo "alias heketi-cli='heketi-cli --user admin --secret admin123'" >> ~/.bashrc
3 [root@k8smaster01 ~]# source /etc/profile.d/heketi.sh
4 [root@k8smaster01 ~]# source ~/.bashrc
5 [root@k8smaster01 ~]# echo $HEKETI_CLI_SERVER
6 http://heketi:8080

5.3 集群管理

  1 [root@k8smaster01 ~]# heketi-cli cluster list
2 Clusters:
3 Id:67004a06fbcb4fa525bcec1fbaa9ef2d [file][block]
4 [root@k8smaster01 ~]# heketi-cli cluster info 67004a06fbcb4fa525bcec1fbaa9ef2d #集群详细信息
5 Cluster id: 67004a06fbcb4fa525bcec1fbaa9ef2d
6 Nodes:
7 40cdd4c1d0c389939193d6dea3c5bfe8
8 62873c54cf61025fda91e6d44433378b
9 d48986357840d28653304e7170599da5
10 Volumes:
11 5f15f201d623e56b66af56313a1975e7
12 Block: true
13
14 File: true
15 [root@k8smaster01 ~]# heketi-cli topology info 67004a06fbcb4fa525bcec1fbaa9ef2d #查看拓扑信息
16 [root@k8smaster01 ~]# heketi-cli node list #查看所有node
17 Id:40cdd4c1d0c389939193d6dea3c5bfe8 Cluster:67004a06fbcb4fa525bcec1fbaa9ef2d
18 Id:62873c54cf61025fda91e6d44433378b Cluster:67004a06fbcb4fa525bcec1fbaa9ef2d
19 Id:d48986357840d28653304e7170599da5 Cluster:67004a06fbcb4fa525bcec1fbaa9ef2d
20 [root@k8smaster01 ~]# heketi-cli node info 40cdd4c1d0c389939193d6dea3c5bfe8 #node节点信息
21 [root@k8smaster01 ~]# heketi-cli volume create --size=2 --replica=2 #默认为3副本的replica模式
  1 [root@k8smaster01 ~]# heketi-cli volume list					#列出所有卷
2 [root@k8smaster01 ~]# heketi-cli volume info fc296ab350dcc36e00dd3b3643a04645 #卷信息
3 [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的动态存储供应整体过程如下图所示:
  1. 集群管理员预先创建存储类(StorageClass);
  2. 用户创建使用存储类的持久化存储声明(PVC:PersistentVolumeClaim);
  3. 存储持久化声明通知系统,它需要一个持久化存储(PV: PersistentVolume);
  4. 系统读取存储类的信息;
  5. 系统基于存储类的信息,在后台自动创建PVC需要的PV;
  6. 用户创建一个使用PVC的Pod;
  7. Pod中的应用通过PVC进行数据的持久化;
  8. 而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》。
  1 [root@k8smaster01 ~]# echo -n "admin123" | base64		#将密码转换为64位编码
2 YWRtaW4xMjM=
3 [root@k8smaster01 ~]# mkdir -p heketi
4 [root@k8smaster01 ~]# cd heketi/
5 [root@k8smaster01 ~]# vi heketi-secret.yaml #创建用于保存密码的secret
6 apiVersion: v1
7 kind: Secret
8 metadata:
9 name: heketi-secret
10 namespace: heketi
11 data:
12 # base64 encoded password. E.g.: echo -n "mypassword" | base64
13 key: YWRtaW4xMjM=
14 type: kubernetes.io/glusterfs
15 [root@k8smaster01 heketi]# kubectl create -f heketi-secret.yaml #创建heketi
16 [root@k8smaster01 heketi]# kubectl get secrets -n heketi
17 NAME TYPE DATA AGE
18 default-token-6n746 kubernetes.io/service-account-token 3 144m
19 heketi-config-secret Opaque 3 142m
20 heketi-secret kubernetes.io/glusterfs 1 3m1s
21 heketi-service-account-token-ljlkb kubernetes.io/service-account-token 3 143m
22 [root@kubenode1 heketi]# vim gluster-heketi-storageclass.yaml #正式创建StorageClass
23 apiVersion: storage.k8s.io/v1
24 kind: StorageClass
25 metadata:
26 name: gluster-heketi-storageclass
27 parameters:
28 resturl: "http://10.254.111.219:8080"
29 clusterid: "67004a06fbcb4fa525bcec1fbaa9ef2d"
30 restauthenabled: "true" #若heketi开启认证此处也必须开启auth认证
31 restuser: "admin"
32 secretName: "heketi-secret" #name/namespace与secret资源中定义一致
33 secretNamespace: "heketi"
34 volumetype: "replicate:3"
35 provisioner: kubernetes.io/glusterfs
36 reclaimPolicy: Delete
37 [root@k8smaster01 heketi]# kubectl create -f gluster-heketi-storageclass.yaml
注意:storageclass资源创建后不可变更,如修改只能删除后重建。
  1 [root@k8smaster01 heketi]# kubectl get storageclasses		#查看确认
2 NAME PROVISIONER AGE
3 gluster-heketi-storageclass kubernetes.io/glusterfs 85s
4 [root@k8smaster01 heketi]# kubectl describe storageclasses gluster-heketi-storageclass

6.3 定义PVC

  1 [root@k8smaster01 heketi]# vi gluster-heketi-pvc.yaml
2 apiVersion: v1
3 kind: PersistentVolumeClaim
4 metadata:
5 name: gluster-heketi-pvc
6 annotations:
7 volume.beta.kubernetes.io/storage-class: gluster-heketi-storageclass
8 spec:
9 accessModes:
10 - ReadWriteOnce
11 resources:
12 requests:
13 storage: 1Gi
注意:accessModes可有如下简写:




  • ReadWriteOnce:简写RWO,读写权限,且只能被单个node挂载;

  • ReadOnlyMany:简写ROX,只读权限,允许被多个node挂载;

  • ReadWriteMany:简写RWX,读写权限,允许被多个node挂载。
  1 [root@k8smaster01 heketi]# kubectl create -f gluster-heketi-pvc.yaml -n heketi
2 [root@k8smaster01 heketi]# kubectl get pvc -n heketi
3 [root@k8smaster01 heketi]# kubectl describe pvc gluster-heketi-pvc -n heketi
4 [root@k8smaster01 heketi]# kubectl get pv -n heketi
5 [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。
  1 [root@k8smaster01 ~]# kubectl get pod -n heketi
2 [root@k8smaster01 ~]# kubectl exec -ti glusterfs-b854k -n heketi -- lsblk #glusterfs节点查看
3 [root@k8smaster01 ~]# kubectl exec -ti glusterfs-b854k -n heketi -- df -hT #glusterfs节点查看
4 [root@k8smaster01 ~]# kubectl exec -ti glusterfs-b854k -n heketi -- gluster volume list
5 [root@k8smaster01 ~]# kubectl exec -ti glusterfs-b854k -n heketi -- gluster volume info vol_29ba6f9665522ad5893412e61799a433 #glusterfs节点查看

6.5 Pod挂载测试

  1 [root@xxx ~]# yum -y install centos-release-gluster
2 [root@xxx ~]# yum -y install glusterfs-fuse #安装glusterfs-fuse
提示:本环境master节点也允许分发pod,因此所有master也必须安装glusterfs-fuse以便于正常挂载,同时版本需要和glusterfs节点一致。
  1 [root@k8smaster01 heketi]# vi gluster-heketi-pod.yaml
2 kind: Pod
3 apiVersion: v1
4 metadata:
5 name: gluster-heketi-pod
6 spec:
7 containers:
8 - name: gluster-heketi-container
9 image: busybox
10 command:
11 - sleep
12 - "3600"
13 volumeMounts:
14 - name: gluster-heketi-volume #必须和volumes中name一致
15 mountPath: "/pv-data"
16 readOnly: false
17 volumes:
18 - name: gluster-heketi-volume
19 persistentVolumeClaim:
20 claimName: gluster-heketi-pvc #必须和5.3创建的PVC中的name一致
21 [root@k8smaster01 heketi]# kubectl create -f gluster-heketi-pod.yaml -n heketi #创建Pod

6.6 确认验证

  1 [root@k8smaster01 ~]# kubectl get pod -n heketi | grep gluster-heketi
2 gluster-heketi-pod 1/1 Running 0 4m58s
3 [root@k8smaster01 ~]# kubectl exec -it gluster-heketi-pod /bin/sh -n heketi #进入Pod写入测试文件
4 / # cd /pv-data/
5 /pv-data # echo "This is a file!" >> a.txt
6 /pv-data # echo "This is b file!" >> b.txt
7 /pv-data # ls
8 a.txt b.txt
9 [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
  1 [root@k8smaster01 ~]# kubectl exec -ti glusterfs-b854k -n heketi -- cat /var/lib/heketi/mounts/vg_2c7a02d1b1b7c1f165283b6691062102/brick_16e37a18a5e5fd40e14338ba78d99565/brick/a.txt
2 This is a file!
提示:通过Pod写入相应的测试文件,然后通过glusterfs node节点查看是否存在。

6.7 删除资源

  1 [root@k8smaster01 ~]# cd heketi/
2 [root@k8smaster01 heketi]# kubectl delete -f gluster-heketi-pod.yaml -n heketi
3 [root@k8smaster01 heketi]# kubectl delete -f gluster-heketi-pvc.yaml
4 [root@k8smaster01 heketi]# kubectl get pvc -n heketi
5 [root@k8smaster01 heketi]# kubectl get pv -n heketi
6 [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

附010.Kubernetes永久存储之GlusterFS超融合部署的更多相关文章

  1. 附009.Kubernetes永久存储之GlusterFS独立部署

    一 前期准备 1.1 基础知识 Heketi提供了一个RESTful管理界面,可以用来管理GlusterFS卷的生命周期.Heketi会动态在集群内选择bricks构建所需的volumes,从而确保数 ...

  2. 附013.Kubernetes永久存储Rook部署

    一 Rook概述 1.1 Ceph简介 Ceph是一种高度可扩展的分布式存储解决方案,提供对象.文件和块存储.在每个存储节点上,将找到Ceph存储对象的文件系统和Ceph OSD(对象存储守护程序)进 ...

  3. 附024.Kubernetes全系列大总结

    Kubernetes全系列总结如下,后期不定期更新.欢迎基于学习.交流目的的转载和分享,禁止任何商业盗用,同时希望能带上原文出处,尊重ITer的成果,也是尊重知识.若发现任何错误或纰漏,留言反馈或右侧 ...

  4. 附014.Kubernetes Prometheus+Grafana+EFK+Kibana+Glusterfs整合解决方案

    一 glusterfs存储集群部署 注意:以下为简略步骤,详情参考<附009.Kubernetes永久存储之GlusterFS独立部署>. 1.1 架构示意 略 1.2 相关规划 主机 I ...

  5. 附014.Kubernetes Prometheus+Grafana+EFK+Kibana+Glusterfs整合性方案

    一 glusterfs存储集群部署 注意:以下为简略步骤,详情参考<附009.Kubernetes永久存储之GlusterFS独立部署>. 1.1 架构示意 略 1.2 相关规划 主机 I ...

  6. 基于 VMware 的超融合, 解析 vSAN 与 SmartX ZBS 的优劣差异

    在企业级IT领域从业多年,最近越来越多地听到圈内人谈论起超融合技术的种种好处.的确,超融合技术已越来越走向成熟,带来的价值也逐渐凸显.它可靠性高,资源消耗低,尤其是运维部署非常便捷.在企业基础架构领域 ...

  7. 部署oVirt4.2+Gluster超融合架构

    首先下载最新ovirt-node iso镜像 准备3台机器,配置为2核,16G内存,两块硬盘,1块100G装系统,1块300G做存储 node1.com(192.168.105.221) node2. ...

  8. 【原创译文】基于Docker和Rancher的超融合容器云架构

    基于Docker和Rancher的超融合容器云架构 ---来自Rancher和Redapt 超融合架构在现代数据中心是一项巨大的变革.Nutanix公司发明了超融合架构理论,自从我听说他们的“iPho ...

  9. 奔跑吧,OpenStack现场分享:超融合架构如何抹平物理硬件差异?

    转自:https://www.ustack.com/blog/moping/ “通过引入OpenStack这一中间层,实现了云平台统一的管理调度支配向上交付,解决了业务的灵活性问题.但是在抹平下层物理 ...

随机推荐

  1. Spring Boot入门(一):搭建Spring Boot项目

    从本篇博客开始,我们开始进入Spring Boot的世界,它的出现使Spring的开发变得更加简洁,因此一经推出受到众多程序员的喜爱. 作为Spring Boot系列的第一篇博客,我们先来讲解下如何搭 ...

  2. 如何把应用程序移植到k8s

    程序部署环境的容器化已经是大势所趋,微服务为容器化提供了广阔的应用舞台,k8s已经把Docker纳入为它的底层支撑容器引擎,一统江湖,成为了容器技术事实上的标准.一般的应用程序是不能直接拿来部署到容器 ...

  3. iOS开发高级分享 - Unread的下拉式选单

    解构革命的演变 背景 2013年中期,RSS世界遭受了沉重打击.谷歌宣布,他们(*的*)RSS订阅服务,[谷歌阅读器],是被关闭了.有了它,数以百万计的声音突然惊恐地大叫,并突然保持沉默. 使用量下降 ...

  4. Mysql数据库(十一)事务与锁机制

    一.事务机制 1.事务的概念 事务是指一组互相依赖的操作单元的集合,用来保证对数据库的正确修改,保持数据的完整性,如果一个事务的某个单元操作失败,将取消本次事务的全部操作. 比如将A账户的资金转入B账 ...

  5. Unity3D图像后处理特效——Depth of Field 3.4

    Depth of Field 3.4 is a common postprocessing effect that simulates the properties of a camera lens. ...

  6. django & celery - 关于并发处理能力和内存使用的小结

    背景 众所周知,celery 是python世界里处理分布式任务的好助手,它的出现结合赋予了我们强大的处理异步请求,分布式任务,周期任务等复杂场景的能力. 然鹅,今天我们所要讨论的则是如何更好的在使用 ...

  7. Java 高并发之魂

    前置知识 了解Java基本语法 了解多线程基本知识 知识介绍 Synchronized简介:作用.地位.不控制并发的后果 两种用法:对象锁和类锁 多线程访问同步方法的7种情况:是否是static.Sy ...

  8. 基于UGUI的框架

    这个框架简单易懂,上手就可以直接拿来用,主要是单例管理类,界面和界面之间的互相交流通过单例去实现,个人感觉不是很好,但是我特别喜欢他的管理层级非常分明. 之后会发一个广播机制,结合上这套UI框架,但是 ...

  9. 解决SAP740 GUI 搜索帮助(F4)回填值乱码的问题

    SAP 740客户端引入了搜索帮助增强功能,并且默认是开启该功能的,在带有F4搜索帮助的字段输入框中输入字段的前两个字符,可以自动以下拉框的方式带出包含包含所输入字符的条目,从而实现快速的输入帮助,如 ...

  10. [考试反思]1105csp-s模拟测试102: 贪婪

    还是有点蠢... 多测没清空T3挂40...(只得了人口普查分20) 多测题要把样例复制粘两遍自测一下防止未清空出锅. 然而不算分... 其实到现在了算不算也不重要了吧... 而且其实T3只考虑最长路 ...