linux部署minio对象存储、docker部署minio象存储、k8s部署minio象存储

前言

官网:https://min.io/https://minio.org.cn/
minio有两个端口,一个 minio servers的端口,也就是api端口,默认9000,一个是minio console端口,即控制台端口,控制台端口可以自定义,控制台端口用于外部浏览器访问,不同版本minio的默认控制台端口可能不同,如有的是9001,有的是9090,浏览器使用9000端口访问,默认会跳转到控制台端口。

minio部署3种拓扑结构

minio支持三种部署拓扑:
1、Single-Node Single-Drive (SNSD or "Standalone")--单节点单驱动器(SNSD或"Standalone")
具有单个存储卷或文件夹的单个minio服务器,SNSD部署提供故障转移保护,驱动器级别的可靠性和故障转移取决于底层存储卷。
SNSD部署最适合用于使用minio进行对象存储的应用程序的评估和初始开发。
SNSD部署实现了零奇偶校验编码后端,并包括与纠删码相关的功能的实现:版本控制、对象锁定/保留。
2、Single-Node Multi-Drive (SNMD or "Standalone Multi-Drive")--单节点多驱动器(SNMD或"Standalone Multi-Drive")
具有四个或更多存储卷的单个minio服务器。 SNMD部署仅提供驱动器级别的可靠性和故障转移。
3、多节点多驱动器(MNMD或"Distributed分布式")
所有服务器上至少有4个驱动器的多个minio服务器,分布式MNMD拓扑支持具有驱动器和节点级别可用性和弹性的生产级对象存储,适合企业生产环境使用。

linux部署minio对象存储

建议使用单独的分区作为minio的数据存储目录,不能使用根分区的目录作为minio的数据存储目录。
下面将介绍在linux中单节点单磁盘、单节点多磁盘、多节点多磁盘3种方式部署minio。在实际企业生产环境中建议使用多节点多磁盘方式部署高可用minio。
注意:minio的数据目录不能是nfs文件系统,而且建议文件系统格式为xfs。

linux 单节点安装minio-单节点单磁盘

官网文档:https://min.io/docs/minio/linux/operations/install-deploy-manage/deploy-minio-single-node-single-drive.html

1、使用systemd管理minio-官方建议
#不要使用根分区的目录作为minio的数据存储目录,单独创建分区并挂载目录,官方建议使用xfs文件系统类型
pvcreate /dev/sdb
vgcreate vgdata /dev/sdb
lvcreate -n lvdata -l +100%FREE  vgdata
mkfs.xfs /dev/vgdata/lvdata
mkdir /minio-data
echo '/dev/vgdata/lvdata /minio-data    xfs     defaults,noatime  0       2' >> /etc/fstab
mount -a
wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio-20231007150738.0.0.x86_64.rpm -O minio.rpm
sudo yum install minio.rpm
systemctl  daemon-reload
cat /usr/lib/systemd/system/minio.service
groupadd -r minio-user
useradd -M -r -g minio-user minio-user
chown minio-user:minio-user /minio-data
cat >>/etc/default/minio<<'EOF'
# minio_ROOT_USER and minio_ROOT_PASSWORD sets the root account for the minio server.
# This user has unrestricted permissions to perform S3 and administrative API operations on any resource in the deployment.
# Omit to use the default values 'minioadmin:minioadmin'.
# minio recommends setting non-default values as a best practice, regardless of environment
#配置minio的账号密码
minio_ROOT_USER=minioadmin
minio_ROOT_PASSWORD=minioadmin

# minio_VOLUMES sets the storage volume or path to use for the minio server.
#配置的是minio的数据目录
minio_VOLUMES="/minio-data"

# minio_SERVER_URL sets the hostname of the local machine for use with the minio Server
# minio assumes your network control plane can correctly resolve this hostname to the local machine

# Uncomment the following line and replace the value with the correct hostname for the local machine and port for the minio server (9000 by default).

#minio_SERVER_URL="http://minio.example.net:9000"
#自己添加下面这行,默认没有,这行的意思是固定控制台端口为9001
minio_OPTS="--console-address :9001"
EOF
systemctl start minio.service
systemctl status minio.service	
systemctl enable minio.service
journalctl -f -u minio.service
#在日志中可以看到登录url,使用服务器IP+控制台端口访问:http://192.168.xx.xx:9001/  minioadmin/minioadmin
2、下面是使用二进制启动的minio,与上面rpm包安装方式是等价的
firewall-cmd --permanent --zone=public --add-port=9000/tcp
firewall-cmd --reload
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio && mv minio /usr/local/bin/
mkdir /minio-data
#可以使用环境变量设置minio的初始账号密码,注意要加export,不加不生效
export minio_ROOT_USER=admin
export minio_ROOT_PASSWORD=admin123456
#后台启动minio,--console-address指定控制台端口,即页面访问端口
nohup minio server /minio-data --console-address :9090 &
#工具日志可以看到控制台端口是http://192.168.xx.1:9090
tail -222f nohup.out 	
#打开谷歌流量登录即可
console: http://192.168.xx.1:9090  账号密码就是环境变量设置的:admin/admin123456
亦可以使用9000端口访问,默认会跳转到控制台9090端口。
如果没有设置环境变量,则日志会显示默认的登录账号密码是:minioadmin:minioadmin
如果忘记minio登录账号密码,可重新设置环境变量,重新启动minio即可。
#可以使用环境变量设置minio的初始账号密码,注意要加export,不加不生效
export minio_ROOT_USER=admin
export minio_ROOT_PASSWORD=admin123456

