使用GlusterFS和Heketi的Kubernetes和OpenShift动态卷配置
欢迎来到我们的教程,该教程为Kubernetes/OpenShift集群使用GlusterFS和Heketi设置持久卷动态预配置。 GlusterFS是一个免费的开源可扩展网络文件系统,适用于数据密集型任务,例如云存储和媒体流。它利用常见的现成硬件。在我的设置中,我选择在Kubernetes节点上将GlusterFS部署为超融合服务。这将释放Kubernetes中动态预配置的持久性GlusterFS卷的功能。
很好地使用gluster-kubernetes项目,该项目为Kubernetes管理员提供了一种机制,可以轻松地将GlusterFS作为本机存储服务部署到现有Kubernetes集群上。其中与Kubernetes中的任何其他应用程序一样,对GlusterFS进行管理和编排。 heketi是用于GlusterFS的RESTful卷管理接口。它允许我们使用API创建和管理Gluster卷。
基础设施要求
以下是设置的基本要求。
必须至少有三个节点每个节点必须至少连接一个原始块设备以供heketi使用每个节点必须为GlusterFS通信打开以下端口:2222用于GlusterFS pod sshd,24007用于GlusterFS Daemon,24008用于GlusterFS Management,49152至在主机上为每个创建的砖块创建49251.必须加载以下内核模块:dm_snapshotdm_mirrordm_thin_pool每个节点都要求mount.glusterfs
命令可用。节点上安装的GlusterFS客户端版本应尽可能接近服务器的版本。
设置Kubernetes/OpenShift集群
该设置假设我们有一个正在运行的Kubernetes/OpenShift(OKD)集群。请参阅我们的教程,以了解如何快速启动集群以用于测试/生产。
使用Ansible和Kubespray部署生产就绪的Kubernetes集群
如何使用Weave Net CNI在Ubuntu 18.04上设置3节点Kubernetes集群
在所有节点上安装glusterfs /配置防火墙
如果我们使用的是基于Red Hat的Linux发行版,请安装提供了mount.glusterfs命令的glusterfs-fuse软件包。
sudo yum -y install glusterfs-fuse
对于Ubuntu/Debian:
sudo apt-get install glusterfs-client
加载所需的所有内核模块
for i in dm_snapshot dm_mirror dm_thin_pool; do sudo modprobe $i; done
检查模块是否已加载。
$sudo lsmod | egrep 'dm_snapshot|dm_mirror|dm_thin_pool' dm_thin_pool 66358 0 dm_persistent_data 75269 1 dm_thin_pool dm_bio_prison 18209 1 dm_thin_pool dm_mirror 22289 0 dm_region_hash 20813 1 dm_mirror dm_log 18411 2 dm_region_hash,dm_mirror dm_snapshot 39103 0 dm_bufio 28014 2 dm_persistent_data,dm_snapshot dm_mod 124461 5 dm_log,dm_mirror,dm_bufio,dm_thin_pool,dm_snapshot
检查安装的版本。
$glusterfs --version glusterfs 3.12.2
同时在防火墙CentOS/RHEL/Fedora上打开所需的端口
for i in 2222 24007 24008 49152-49251; do sudo firewall-cmd --add-port=${i}/tcp --permanent done sudo firewall-cmd --reload
检查Kubernetes集群状态
通过确保集群中的所有节点均已就绪来验证Kubernetes的安装:
$kubectl get nodes NAME STATUS ROLES AGE VERSION master01 Ready master 146m v1.15.3 worker01 Ready <none> 146m v1.15.3 worker02 Ready <none> 146m v1.15.3 worker03 Ready <none> 146m v1.15.3
要查看运行的Kubernetes的确切版本,请使用:
$kubectl version Client Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.3", GitCommit:"2d3c76f9091b6bec110a5e63777c332469e0cba2", GitTreeState:"clean", BuildDate:"2019-08-19T11:05:50Z", GoVersion:"go1.12.9", Compiler:"gc", Platform:"linux/amd64"}
将辅助原始磁盘添加到节点
每个节点必须至少连接一个原始块设备,以供heketi使用。我已经向我的k8s节点添加了2个50gb的虚拟磁盘。
[worker01 ~]$lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT vda 253:0 0 20G 0 disk └─vda1 253:1 0 20G 0 part / vdc 253:32 0 50G 0 disk vdd 253:48 0 50G 0 disk [worker02 ~]$lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT vda 253:0 0 20G 0 disk └─vda1 253:1 0 20G 0 part / vdc 253:32 0 50G 0 disk vdd 253:48 0 50G 0 disk [worker03 ~]$lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT vda 253:0 0 20G 0 disk └─vda1 253:1 0 20G 0 part / vdc 253:32 0 50G 0 disk vdd 253:48 0 50G 0 disk
创建拓扑文件
我们必须提供GlusterFS群集拓扑信息,该信息描述GlusterFS群集中存在的节点以及连接到这些节点的块设备,以供heketi使用。
由于我在Kubernetes主节点上运行所有操作,因此让我们从Github中提取gluster-kubernetes。
sudo yum -y install git vim git clone https://github.com/gluster/gluster-kubernetes.git
复制和编辑拓扑信息模板。
cd gluster-kubernetes/deploy/ cp topology.json.sample topology.json
这就是我的配置。
{ "clusters": [ { "nodes": [ { "node": { "hostnames": { "manage": [ "worker01" ], "storage": [ "10.10.1.193" ] }, "zone": 1 }, "devices": [ "/dev/vdc", "/dev/vdd" ] }, { "node": { "hostnames": { "manage": [ "worker02" ], "storage": [ "10.10.1.167" ] }, "zone": 1 }, "devices": [ "/dev/vdc", "/dev/vdd" ] }, { "node": { "hostnames": { "manage": [ "worker03" ], "storage": [ "10.10.1.178" ] }, "zone": 1 }, "devices": [ "/dev/vdc", "/dev/vdd" ] } ] } ] }
什么时候
创建自己的拓扑文件:确保拓扑文件仅列出供heketis使用的块设备。 heketi需要访问将对其进行分区和格式化的整个块设备(例如/dev/vdc,/dev/vdd)。hostnames数组有点误导。 "管理"应该是节点的主机名列表,但是"存储"应该是节点上用于后端存储通信的IP地址列表。
运行部署脚本
创建了拓扑文件后,就可以从具有对Kubernetes群集的管理访问权限的机器上运行gk-deploy脚本。如果不是从主节点运行,请将Kubernetes配置文件复制到~/.kube/config。
熟悉可用的选项。
./gk-deploy -h
常用选项:
-g, --deploy-gluster: Deploy GlusterFS pods on the nodes in the topology that contain brick devices --ssh-user USER: User to use for SSH commands to GlusterFS nodes. Non-root users must have sudo permissions on the nodes. Default is 'root' --user-key USER_KEY: Secret string for general heketi users. This is a required argument. -l LOG_FILE, --log-file LOG_FILE: Save all output to the specified file. -v, --verbose: Verbose output
运行以下命令以开始GlusterFS/Heketi的部署,将MyUserStrongKey和MyAdminStrongKey替换为键值。
./gk-deploy -g \ --user-key MyUserStrongKey \ --admin-key MyAdminStrongKey \ -l /tmp/heketi_deployment.log \ -v topology.json
按Y键接受安装。
Do you wish to proceed with deployment? [Y]es, [N]o? [Default: Y]: Y
如果部署成功,我们将收到一条消息:
heketi is now running and accessible via http://10.233.108.5:8080
请参见下面的屏幕截图。
成功部署后,将自动创建Pod,服务和端点。 GlusterFS和heketi现在应该已安装并准备就绪。
$kubectl get deployments NAME READY UP-TO-DATE AVAILABLE AGE heketi 1/1 1 1 75m $kubectl get pods NAME READY STATUS RESTARTS AGE glusterfs-44jvh 1/1 Running 0 110m glusterfs-j56df 1/1 Running 0 110m glusterfs-lttb5 1/1 Running 0 110m heketi-b4b94d59d-bqmpz 1/1 Running 0 76m $kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE heketi ClusterIP 10.233.42.58 <none> 8080/TCP 76m heketi-storage-endpoints ClusterIP 10.233.41.189 <none> 1/TCP 76m kubernetes ClusterIP 10.233.0.1 <none> 443/TCP 127m $kubectl get endpoints NAME ENDPOINTS AGE heketi 10.233.108.5:8080 76m heketi-storage-endpoints 10.10.1.167:1,10.10.1.178:1,10.10.1.193:1 77m kubernetes 10.10.1.119:6443 127m
安装并使用heketi-cli与GlusterFS进行交互
heketi-cli用于与Kubernetes集群上部署的GlusterFS进行交互。下载最新版本并将二进制文件放入PATH。
curl -s https://api.github.com/repos/heketi/heketi/releases/latest \ | grep browser_download_url \ | grep linux.amd64 \ | cut -d '"' -f 4 \ | wget -qi
提取下载的存档文件这将同时具有客户端和服务器。
for i in `ls | grep heketi | grep .tar.gz`; do tar xvf $i; done
将heketi-cli复制到/usr/local/bin目录。
sudo cp ./heketi-client/bin/heketi-cli /usr/local/bin
当任何用户登录到服务器时,我们都应该能够获得heketi-cli版本。
$heketi-cli --version heketi-cli v9.0.0
我们可以为heketi-cli设置HEKETI_CLI_SERVER环境变量以直接读取它。
export HEKETI_CLI_SERVER=$(kubectl get svc/heketi --template 'http://{{.spec.clusterIP}}:{{(index .spec.ports 0).port}}')
确认变量值:
$echo $HEKETI_CLI_SERVER http://10.233.108.5:8080
查询集群详细信息
$heketi-cli cluster list --user admin --secret MyAdminStrongKey Clusters: Id:88ed1913182f880ab5eb22ca2f904615 [file][block] $heketi-cli cluster info 88ed1913182f880ab5eb22ca2f904615 Cluster id: 88ed1913182f880ab5eb22ca2f904615 Nodes: 1efe9a69341b50b00a0b15f6e7d8c797 2d48f05c7d7d8d1e9f4b4963ef8362e3 cf5753b191eca0b67aa48687c08d4e12 Volumes: e06893fc6e4f5fa23994432a40877889 Block: true File: true
如果将Heketi管理员用户名和密钥另存为环境变量,则无需传递这些选项。
$export HEKETI_CLI_USER=admin $export HEKETI_CLI_KEY=MyAdminStrongKey $heketi-cli cluster list Clusters: Id:5c94db92049afc5ec53455d88f55f6bb [file][block] $heketi-cli cluster info 5c94db92049afc5ec53455d88f55f6bb Cluster id: 5c94db92049afc5ec53455d88f55f6bb Nodes: 3bd2d62ea6b8b8c87ca45037c7080804 a795092bad48ed91be962c6a351cbf1b e98fd47bb4811f7c8adaeb572ca8823c Volumes: 119c23455c894c33e968a1047b474af2 Block: true File: true $ heketi-cli node list Id:75b2696a9e142e6900ee9fd2d1eb56b6 Cluster:23800e4b6bdeebaec4f6c45b17cabf55 Id:9ca47f98eaa60f0e734ab628897160fc Cluster:23800e4b6bdeebaec4f6c45b17cabf55 Id:c43023282eef0f10d4109c68bcdf0f9d Cluster:23800e4b6bdeebaec4f6c45b17cabf55
查看拓扑信息:
$heketi-cli topology info Cluster Id: 698754cfaf9642b451c4671f96c46a0b File: true Block: true Volumes: Nodes: Node Id: 39e8fb3b09ccfe47d1d3f2d8e8b426c8 State: online Cluster Id: 698754cfaf9642b451c4671f96c46a0b Zone: 1 Management Hostnames: worker03 Storage Hostnames: 10.10.1.178 Devices: Node Id: b9c3ac6737d27843ea0ce69a366de48c State: online Cluster Id: 698754cfaf9642b451c4671f96c46a0b Zone: 1 Management Hostnames: worker01 Storage Hostnames: 10.10.1.193 Devices: Node Id: c94636a003af0ca82e7be6962149869b State: online Cluster Id: 698754cfaf9642b451c4671f96c46a0b Zone: 1 Management Hostnames: worker02 Storage Hostnames: 10.10.1.167 Devices:
创建用于动态配置的StorageClass。
$vim gluster-storage-class.yaml -- apiVersion: storage.k8s.io/v1beta1 kind: StorageClass metadata: name: glusterfs-storage provisioner: kubernetes.io/glusterfs parameters: resturl: "http://10.233.108.5:8080" restuser: "admin" restuserkey: "MyAdminStrongKey" $kubectl create -f gluster-storage-class.yaml storageclass.storage.k8s.io/glusterfs-storage created $kubectl get storageclass NAME PROVISIONER AGE glusterfs-storage kubernetes.io/glusterfs 18s $kubectl describe storageclass.storage.k8s.io/glusterfs-storage Name: glusterfs-storage IsDefaultClass: No Annotations: <none> Provisioner: kubernetes.io/glusterfs Parameters: resturl=http://10.233.108.5:8080,restuser=admin,restuserkey=MyAdminStrongKey AllowVolumeExpansion: <unset> MountOptions: <none> ReclaimPolicy: Delete VolumeBindingMode: Immediate Events: <none>
创建PVC
$cat gluster-pvc.yaml -- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: glusterpvc01 annotations: volume.beta.kubernetes.io/storage-class: glusterfs-storage spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi $kubectl create -f gluster-pvc.yaml persistentvolumeclaim/glusterpvc01 created
其中:glusterfs-storage是Kubernetes存储类注释和存储类的名称.1Gi是请求的存储量