目 录
1 前言 1
2 实验环境 1
2.3 网络拓扑 3
3 硬件准备 3
4 软件准备 4
4.4.1 简介 6
6 使用MinIO Operator 控制台 11
分布式存储-第4期
(kubernetes+MinIO集群)
元工:2022.07.10
前言
背景:最近大家对容器技术的讨论越来越多,兴趣也越来越浓,容器的应用场景也非常之多,其中在分布式系统应用领域更突显它的优势和魅力,本文是工作之余所做相关实验的整理,供大家一起学习和分享。
目标:在仅有的一台工作电脑上搭建全能型虚拟化容器平台,并在其上运行目前主流的分布式存储系统(如:Ceph、Minio、GlusterFS等)作为应用场景进行全方位体验和学习。
亮点:MinIO多租户场景;采用DirectPV直接存储CSI插件作为MinIO的底层存储,相比K8S自身的Volume、PV/PVC等具有更高性能和灵活性;本期实验遇到了太多“坑”均已填平。
价值:减少学习的硬件成本、减少学习目标前面的障碍、化天堑为通途;不仅是学习容器技术的入门宝典,也为学习分布式存储系统的同学提供了实验环境准备的方法。
使用要求:对Linux、VMware workstaion有一定的熟悉,祝您使用愉快!
下期预告:
- 第1期:容器化部署分布式系统(Docker-Compose+MinIO集群), [元工]
- 第2期:容器化部署分布式系统(kubernetes之kubeadm安装), [元工]
- 第3期:容器化部署分布式系统(kubernetes之操作实践), [元工]
- 第4期:容器化部署分布式系统(kubernetes+MinIO集群), [元工,李有军]
- 第5期:容器化部署分布式系统('你猜1'+'我猜2'), [元工,欢迎加入]
实验环境
MinIO系统架构
下图描述了部署到Kubernetes的MinIO多租户体系结构。
MinIO集群规划
规划方法参考官网链接:https://min.io/product/erasure-code-calculator。
注意:下面的Servers并不对应K8S的nodes,而是对应K8S的pods,因此即使Servers要求4个以上,但不代表K8S的Worker node 也需要4个以上,因此本期我们可以直接利用前面第2期K8S初装好的实验环境即可。
网络拓扑
网络设计详细情况请参考第1期第2章节的内容,实验拓扑如下面左图所示:
硬件准备
调整虚拟机资源
现在1台内存16GB笔记本电脑要运行4个虚拟机,运行K8S、本期要新增的MinIO集群和数据盘新需求,有必要重新调整实验环境中各虚拟机的资源分配,方案如下:
虚拟机 | 节点名 | IP地址 | 角色 | vCPU | 内存 | 磁盘(数据) |
K8S | node1 | 192.168.66.11 | Master | 4 | 3GB | - |
K8S02 | node2 | 192.168.66.12 | worker | 3 | 3GB | 1TB *4 |
K8S03 | node3 | 192.168.66.13 | worker | 3 | 3GB | 1TB *4 |
K8S04 | node4 | 192.168.66.14 | worker | 3 | 3GB | 1TB *4 |
以虚拟机K8S02为例:新增4块1TB硬盘,结果如前面章节2.3的右图所示。
使能磁盘scsi_id
填坑!因为vmware虚拟机默认未使能硬盘scsi_id,后面将要涉及的“DriectPV存储插件”会因此导致无法正确识别drives,对于本实验VMWare Workstation平台的解决办法如下:
找到虚拟机目录中的“xxx.vmx”文件,编辑打开后在文件末尾添加下面两行,然后重启虚拟机即可。 disk.EnableUUID = "TRUE" disk.locking=false |
node2~4等worker节点的虚拟机都需要进行以上操作,node1则不必要。
软件准备
K8S 版本1.19.0+
目前MinIO最新版本为v4.4.25,从V4.0.0开始MinIO Operator and MinIO Kubernetes Plugin 要求Kubernetes 1.19.0+ 的版本。
1)检查K8S版本是否高于1.19.0
利用第2期的K8S初装环境;或者将第3期实验过程中产生的资源清理干净,主要包括default命名空间中的service(除kubernetes外)、deployment、job、pod,pvc,pv等,以减少虚拟机资源的消耗和结果查看的干扰。
[root@node1 ~]# kubectl version // 从以上结果看到K8S版本为v1.23.8,满足条件! |
安装K8S krew
K8S krew是一个插件管理工具,本期实验中的MinIO Kubernetes Operator and Plugin都需要通过它来安装,步骤如下:
1)安装git
[root@node1 ~]# yum -y install git |
2)安装krew
[root@node1 ~]# ( set -x; cd "$(mktemp -d)" && OS="$(uname | tr '[:upper:]' '[:lower:]')" && ARCH="$(uname -m | sed -e 's/x86_64/amd64/' -e 's/\(arm\)\(64\)\?.*/\1\2/' -e 's/aarch64$/arm64/')" && KREW="krew-${OS}_${ARCH}" && curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/${KREW}.tar.gz" && tar zxvf "${KREW}.tar.gz" && ./"${KREW}" install krew ) // 填坑!如果上面安装失败,则通过下面方法手动完成下载、解压和安装 1、手动下载 [root@node1 ~]# wget https://github.com/kubernetes-sigs/krew/releases/latest/download/krew-linux_amd64.tar.gz // 填坑!如果以上下载失败,将https改为"http"再试试,直到下载成功。 [root@node1 ~]# ls 2、解压 [root@node1 ~]# tar zxvf krew-linux_amd64.tar.gz [root@node1 ~]# ls 3、安装 [root@node1 ~]# ./krew-linux_amd64 install krew |
3)配置环境变量
1、根据上面(1)的提示,在~/.bashrc的最后一行添加下面配置变量: export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH" [root@node1 ~]# vim ~/.bashrc 2、然后重启shell,或者重新登录 |
4)验证结果
1、按前面的提示(2)执行下面命令,如果输出正常,表示安装成功 [root@node1 ~]# kubectl krew [root@node1 ~]# kubectl krew search | grep directpv // 请留意:从以上看出krew包含了很多插件部署的yaml文件,后面会用到的。 |
K8S TLS 证书API
需确认kube-controller-manager的设置参数是否包含了TLS相关的证书和密钥。
1)查找本环境中kube-controller-manager的pod名称
[root@node1 ~]# kubectl get pod -n kube-system |
2)查看kube-controller-manager的详细配置
[root@node1 ~]# kubectl get pod kube-controller-manager-node1 -n kube-system -o yaml // 确认配置中包含了以上红框内的两行内容。 |
DirectPV
简介
分布式数据存储(如对象存储、数据库和消息队列)是为直连存储而设计的,它们自行处理高可用性和数据持久性。传统的SAN或基于NAS的CSI驱动程序(Network PV)上运行它们会在数据路径中添加另一层复制/擦除编码和额外的网络跳数,这种额外的分解层会导致复杂性增加和性能降低(如下图所示),而且Kubernetes hostPath和本地PV是静态配置的,功能也有限,这里使用DirectPV就是为了解决这一限制。
DirectPV是用于直连存储的CSI驱动程序,它是一个分布式持久卷管理器,在跨服务器发现、格式化、装载、调度和监视驱动器非常有用。
系统架构
DirectPV设计为轻量级,可扩展到10~1000个驱动器。它由三个组件组成:控制器、节点驱动程序、用户界面。
1.控制器
在进行卷声明时,控制器会从驱动器统一调配卷。DirectPV知道pod的关联约束,并将卷从本地驱动器分配到pod。请注意,每个群集只运行一个活动的controller实例。
2.节点驱动程序
节点驱动程序实现卷管理功能,例如发现、格式化、装载和监视节点上的驱动器。每个存储服务器上都运行一个节点驱动程序实例。
3.用户界面
存储管理员可以使用kubectl CLI插件来选择、管理和监视驱动器。基于Web的UI目前正在开发中。
安装步骤
1)安装directpv plugin
[root@node1 ~]# kubectl krew install directpv // 填坑!如果上面安装失败,则通过下面方法手动完成下载、解压和安装 1、下载在本地 // 注意:上面失败信息中包含“kubectl-directpv_linux_amd64.zip”的下载链接。 2、将krew中的directpv.yaml复制到本地 [root@node1 ~]# cp .krew/index/default/plugins/directpv.yaml ./ 3、krew本地安装 [root@node1 ~]# kubectl krew install --manifest=directpv.yaml --archive=kubectl-directpv_linux_amd64.zip 4、检查安装是否成功 [root@node1 ~]# kubectl directpv 5、卸载(备用,最好也不要用到!) [root@node1 ~]#kubectl krew uninstall directpv |
2)将directpv部署到K8S集群中
[root@node1 ~]# kubectl directpv install |
3)确认directpv已经成功运行
[root@node1 ~]# kubectl directpv info
|
4)查看集群中可用的drives
[root@node1 ~]# kubectl directpv drives ls 注意1:容量为1TiB的Drive行,FILESYSTEM列中显示“-”的行,表示还没有格式化。 |
5)选择用于directpv管理的驱动器,并格式化
[root@node1 ~]# kubectl directpv drives format --drives /dev/sd{b...e} --nodes node{2...4} 查看结果如下: |
6)查看其它安装状态
[root@node1 ~]# kubectl get pod -o wide -n direct-csi-min-io [root@node1 ~]# kubectl get deployment -o wide -n direct-csi-min-io [root@node1 ~]# kubectl get svc -o wide -n direct-csi-min-io |
安装MinIO Operator
1)使用Krew安装 MinIO Operator and Plugin:
[root@node1 ~]# kubectl krew install minio // 填坑!如果上面安装失败,则通过下面方法手动完成下载、解压和安装 1、下载到本地 2、复制krew中minio.yaml到本地 [root@node1 ~]# cp ~/.krew/index/default/plugins/minio.yaml ./ 3、krew本地安装 [root@node1 ~]# kubectl krew install --manifest=minio.yaml --archive=kubectl-minio_linux_amd64.zip |
2)查看minio的安装版本:
[root@node1 ~]# kubectl minio version v4.4.25 |
3)初始化 MinIO Operator
[root@node1 ~]# kubectl minio init // 以上看出,默认创建的命名空间为"minio-operator" |
4)检查MinIO Operator的运行状态
[root@node1 ~]# kubectl get all --namespace minio-operator // 以上3个pod状态已为'Running',表示初始化安装成功! |
使用MinIO Operator 控制台
1)创建一个本地代理将MinIO Operator Console发布出去。
[root@node1 ~]# kubectl minio proxy -n minio-operator Starting port forward of the Console UI. To connect open a browser and go to http://localhost:9090 Current JWT to login: eyJhbGciOiJSUzI1NiIsImtpZCI6IjhTVGNzTTRET1laalQxeUl0R2tyYzljRENXUklQN3RGTHR6cDR4TUh4Q1UifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJtaW5pby1vcGVyYXRvciIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJjb25zb2xlLXNhLXRva2VuLWZmeHZuIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImNvbnNvbGUtc2EiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI2NDI5ZTZiOS02NDhmLTQwNDMtOGI4My1kMmRkNzZhNDAxZGMiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6bWluaW8tb3BlcmF0b3I6Y29uc29sZS1zYSJ9.svzOCJwKLKSTIagB3MrUrMyQANR0L36BwUR-9cTvvFv52inEIMPf4I84wU6CO4oTn-2cCnWwiIASglZLT71R1lRjgc_ANMy2l4XlZBM9xMMJjdhKk9-v8ArNYzHBJYNtGKGvL-SbiIiedIzex7kRd6G3eoft20e4U5fl2kWov2HkKhiZCp7g-_9CEi3BZLvgRCrcQPeASMjvh6v2iQYZtfM44kS--SsfRQzD2hV_q3qKlP-jbxoxYXJAKgFC5Q5bqckYlJVXlE6sPfHT9vtqi-BXnWc4POyyKyRM2amq2IbFYtuo3xysVbGRr71GtfBSvCRgQNQyK7cUDPfVRDmowg Forwarding from 0.0.0.0:9090 -> 9090 通过主机的浏览器访问任一虚拟机(如:node1)的IP(192.168.66.11)+端口(9090),如下: |
创建MinIO租户
1)创建命名空间
[root@node1 ~]# kubectl create namespace hujy-ns1 // 一个租户可有多个命名空间:如"hujy-ns1"、"hujy-ns2" |
2)创建租户(如"hujianyuan"),
例子:租户名为'hujianyuan',命名空间使用前面已创建的'hujy-ns1',MinIO节点数3个,每节点含4个drivers,每driver容量为1Gi。共计:volumes'12',capacity'12Gi'。
[root@node1 ~]# kubectl minio tenant create hujianyuan \ --servers 3 \ --volumes 12 \ --capacity 12Gi \ --storage-class direct-csi-min-io \ --namespace hujy-ns1 \ --image minio/minio:RELEASE.2022-07-08T00-05-23Z 注意:默认的image为"minio/minio:RELEASE.2022-06-20T23-13-45Z" |
3)检查租户命名空间"hujy-ns1"的资源创建情况
[root@node1 ~]# kubectl get all -n hujy-ns1 // 如果以上3个MinIO Pods都已处于Running状态,表示租户服务已准备就绪! |
4)亲和性调度MinIO Pods
填坑!MinIO Pods与nodes的调度方式,系统默认采用"Pod Anti-Affinity"(“反亲和性”,即每个pool中的每个pod只能运行在不同node上)来保证其高可用性,但不适合于资源紧缺的实验环境。为了在本实验的3个Worker nodes上运行4个Minio Pods,需通过UI控制台创建租户时将"Pod Placement"中的Type属性修改为"None",如下图所示:
结果如下图所示:可以看到node4上运行了2个MinIO Pods,总共4个Pods都已处于'Running'状态。