minio客户端工具mc

wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
sudo mv mc /usr/local/bin/mc
mc alias set local http://127.0.0.1:9000 admin admin123456
mc admin info local

linux 生产环境-单节点多磁盘部署minio

官网文档:https://min.io/docs/minio/linux/operations/install-deploy-manage/deploy-minio-single-node-multi-drive.html

#准备1台服务,创建4块盘,分区挂载目录,目录要求有顺序,如/minio-data1、/minio-data2、/minio-data3、/minio-data4
#如果没有4个盘,4个目录也可以,但是要求不能是根分区下的目录,所以说至少挂载一个盘
#按照上面的《linux 单节点安装minio-单节点单磁盘》配置即可
#注意修改/etc/default/minio文件的下面这个参数
minio_VOLUMES="/data-{1...4}"
#启动minio即可

linux 生产环境-多节点多磁盘部署minio集群(分布式集群)

官方文档:https://min.io/docs/minio/linux/operations/install-deploy-manage/deploy-minio-multi-node-multi-drive.html#deploy-minio-distributed

官方说明:
所有minio服务器必须使用相同的监听端口。如果您设置了一个静态minio console端口(例如:9001),您还必须授予对该端口的访问权限,以确保来自外部客户端的连接。minio强烈建议使用负载平衡器来管理到集群的连接。负载均衡器应该使用“最少连接”算法将请求路由到minio部署,因为部署中的任何minio节点都可以接收、路由或处理客户机请求。这两种负载平衡器可以很好地与minio一起工作:NGINX HAProxy。配置防火墙或负载平衡器来支持minio不在本过程的范围内。配置NGINX代理minio服务器参考提供了一个基线配置使用NGINX作为一个反向代理基本负载均衡配置。
minio要求使用扩展符号{
    
    x…y}表示在创建服务器池时minio主机的顺序系列。minio支持使用一系列主机名或IP地址来表示部署中的每个minio服务器进程。此过程假设使用顺序主机名,因为管理开销较低,特别是在较大的分布式集群中。在开始此过程之前,创建必要的DNS主机名映射。例如,以下主机名将支持4节点分布式部署:
minio-01.example.com
minio-02.example.com
minio-03.example.com
minio-04.example.com
您可以使用扩展符号minio-0{
    
    1…4}.example.com指定整个主机名范围。
minio不支持分布式部署的非顺序主机名或IP地址。您可以在每个节点上使用/etc/hosts来设置一个支持扩展表示法的简单DNS方案。例如:vim/etc/hosts
198.0.2.10    minio-01.example.net
198.51.100.3  minio-02.example.net
198.0.2.43    minio-03.example.net
198.51.100.12 minio-04.example.net

minio强烈建议使用xfs格式化磁盘的直接连接JBOD阵列,以获得最佳性能。
与网络存储(NAS、SAN、NFS)相比,直接连接存储(DAS)具有显著的性能和一致性优势。
使用非xfs文件系统(ext4、btrfs、zfs)的部署往往性能较低,同时表现出意外或不希望出现的行为。
当与分布式minio部署一起使用时,RAID或类似技术不会提供额外的弹性或可用性优势,而且通常会降低系统性能。
确保部署中所有节点使用相同类型(NVMe、SSD或HDD)且容量相同(如N TB)的硬盘。minio不区分驱动器类型,也不能从混合存储类型中获益。此外,minio将每个驱动器使用的大小限制为部署中最小的驱动器。例如,如果部署有15个10TB的驱动器和1个1TB的驱动器,minio将每个驱动器的容量限制为1TB。

minio要求使用扩展符号{
    
    x…Y}表示一系列连续的驱动器,其中部署中的所有节点具有相同的挂载驱动器集。minio还要求物理驱动器的顺序在重新启动时保持不变,以便给定的挂载点始终指向相同的格式化驱动器。因此,minio强烈建议使用/etc/fstab或类似的基于文件的挂载配置,以确保在重新启动后不会更改驱动器顺序。例如:
$ mkfs.xfs /dev/sdb -L DISK1
$ mkfs.xfs /dev/sdc -L DISK2
$ mkfs.xfs /dev/sdd -L DISK3
$ mkfs.xfs /dev/sde -L DISK4

vim /etc/fstab
  # <file system>  <mount point>  <type>  <options>         <dump>  <pass>
  LABEL=DISK1      /mnt/disk1     xfs     defaults,noatime  0       2
  LABEL=DISK2      /mnt/disk2     xfs     defaults,noatime  0       2
  LABEL=DISK3      /mnt/disk3     xfs     defaults,noatime  0       2
  LABEL=DISK4      /mnt/disk4     xfs     defaults,noatime  0       2
