天天看点

4.分布式存储(kubernetes+MinIO集群)

​目 录

​​1 前言 1​​​

​​2 实验环境 1​​​

​​2.1 MinIO系统架构 1​​​

​​2.2 MinIO集群规划 2​​​

​​2.3 网络拓扑 3​​​

​​3 硬件准备 3​​​

​​3.1 调整虚拟机资源 3​​​

​​3.2 使能磁盘scsi_id 3​​​

​​4 软件准备 4​​​

​​4.1 K8S 版本1.19.0+ 4​​​

​​4.2 安装K8S krew 4​​​

​​4.3 K8S TLS 证书API 6​​​

​​4.4 DirectPV 6​​​

​​4.4.1 简介 6​​​

​​4.4.2 安装步骤 7​​​

​​5 安装MinIO Operator 10​​​

​​6 使用MinIO Operator 控制台 11​​​

​​7 创建MinIO租户 12​​​

​​8 UI控制台的输出结果 14​​​

分布式存储-第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多租户体系结构。​

4.分布式存储(kubernetes+MinIO集群)

MinIO集群规划​

规划方法参考官网链接:​​https://min.io/product/erasure-code-calculator​​。​

注意:下面的Servers并不对应K8S的nodes,而是对应K8S的pods,因此即使Servers要求4个以上,但不代表K8S的Worker node 也需要4个以上,因此本期我们可以直接利用前面第2期K8S初装好的实验环境即可。​

4.分布式存储(kubernetes+MinIO集群)

网络拓扑​

网络设计详细情况请参考第1期第2章节的内容,实验拓扑如下面左图所示:​

4.分布式存储(kubernetes+MinIO集群)
4.分布式存储(kubernetes+MinIO集群)

硬件准备​

调整虚拟机资源​

现在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​
4.分布式存储(kubernetes+MinIO集群)
// 从以上结果看到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​

4.分布式存储(kubernetes+MinIO集群)

2、解压​

[root@node1 ~]# tar zxvf krew-linux_amd64.tar.gz​

[root@node1 ~]# ls​

4.分布式存储(kubernetes+MinIO集群)

3、安装​

[root@node1 ~]# ./krew-linux_amd64 install krew​

4.分布式存储(kubernetes+MinIO集群)

3)配置环境变量​

1、根据上面(1)的提示,在~/.bashrc的最后一行添加下面配置变量:​

export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"​

[root@node1 ~]# vim ~/.bashrc​

4.分布式存储(kubernetes+MinIO集群)
2、然后重启shell,或者重新登录​

4)验证结果​

1、按前面的提示(2)执行下面命令,如果输出正常,表示安装成功​

[root@node1 ~]# kubectl krew​

[root@node1 ~]# kubectl krew search | grep directpv​

4.分布式存储(kubernetes+MinIO集群)
// 请留意:从以上看出krew包含了很多插件部署的yaml文件,后面会用到的。​

K8S TLS 证书API​

需确认kube-controller-manager的设置参数是否包含了TLS相关的证书和密钥。​

1)查找本环境中kube-controller-manager的pod名称​

[root@node1 ~]# kubectl get pod -n kube-system​
4.分布式存储(kubernetes+MinIO集群)

2)查看kube-controller-manager的详细配置​

[root@node1 ~]# kubectl get pod kube-controller-manager-node1 -n kube-system -o yaml​
4.分布式存储(kubernetes+MinIO集群)
// 确认配置中包含了以上红框内的两行内容。​

DirectPV​

简介​

分布式数据存储(如对象存储、数据库和消息队列)是为直连存储而设计的,它们自行处理高可用性和数据持久性。传统的SAN或基于NAS的CSI驱动程序(Network PV)上运行它们会在数据路径中添加另一层复制/擦除编码和额外的网络跳数,这种额外的分解层会导致复杂性增加和性能降低(如下图所示),而且Kubernetes hostPath和本地PV是静态配置的,功能也有限,这里使用DirectPV就是为了解决这一限制。​

DirectPV是用于直连存储的CSI驱动程序,它是一个分布式持久卷管理器,在跨服务器发现、格式化、装载、调度和监视驱动器非常有用。​

4.分布式存储(kubernetes+MinIO集群)

系统架构​

DirectPV设计为轻量级,可扩展到10~1000个驱动器。它由三个组件组成:控制器、节点驱动程序、用户界面。​

