本文介绍使用GlusterFS和Heketi为您的Kubernetes/OpenShift集群设置持久卷动态配置。 GlusterFS是一个免费的开源可扩展网络文件系统,适用于云存储和媒体流等数据密集型任务。它使用常见的现成硬件,在我的设置中,我选择将GlusterFS部署为Kubernetes节点上的超融合服务,这将释放Kubernetes中动态配置的持久性GlusterFS卷的强大功能。我们将使用gluster-kubernetes项目,该项目为Kubernetes管理员提供了一种机制,可以将GlusterFS作为本机存储服务轻松部署到现有的Kubernetes集群上。在这里,GlusterFS像Kubernetes中的任何其他应用程序一样进行管理和编排。heketi是GlusterFS的RESTful卷管理界面,它允许您使用API创建和管理Gluster卷。
基础设施要求 以下是设置的基本要求。 1、必须至少有三个节点。 2、每个节点必须至少有一个原始块设备连接供heketi使用。 3、每个节点必须为GlusterFS通信打开以下端口:GlusterFS pod的sshd为2222,GlusterFS Daemon为24007,GlusterFS管理为24008,主机上创建的每个brick为49152至49251。 4、必须加载以下内核模块: dm_snapshot dm_mirror dm_thin_pool 5、每个节点都要求mount.glusterfs命令可用。 6、安装在节点上的GlusterFS客户端版本应尽可能接近服务器版本。
一、设置Kubernetes/OpenShift集群参考文章 此设置假设您有一个正在运行的Kubernetes/OpenShift(OKD)群集。参考:使用Ansible和Kubespray部署生产就绪Kubernetes集群的步骤、使用Weave Net CNI在Ubuntu 18.04中设置3节点Kubernetes集群。
二、在所有节点上安装glusterfs/配置防火墙 如果您使用的是基于Red Hat的Linux发行版,请安装glusterfs-fuse软件包,该软件包提供了mount.glusterfs命令: 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'
检查安装的版本: $ 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
要查看正在运行的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 [worker02 ~]$ lsblk [worker03 ~]$ lsblk
五、创建拓扑文件 您必须提供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" ] } ] } ] } 创建自己的拓扑文件时: 1、确保拓扑文件仅列出了用于heketi的块设备,heketi需要访问整个块设备(例如/dev/vdc,/dev/vdd),它将进行分区和格式化。 2、主机名数组有点误导,manage应该是节点的主机名列表,但存储应该是节点上用于后端存储通信的IP地址列表。
六、运行部署脚本 创建拓扑文件后,您就可以从具有Kubernetes集群管理访问权限的计算机上运行gk-deploy脚本,如果未从主节点运行,请将Kubernetes配置文件复制到~/.kube/config。 可用选项: ./gk-deploy -h 常见选项: -g, --deploy-gluster:在包含brick设备的拓扑中的节点上部署GlusterFS pod。 --ssh-user USER:用于将命令用于GlusterFS节点的用户,非root用户必须在节点上具有sudo权限。默认为'root'。 --user-key USER_KEY:一般heketi用户的密码字符串,这是必需的论点。 -l LOG_FILE, --log-file LOG_FILE:将所有输出保存到指定的文件。 -v, --verbose:详细输出 运行以下命令开始部署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 $ kubectl get pods $ kubectl get services $ kubectl get endpoints
七、安装并使用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 $ heketi-cli cluster info 88ed1913182f880ab5eb22ca2f904615
如果将Heketi admin用户名和密钥保存为环境变量,则无需传递这些选项: $ export HEKETI_CLI_USER=admin $ export HEKETI_CLI_KEY=MyAdminStrongKey $ heketi-cli cluster list $ heketi-cli cluster info 5c94db92049afc5ec53455d88f55f6bb $ heketi-cli node list
查看拓扑信息: $ heketi-cli topology info
创建StorageClass以进行动态配置: $ vim gluster-storage-class.yaml $ kubectl create -f gluster-storage-class.yaml $ kubectl get storageclass $ kubectl describe storageclass.storage.k8s.io/glusterfs-storage
创建PVC: $ cat gluster-pvc.yaml $ kubectl create -f gluster-pvc.yaml
注: 1、glusterfs-storage是Kubernetes存储类注释和存储类的名称。 2、1Gi是请求的存储量。
相关主题 |