网络文件系统卷破坏一致性保证minio严格的写后读和写后列表一致性模型需要本地驱动器文件系统。如果底层存储卷是NFS或类似的网络附加存储卷,minio无法提供一致性保证。对于需要使用网络附加存储的部署,请使用NFSv4以获得最佳效果。
时间同步
minio强烈建议为部署中的所有节点选择基本相似的硬件配置。确保硬件(CPU、内存、主板、存储适配器)和软件(操作系统、内核设置、系统服务)在所有节点之间保持一致。如果节点具有异构的硬件或软件配置,则部署可能表现出不可预测的性能。受益于在低成本硬件上存储旧数据的工作负载应该部署专用的"热""冷"minio部署,并将数据转移到该层。
minio擦除编码是一种数据冗余和可用性特性,它允许minio部署在集群中丢失多个驱动器或节点的情况下动态地自动重建对象。Erasure Coding提供对象级修复,开销比相邻的技术(如RAID或复制)少。分布式部署隐式地启用并依赖于擦除编码来实现核心功能。Erasure Coding将对象分成数据块和奇偶校验块,其中奇偶校验块支持丢失或损坏的数据块的重建。部署中的奇偶校验块数量控制着部署的相对数据冗余。更高级别的奇偶校验允许以总可用存储为代价的更高的驱动器丢失容忍度。minio默认为EC:4,或者每个擦除集4个校验块。您可以通过设置适当的minio Storage Class环境变量来设置自定义奇偶校验级别。考虑使用minio Erasure Code Calculator为您的集群选择适当的Erasure Code奇偶校验级别提供指导。
在分布式环境中启动新的minio服务器时,存储设备不能有现有的数据。启动minio服务器后,与数据的所有交互都必须通过S3 API完成。使用minio客户端、minio控制台或minio软件开发工具包之一来处理存储桶和对象。

开始部署分布式minio集群:

#注意目录千万不能是根分区的目录,否则minio启动会报错,最是单独挂载磁盘
#准备1台lb负载均衡服务器和4台minio服务器,minio服务器都挂载4个磁盘,磁盘大小一致,性能一致
#下面操作均在4台minio服务器上操作,lb负载均衡服务器暂时不用配置
#全部服务器配置放行防火墙,防火墙关闭可忽略
firewall-cmd --permanent --zone=public --add-port=9000/tcp
firewall-cmd --reload
#minio服务器配置主机名并写入/etc/hosts文件
#注意定义的主机名应该要有顺序的
hostnamectl set-hostname minio-01
hostnamectl set-hostname minio-02
hostnamectl set-hostname minio-03
hostnamectl set-hostname minio-04
#本地域名解析
cat >>/etc/hosts<<'EOF'
192.168.xx.150  minio-01
192.168.xx.151  minio-02
192.168.xx.152  minio-03
192.168.xx.153  minio-04
192.168.xx.1    minio-lb
EOF
#minio服务器给4块磁盘分区并挂载,使用lsblk|blkid|df命令检查是否正确
vgcreate vgdata1 /dev/sdb
lvcreate -n lvdata1 -l +100%FREE  vgdata1
mkfs.xfs  /dev/vgdata1/lvdata1 -L DISK1 
vgcreate vgdata2 /dev/sdc
lvcreate -n lvdata2 -l +100%FREE  vgdata2
mkfs.xfs  /dev/vgdata2/lvdata2 -L DISK2
vgcreate vgdata3 /dev/sdd
lvcreate -n lvdata3 -l +100%FREE  vgdata3
mkfs.xfs  /dev/vgdata3/lvdata3 -L DISK3
vgcreate vgdata4 /dev/sde
lvcreate -n lvdata4 -l +100%FREE  vgdata4
mkfs.xfs  /dev/vgdata4/lvdata4 -L DISK4
#创建minio的数据目录,目录名字要有顺序
mkdir /minio-data-01  /minio-data-02  /minio-data-03  /minio-data-04
cat >> /etc/fstab <<'EOF'
LABEL=DISK1     /minio-data-01    xfs     defaults,noatime  0       2
LABEL=DISK2     /minio-data-02    xfs     defaults,noatime  0       2
LABEL=DISK3     /minio-data-03    xfs     defaults,noatime  0       2
LABEL=DISK4     /minio-data-04    xfs     defaults,noatime  0       2
EOF
mount -a
df -TH
#时间同步,必须,全部服务器必须保持时间一致
yum install ntp -y && systemctl start ntpd && systemctl enable ntpd;

#在minio服务器上使用rpm包安装minio,官网建议使用rpm包方式安装
wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio-20231007150738.0.0.x86_64.rpm -O minio.rpm
sudo yum -y install minio.rpm
#使用rpm安装会默认使用systemd管理minio,进程由minio-user用户启动,默认该用户没有创建,需要创建
cat /usr/lib/systemd/system/minio.service
#创建minio-user
groupadd -r minio-user
useradd -M -r -g minio-user minio-user
chown minio-user:minio-user /minio-data-01 /minio-data-02 /minio-data-03 /minio-data-04
#创建配置文件,minio.service文件中指定了要加载该配置文件
cat >/etc/default/minio <<'EOF'
# Set the hosts and volumes minio uses at startup
# The command uses minio expansion notation {x...y} to denote a
# sequential series.
#
# The following example covers four minio hosts
# with 4 drives each at the specified hostname and drive locations.
# The command includes the port that each minio server listens on
# (default 9000)
#配置主机名和数据目录,端口默认9000,协议改为http,默认的https需要证书
minio_VOLUMES="http://minio-0{1...4}:9000/minio-data-0{1...4}"