4.分布式存储(kubernetes+MinIO集群)

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”的下载链接。​

4.分布式存储(kubernetes+MinIO集群)

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.分布式存储(kubernetes+MinIO集群)

4、检查安装是否成功​

[root@node1 ~]# kubectl directpv​

4.分布式存储(kubernetes+MinIO集群)

5、卸载(备用,最好也不要用到!)​

[root@node1 ~]#kubectl krew uninstall directpv​

2)将directpv部署到K8S集群中​

[root@node1 ~]# kubectl directpv install​
4.分布式存储(kubernetes+MinIO集群)

3)确认directpv已经成功运行​

[root@node1 ~]# kubectl directpv info​
  • 结果1:如下(ERROR),原因是相关pod还未开始创建,请稍等!​
4.分布式存储(kubernetes+MinIO集群)
  • 结果2:如下(各节点亮红,也没容量数据),表示还在创建过程中,请稍等或检查​
    4.分布式存储(kubernetes+MinIO集群)
  • 结果3:如下(各节点亮绿,有容量数据),表示已部署和创建成功​
4.分布式存储(kubernetes+MinIO集群)

4)查看集群中可用的drives​

[root@node1 ~]# kubectl directpv drives ls​
4.分布式存储(kubernetes+MinIO集群)

注意1:容量为1TiB的Drive行,FILESYSTEM列中显示“-”的行,表示还没有格式化。

注意2:必须完成章节3.2的步骤,否则以上结果就大不一样了!​

5)选择用于directpv管理的驱动器,并格式化​

[root@node1 ~]# kubectl directpv drives format --drives /dev/sd{b...e} --nodes node{2...4}​

查看结果如下:​

4.分布式存储(kubernetes+MinIO集群)

6)查看其它安装状态​

[root@node1 ~]# kubectl get pod -o wide -n direct-csi-min-io​
4.分布式存储(kubernetes+MinIO集群)
[root@node1 ~]# kubectl get deployment -o wide -n direct-csi-min-io​
4.分布式存储(kubernetes+MinIO集群)
[root@node1 ~]# kubectl get svc -o wide -n direct-csi-min-io​
4.分布式存储(kubernetes+MinIO集群)

安装MinIO Operator​

1)使用Krew安装 MinIO Operator and Plugin:​

[root@node1 ~]# kubectl krew install minio​
4.分布式存储(kubernetes+MinIO集群)

// 填坑!如果上面安装失败,则通过下面方法手动完成下载、解压和安装​

1、下载到本地​

4.分布式存储(kubernetes+MinIO集群)

2、复制krew中minio.yaml到本地​

[root@node1 ~]# cp ~/.krew/index/default/plugins/minio.yaml ./​

4.分布式存储(kubernetes+MinIO集群)

3、krew本地安装​

[root@node1 ~]# kubectl krew install --manifest=minio.yaml --archive=kubectl-minio_linux_amd64.zip​

4.分布式存储(kubernetes+MinIO集群)

2)查看minio的安装版本:​

[root@node1 ~]# kubectl minio version​

v4.4.25​

3)初始化 MinIO Operator​

[root@node1 ~]# kubectl minio init​
4.分布式存储(kubernetes+MinIO集群)
// 以上看出,默认创建的命名空间为"minio-operator"​

4)检查MinIO Operator的运行状态​

[root@node1 ~]# kubectl get all --namespace minio-operator​
4.分布式存储(kubernetes+MinIO集群)
// 以上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),如下:​

4.分布式存储(kubernetes+MinIO集群)

创建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"​

4.分布式存储(kubernetes+MinIO集群)

3)检查租户命名空间"hujy-ns1"的资源创建情况​

[root@node1 ~]# kubectl get all -n hujy-ns1​
4.分布式存储(kubernetes+MinIO集群)
// 如果以上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",如下图所示:​

4.分布式存储(kubernetes+MinIO集群)

结果如下图所示:可以看到node4上运行了2个MinIO Pods,总共4个Pods都已处于'Running'状态。​

4.分布式存储(kubernetes+MinIO集群)

UI控制台的输出结果​

4.分布式存储(kubernetes+MinIO集群)
4.分布式存储(kubernetes+MinIO集群)
4.分布式存储(kubernetes+MinIO集群)
4.分布式存储(kubernetes+MinIO集群)
4.分布式存储(kubernetes+MinIO集群)

继续阅读