目 录

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


MinIO集群规划​

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

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

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


网络拓扑​

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

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

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


硬件准备​

调整虚拟机资源​

现在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集群)_MinIO_05

// 从以上结果看到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集群)_MinIO_06

2、解压

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

[root@node1 ~]# ls

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

3、安装

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

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

3)配置环境变量

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

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

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

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

2、然后重启shell,或者重新登录

4)验证结果

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

[root@node1 ~]# kubectl krew

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

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

// 请留意:从以上看出krew包含了很多插件部署的yaml文件,后面会用到的。

K8S TLS 证书API​

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

1)查找本环境中kube-controller-managerpod名称

[root@node1 ~]# kubectl get pod -n kube-system

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

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

[root@node1 ~]# kubectl get pod kube-controller-manager-node1 -n kube-system -o yaml

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

// 确认配置中包含了以上红框内的两行内容。

DirectPV​

简介​

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

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

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


系统架构

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

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


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集群)_分布式存储_15

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集群)_MinIO_16

4、检查安装是否成功

[root@node1 ~]# kubectl directpv

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

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

[root@node1 ~]#kubectl krew uninstall directpv

2)将directpv部署到K8S集群中

[root@node1 ~]# kubectl directpv install

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

3)确认directpv已经成功运行

[root@node1 ~]# kubectl directpv info

  • 结果1:如下(ERROR),原因是相关pod还未开始创建,请稍等!

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

  • 结果2:如下(各节点亮红,也没容量数据),表示还在创建过程中,请稍等或检查

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

  • 结果3:如下(各节点亮绿,有容量数据),表示已部署和创建成功

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

4)查看集群中可用的drives

[root@node1 ~]# kubectl directpv drives ls

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

注意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集群)_MinIO_23

6)查看其它安装状态

[root@node1 ~]# kubectl get pod -o wide -n direct-csi-min-io

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

[root@node1 ~]# kubectl get deployment -o wide -n direct-csi-min-io

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

[root@node1 ~]# kubectl get svc -o wide -n direct-csi-min-io

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

安装MinIO Operator​

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

[root@node1 ~]# kubectl krew install minio

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

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

1、下载到本地

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

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

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

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

3、krew本地安装

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

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

2)查看minio的安装版本:

[root@node1 ~]# kubectl minio version

v4.4.25

3)初始化 MinIO Operator

[root@node1 ~]# kubectl minio init

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

// 以上看出,默认创建的命名空间为"minio-operator"

4)检查MinIO Operator的运行状态

[root@node1 ~]# kubectl get all --namespace minio-operator

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

// 以上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集群)_kubernetes_33

创建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集群)_分布式存储_34

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

[root@node1 ~]# kubectl get all -n hujy-ns1

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

// 如果以上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集群)_分布式存储_36


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

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


UI控制台的输出结果​

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


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


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



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


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