# Set all minio server options
#
# The following explicitly sets the minio console listen address to
# port 9001 on all network interfaces. The default behavior is dynamic
# port selection.
#控制台的端口,默认9001
minio_OPTS="--console-address :9001"

# Set the root username. This user has unrestricted permissions to
# perform S3 and administrative API operations on any resource in the
# deployment.
#
# Defer to your organizations requirements for superadmin user name.
#登录用户
minio_ROOT_USER=minioadmin

# Set the root password
#
# Use a long, random, unique string that meets your organizations
# requirements for passwords.
#登录密码
#minio_ROOT_PASSWORD=minio-secret-key-CHANGE-ME
minio_ROOT_PASSWORD=minioadmin

# Set to the URL of the load balancer for the minio deployment
# This value *must* match across all minio servers. If you do
# not have a load balancer, set this value to to any *one* of the
# minio hosts in the deployment as a temporary measure.
#设置lb负载均衡服务器的IP端口,如果没有负载均衡服务器,临时写一个minio服务器IP亦可,协议改为http,默认的https需要证书
#配置的是minio servers的端口,所以是9000端口
minio_SERVER_URL="http://minio-lb:9000"
EOF
#证书问题,如果需要为minio配置https证书,参考以下网址,这里不配置证书,使用http访问即可
https://min.io/docs/minio/linux/operations/network-encryption.html
#启动minio,4台minio服务器同时启动
systemctl start minio.service
#检查
sudo systemctl status minio.service
journalctl -f -u minio.service
netstat  -lntup | grep -E '9000|90001'
#设置开机自启
sudo systemctl enable minio.service

#配置lb负载均衡服务器,这里使用nginx做代理
#参考https://min.io/docs/minio/linux/integrations/setup-nginx-proxy-with-minio.html#integrations-nginx-proxy
yum install nginx-1.20.1-10.el7.x86_64 -y
cd /etc/nginx/
cp nginx.conf nginx.conf.bak
#参照官网提供的nginx配置文件,注意使用Subdomain下的示例配置,因为Subdomain章节下的才是http的,前面安装的minio都是配置http协议访问的
[root@nginx nginx]# grep -Ev '^$|#' nginx.conf
worker_processes  1;
events {
    
    
    worker_connections  1024;
}
http {
    
    
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
upstream minio_s3 {
    
    		#配置各个minio server的api监听地址9000端口
   least_conn;
   server 192.168.xx.150:9000;
   server 192.168.xx.151:9000;
   server 192.168.xx.152:9000;
   server 192.168.xx.153:9000;
}
upstream minio_console {
    
    	#配置各个minio的IP地址和控制台端口9001
   least_conn;
   server 192.168.xx.150:9001;
   server 192.168.xx.151:9001;
   server 192.168.xx.152:9001;
   server 192.168.xx.153:9001;
}
server {
    
    
   listen       9000;		#minio server 的aip端口
   listen  [::]:9000;
   server_name  minio_s3;
   ignore_invalid_headers off;
   client_max_body_size 0;
   proxy_buffering off;
   proxy_request_buffering off;
   location / {
    
    
      proxy_set_header Host $http_host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_connect_timeout 300;
      proxy_http_version 1.1;
      proxy_set_header Connection "";
      chunked_transfer_encoding off;
   }
}
server {
    
    
   listen       9001;		#minio的控制台端口
   listen  [::]:9001;
   server_name  minio_console;
   ignore_invalid_headers off;
   client_max_body_size 0;
   proxy_buffering off;
   proxy_request_buffering off;
   location / {
    
    
      proxy_set_header Host $http_host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header X-NginX-Proxy true;
      real_ip_header X-Real-IP;
      proxy_connect_timeout 300;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
      chunked_transfer_encoding off;
   }
}
}
nginx -t
systemctl start nginx

#浏览器访问,注意使用http
#正常登录之后在任意一个节点上创建桶上传文件,其他节点也能看到对应的桶和文件,说明minio集群之前同步正常
http://192.168.xx.150:9001/	minioadmin/minioadmin
http://192.168.xx.152:9001/	minioadmin/minioadmin
http://192.168.xx.153:9001/	minioadmin/minioadmin
http://192.168.xx.154:9001/	minioadmin/minioadmin
http://192.168.xx.1:9001/ 		minioadmin/minioadmin	#lb登录正常

#部署问题记录
#部署完成之后第一次登录发现使用minioadmin/minioadmin无法登录,显示账号密码与其存储记录不一致
#一度怀疑/etc/default/minio文件设置的变量minio_ROOT_PASSWORD值长度不够或变量值没生效,所以设置minio_ROOT_PASSWORD=minioADMIN@123456,停止再启动全部节点的minio服务,仍然还是报错无法登录。
#该问题一度无法解决。最后尝试使用官网的默认的密码即minio_ROOT_PASSWORD=minio-secret-key-CHANGE-ME
#停止在启动全部节点的minio服务,居然可以正常登录了,最后设置minio_ROOT_PASSWORD=minioADMIN@123456,居然也可以正常登录,此问题情况
#不知由何种原因造成的,很有可能是服务器环境造成的。
#销毁整个minio集群,重新部署一次,不再出现账号登录不上的问题,任意修改密码均能造成登录。
#只有配置好lb服务器之后才能登录,其他minio节点才能登录,不然会报错无法链接lb的端口,因为/etc/default/minio文件定义了lb的url,即minio_SERVER_URL="http://minio-lb:9000"
#lb的配置要mnio配置的协议一致,如minio的协议是http,所以nginx配置也要是http,即使用官方提供的Subdomain下的示例文件,因为该Subdomain章节下的才是http的

docker部署minio对象存储

使用docker部署minio可以有效的避免服务器环境带来的各种异常问题。
官方文档对容器化minio只提供了SNSD和SNMD的说明,用于仅在单个主机上支持minio的本地开发和评估。对于MNMD部署,使用minio kubernetes operator在容器化和编排的环境中部署和管理minio租户。如果使用非容器化部署,linux部署MNMD,官方也提供了部署说明文档。

docker部署单节点单磁盘的minio

官方文档:https://min.io/docs/minio/container/operations/install-deploy-manage/deploy-minio-single-node-single-drive.html

#拉取镜像
docker pull quay.io/minio/minio
#创建一个环境变量文件
cat >/etc/default/minio<<'EOF'
# minio_ROOT_USER and minio_ROOT_PASSWORD sets the root account for the minio server.
# This user has unrestricted permissions to perform S3 and administrative API operations on any resource in the deployment.
# Omit to use the default values 'minioadmin:minioadmin'.
# minio recommends setting non-default values as a best practice, regardless of environment
#minio的登录账号密码
minio_ROOT_USER=minioadmin
minio_ROOT_PASSWORD=minioadmin@123456

# minio_VOLUMES sets the storage volume or path to use for the minio server.
#容器里面minio的存储目录
minio_VOLUMES="/mnt/data"

# minio_SERVER_URL sets the hostname of the local machine for use with the minio Server
# minio assumes your network control plane can correctly resolve this hostname to the local machine

# Uncomment the following line and replace the value with the correct hostname for the local machine and port for the minio server (9000 by default).

#minio_SERVER_URL="http://minio.example.net:9000"
EOF

#启动容器
#第一个-v是将本地路径挂载到容器minio的数据存储/data目录
#第二个-v是将/etc/default/minio文件挂载到容器minio的/etc/config.env文件
#-e变量不用改,保持默认即可,这是容器内minio启动加载的环境变量文件
#/etc/default/minio文件没有指定控制台端口,所以启动命令指定了--console-address
#容器启动命令server后面不用接数据目录,默认从/etc/config.env配置文件读取
docker run -dt                                  \
  -p 9000:9000 -p 9090:9090                     \
  -v /data/minio-data-storage:/mnt/data          \
  -v /etc/default/minio:/etc/config.env         \
  -e "minio_CONFIG_ENV_FILE=/etc/config.env"    \
  --name "minio_local"                          \
  quay.io/minio/minio server --console-address ":9090"
#检查日志
docker  logs 5633fc0
#页面登录正常,创建一个test桶并上传数据正常
http://192.168.xx.1:9090 minioadmin/minioadmin@123456
#对比
[root@master1 data]# docker  exec -it 5633fc0 ls /mnt/data
test
[root@master1 data]# docker  exec -it 5633fc0 ls /mnt/data/test
cephcsi.tar  rook-ceph.tzr.gz
#docker inspect 镜像查看Volumes是/data目录
[root@master1 data]# docker  exec -it 5633fc0 ls /data
[root@master1 data]# 
#以上对比说明,容器里minio的数据存储目录是从/etc/default/minio文件的minio_VOLUMES参数读取的而不是从命令行读取的,跟docker inspect 镜像查看Volumes是/data目录没有关系
#格外之言,官网也提供下面这样的启动ml,不用创建/etc/default/minio文件,直接将参数写在命令行启动
mkdir -p ~/minio/data
docker run -dt \
   -p 9000:9000 \
   -p 9090:9090 \
   --name minio \
   -v ~/minio/data:/data \
   -e "minio_ROOT_USER=minioadmin" \
   -e "minio_ROOT_PASSWORD=minioadmin@123456" \
   quay.io/minio/minio server /data --console-address ":9090"

docker部署单节点多磁盘的minio

官方文档:https://min.io/docs/minio/container/operations/install-deploy-manage/deploy-minio-single-node-multi-drive.html

#准备4个磁盘,分区并挂载目录,挂载的目录要求有顺序,如minio-data-01、minio-data-02、minio-data-03、minio-data-04。
mkfs.xfs /dev/sdb -L DISK1
mkfs.xfs /dev/sdc -L DISK2
mkfs.xfs /dev/sdd -L DISK3
mkfs.xfs /dev/sde -L DISK4

vim /etc/fstab
  # <file system>  <mount point>  	  <type>  <options>       <dump>  <pass>
  LABEL=DISK1      /minio-data-01     xfs     defaults,noatime  0       2
  LABEL=DISK2      /minio-data-02     xfs     defaults,noatime  0       2
  LABEL=DISK3      /minio-data-03     xfs     defaults,noatime  0       2
  LABEL=DISK4      /minio-data-04     xfs     defaults,noatime  0       2
#因磁盘资源有限,下面将在/data分区下创建4个目录作为minio的数据存储目录
mkdir -p /data/minio-data-01 /data/minio-data-02 /data/minio-data-03 /data/minio-data-04
#下载镜像
docker pull quay.io/minio/minio
#创建环境变量配置文件
cat >/etc/default/minio<<'EOF'
# minio_ROOT_USER and minio_ROOT_PASSWORD sets the root account for the minio server.
# This user has unrestricted permissions to perform S3 and administrative API operations on any resource in the deployment.
# Omit to use the default values 'minioadmin:minioadmin'.
# minio recommends setting non-default values as a best practice, regardless of environment.
#minio的账号密码
minio_ROOT_USER=minioadmin
minio_ROOT_PASSWORD=minioadmin@123456

# minio_VOLUMES sets the storage volumes or paths to use for the minio server.
# The specified path uses minio expansion notation to denote a sequential series of drives between 1 and 4, inclusive.
# All drives or paths included in the expanded drive list must exist *and* be empty or freshly formatted for minio to start successfully.
#minio容器内部数据存储目录,不用改,保持默认即可
minio_VOLUMES="/data-{1...4}"

# minio_SERVER_URL sets the hostname of the local machine for use with the minio Server.
# minio assumes your network control plane can correctly resolve this hostname to the local machine.

# Uncomment the following line and replace the value with the correct hostname for the local machine.

#minio_SERVER_URL="http://minio.example.net"
EOF
#启动docker
#-v表示将数据主机的目录挂载在minio容器里面的数据目录
docker run -dt                                  \
  -p 9000:9000 -p 9090:9090                     \
  -v /data/minio-data-01:/data-1                \
  -v /data/minio-data-02:/data-2                \
  -v /data/minio-data-03:/data-3                \
  -v /data/minio-data-04:/data-4                \
  -v /etc/default/minio:/etc/config.env         \
  -e "minio_CONFIG_ENV_FILE=/etc/config.env"    \
  --name "minio_local"                          \
  quay.io/minio/minio server --console-address ":9090"
#查看日志正常
docker logs -f 839b31948559
#浏览器访问上传文件正常
http://192.168.xx.1:9090    minioadmin/minioadmin@123456

k8s部署minio

minio是kubernetes原生的高性能对象存储,具有兼容s3的API。minio kubernetes运营商支持将minio租户部署到私有云和公共云基础设施("混合"云)上。

k8s 部署minio-单个pod(dev环境)

k8s 部署minio 单个pod合适测试、开发环境,以下是部署步骤:
官方文档:https://min.io/docs/minio/kubernetes/upstream/

#下载yaml
curl https://raw.githubusercontent.com/minio/docs/master/source/extra/examples/minio-dev.yaml
#如果下载不了,直接将yaml复制下来亦可
cat >minio-dev.yaml<<'EOF'
# Deploys a new Namespace for the minio Pod
apiVersion: v1
kind: Namespace
metadata:
  name: minio-dev # Change this value if you want a different namespace name
  labels:
    name: minio-dev # Change this value to match metadata.name
---
# Deploys a new minio Pod into the metadata.namespace kubernetes namespace
#
# The `spec.containers[0].args` contains the command run on the pod
# The `/data` directory corresponds to the `spec.containers[0].volumeMounts[0].mountPath`
# That mount path corresponds to a kubernetes HostPath which binds `/data` to a local drive or volume on the worker node where the pod runs
# 
apiVersion: v1
kind: Pod
metadata:
  labels:
    app: minio
  name: minio
  namespace: minio-dev # Change this value to match the namespace metadata.name
spec:
  containers:
  - name: minio
    image: quay.io/minio/minio:latest
    command:
    - /bin/bash
    - -c
    args: 
    - minio server /data --console-address :9090
    volumeMounts:
    - mountPath: /data
      name: localvolume # Corresponds to the `spec.volumes` Persistent Volume
  nodeSelector:
    minio-storage: "true" # Specify a node label associated to the Worker Node on which you want to deploy the pod.
  volumes:
  - name: localvolume
    hostPath: # minio generally recommends using locally-attached volumes
      path: /mnt/disk1/data # Specify a path to a local drive or volume on the kubernetes worker node
      type: DirectoryOrCreate # The path to the last directory must exist
EOF
kubectl label  node master1 minio-storage=true
kubectl apply  -f minio-dev.yaml
kubectl port-forward pod/minio --address 0.0.0.0 9000:9000 9090:9090 -n minio-dev
#浏览器访问,账号密码从日志中看出是默认的minioadmin/minioadmin
http://192.168.xx.1:9090 minioadmin/minioadmin

#以上,官网只提供了简单的pod启动的minio,如果需要在dev环境中使用以上例子应该用deployment和svc来部署minio.

k8s 生产环境部署minio(官方)

官方文档:https://min.io/docs/minio/kubernetes/upstream/operations/installation.html#minio-operator-installation
官方使用minio operator 自定义资源来在k8s集群中部署、管理minio。
需要一个k8s集群,版本要求如下:
从v4.0.0开始,minio operator和minio kubernetes插件需要kubernetes 1.19.0及更高版本。kubernetes基础设施和kubectl CLI工具必须具有相同的1.19.0+版本。在v4.0.0之前,minio operator和插件需要kubernetes 1.17.0。要使用v4.0.0或更高版本的minio operator或插件,您必须将kubernetes基础设施升级到1.19.0或更高版本。
从v5.0.0开始,minio建议将kubernetes 1.21.0或更高版本用于基础设施和kubectl CLI工具。
operator的目前新版本:5.0.6,所以我们部署minio operator5.0.6,k8s版本安装的1.22.17。

使用minio kubernetes plugin部署minio operator

minio operator安装了一个自定义资源定义(CRD),以支持将minio租户描述为kubernetes对象。
minio kubernetes插件通过kubectl minio命令为在kubernetes集群上部署和管理minio租户提供了原生支持。

#在operator的命名空间中,minio operator使用两个Pod
#一个是用于基本operator功能的部署、管理、修改和维护租户的operator pod
#另一个是用于operator的图形用户界面(GUI),即operator控制台的控制台pod
#要配置minio operator 的证书请参考官网:https://min.io/docs/minio/kubernetes/upstream/operations/installation.html#minio-operator-installation,这里不配置证书,默认不使用证书
#安装minio kubernetes plugin插件
curl https://github.com/minio/operator/releases/download/v5.0.9/kubectl-minio_5.0.9_linux_amd64 -o kubectl-minio
chmod +x kubectl-minio
mv kubectl-minio /usr/local/bin/
kubectl minio version
#安装minio kubernetes operator,默认安装在minio-operator命名空间
kubectl minio init --help
kubectl minio init --console-tls=false --sts=false --image="minio/operator:v5.0.9" --namespace=minio-operator
#查看operator是否安装完成
kubectl get all --namespace minio-operator
#修改console svc类型为nodeport用于暴露外部端口访问,两个端口都要改
kubectl edit svc console -n minio-operator
kubectl get svc console -n minio-operator
#获取JWT,控制台使用JWT进行登录验证
kubectl get secret/console-sa-secret -n minio-operator -o jsonpath="{.data.token}" | base64 --decode
#登录浏览器
http://192.168.xx.151:39090     39090是console的nodeport端口,登录密码就是JWT的值
使用minio operator console部署minio tenant

minio operator console是为部署多节点分布式minio deployments而设计的。前面已经安装了minio operator,下面开始部署minio tenant,所谓tenant,即租户,是表示minio部署的逻辑结构,即租户就是一个minio集群,一个租户只能在一个命名空间,一个命名空间只能有一个租户,可以创建多个minio集群,即多个租户,但是必须是在不同的命名空间,所以一个租户可以具有与其他租户不同的大小和配置,甚至可以具有不同的存储类。

官方文档:
https://min.io/docs/minio/kubernetes/upstream/operations/deploy-manage-tenants.html#minio-installation
https://min.io/docs/minio/kubernetes/upstream/operations/install-deploy-manage/deploy-minio-tenant.html
#参照官方说明文档在console部署即可
kubectl create ns minio-prod
#然后再页面创建租户时选择该命名空间,记住创建是显示Access Key和Secret Key
Access Key:31ZLXBalUllO1BT9
Secret Key:866CRjrhAtu2fTFdccvXjGWQFbhHaol6
#在页面创建租户正常
#然后获取账号密码
#minio-env-configuration和minio-user-1就是报存了用户账号密码
kubectl get secrets  -n minio-prod
#暴露控制台端口
#通过命令行创建的租户,默认的控制台svc是clusterIP类型,但是直接修改类型为NodePort类型会自动还原为clusterIP
#测试在创建租户的使用使用--expose-console-service参数,但是该参数创建的svc是loadBalancer类型
#所以手动创建一个nodeport类型的svc暴露控制台端口
kubectl -n minio-prod  get svc  minio-tenant1-console -oyaml > minio-tenant1-console-nodeport.yaml
vim minio-tenant1-console-nodeport.yaml
kubectl apply -f minio-tenant1-console-nodeport.yaml
#然后浏览器访问minio页面正常
kubectl minio命令行创建tenant租户

既可以在operator控制台部署tenant,也可以直接使用命令kubectl minio tenant create创建tenant。

#在服务器命令行创建租户,使用命令行创建租户正常
kubectl minio tenant create --help
kubectl create ns minio-prod2
kubectl minio tenant create minio-tenant2 --pool minio --servers 4 --volumes 4 --capacity 5Gi  --enable-host-sharing="true" --namespace minio-prod2 --storage-class nfs-storageclass --disable-tls --expose-console-service --image minio/minio:RELEASE.2023-09-07T02-05-02Z

#然后获取账号密码
#minio-env-configuration和minio-user-1就是报存了用户账号密码
kubectl get secrets  -n minio-prod
#暴露控制台端口
#通过命令行创建的租户,默认的控制台svc是clusterIP类型,但是直接修改类型为NodePort类型会自动还原为clusterIP
#测试在创建租户的使用使用--expose-console-service参数,但是该参数创建的svc是loadBalancer类型
#所以手动创建一个nodeport类型的svc暴露控制台端口
kubectl -n minio-prod  get svc  minio-tenant1-console -oyaml > minio-tenant1-console-nodeport.yaml
vim minio-tenant1-console-nodeport.yaml
kubectl apply -f minio-tenant1-console-nodeport.yaml
#然后浏览器访问minio页面正常
helm部署minio operator

官方文档:https://min.io/docs/minio/kubernetes/upstream/operations/install-deploy-manage/deploy-operator-helm.html#

#下载helm charts
curl -O https://raw.githubusercontent.com/minio/operator/master/helm-releases/operator-5.0.9.tgz
#helm部署operator
helm install \
--namespace minio-operator \
--create-namespace \
minio-operator operator-5.0.9.tgz
#修改deployment副本数为1
kubectl scale  deployment minio-operator --replicas=1 -n minio-operator
#修改svc的类型为nodeport并自定义要暴露的端口
kubectl edit service console -n minio-operator
#先检查是否存在名称为console-sa-secret的secrets,不存在则创建,存在则不用创建
kubectl get secrets console-sa-secret  -n minio-operator
cat >console-secret.yaml<<'EOF'
apiVersion: v1
kind: Secret
metadata:
  name: console-sa-secret
  namespace: minio-operator
  annotations:
    kubernetes.io/service-account.name: console-sa
type: kubernetes.io/service-account-token
EOF
kubectl apply -f console-secret.yaml
#获取JWT,控制台使用JWT进行登录验证
SA_TOKEN=$(kubectl -n minio-operator  get secret console-sa-secret -o jsonpath="{.data.token}" | base64 --decode)
echo $SA_TOKEN
#使用物理机IP+控制台svc的端口在浏览器访问,使用JWT登录即可
helm部署minio tenant
#下载helm chart,版本应该与operator保持一致
curl -O https://raw.githubusercontent.com/minio/operator/master/helm-releases/tenant-5.0.9.tgz
#使用helm部署tenant
tar xf tenant-5.0.9.tgz
cd tenant
vim values.yaml
cd ../
helm install \
--namespace minio-prod1 \
--create-namespace \
minio-tenant tenant/
#查看全部正常
kubectl get all -n minio-prod1 
#默认控制台的svc是clusterIP类型,直接修改svc的类型默认会自动还原的,所以自己创建一个nodeport类型控制台svc的即可
#minio的登录账号密码在values.yaml里面写有,从secrets myminio-env-configuration也能查看出来

小节

使用helm部署operator、然后既可以直接使用命令行创建tenant,也可以在operator控制台页面创建tenant,还可以直接使用helm chart包创建tenant。所以,创建tenant的方式是多种多样的。创建完成租户之后,默认的minio控制台svc是clusterIP类型,但是直接修改类型为NodePort类型会自动还原为clusterIP,虽然可以在创建租户的使用选择暴露service,但是创建的svc是loadBalancer类型,所以手动创建一个nodeport类型的svc暴露控制台端口即可。

kubectl -n minio-prod  get svc  minio-tenant1-console -oyaml > minio-tenant1-console-nodeport.yaml
vim minio-tenant1-console-nodeport.yaml
kubectl apply -f minio-tenant1-console-nodeport.yaml

然后在浏览器访问minio控制台页面正常。

helm部署minio集群(bitnami官方仓库chart)

minio官方提供的k8s部署minio方式,先部署operator,然后再部署tenant,这样显得有限繁琐。
下面使用helm的bitnami仓库提供的chart包直接部署minio集群,既然是bitnami官方仓库提供的chart,那可直接用于生产环境。

#添加helm仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo add stable http://mirror.azure.cn/kubernetes/charts
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
helm repo add incubator https://charts.helm.sh/incubator
#在仓库中搜索minio
helm search repo minio
下载minio 的chart包
helm pull bitnami/minio --version=12.8.12
tar xf minio-12.8.12.tgz
cd minio
#修改values.yaml文件,将mode改为distributed,svc改为NodePort
vim values.yaml
#创建命名空间
kubectl create ns  minio-prod
#检查试运行
helm  template  minio . -n minio-prod --dry-run 
#部署minio
helm  install  minio . -n minio-prod
#获取minio账号密码 
export ROOT_USER=$(kubectl get secret --namespace minio-prod minio -o jsonpath="{.data.root-user}" | base64 -d)
export ROOT_PASSWORD=$(kubectl get secret --namespace minio-prod minio -o jsonpath="{.data.root-password}" | base64 -d)
#使用浏览器访问正常
http://192.168.xx.151:9001 minioadmin/minioadmin@123456

总结

以上我们发现,minion的部署有3种方式:

linux部署minio:
1、使用linux部署minio,单台单磁盘部署minion,存在服务器宕机、磁盘损坏的情况;
2、使用linux部署minion,单台多磁盘,磁盘最少是4个盘,4个盘才能做到纠删码模式,数据可以做到冗余恢复;
3、使用linux部署minion,多台多磁盘是官方推荐的生产环境,官方推荐的最小配置是4台服务器,每台服务器4个盘,这样可以做到minio高可用。
docker部署minio:
1、单容器单磁盘,直接一个容器挂载一个磁盘启动minio,适用于dev环境;
2、单容器多磁盘,直接一个容器挂载多个磁盘启动minio;
3、官方没有提供在dockers环境下部署多节点多磁盘的minio,而是建议使用k8s来部署多节点多磁盘的minio。
k8s部署minio:
1、k8s部署minio-单个pod(dev环境)
2、生产环境,minio官方的做法是创建operator,然后operator控制台页面创建tenant,tenant就是minio集群;
 2-1、使用minio kubernetes plugin部署minio operator,然后operator控制台页面创建tenant(tenant也可以使用kubectl minio命令行创建);
 2-2、使用helm创建minio operator,然后helm创建tenant 。
4、如果不想用minio官方的方式创建operator,那可以直接bitnami官方仓库chart直接部署minio。

猜你喜欢

转载自blog.csdn.net/MssGuo/article/details/133796162