使用MinIO Operator来部署MinIO
使用MinIO Operator搭建MinIO的笔记。
需要使用Velero的人可以参考一下。
中国语中,”MinIO是什么”的同义表达可以是:
什么是MinIO
MinIO是一种对象存储解决方案,可在本地环境等自建,具备与AWS S3兼容的API。
因此,在无法轻松使用S3存储的本地环境等进行验证时,MinIO是非常有用的开源软件。
以前,只需要简单地应用 YAML 文件就能安装,但最近需要通过操作符来完成安装,这增加了一些复杂性,但也带来了更多功能。
大致的使用步骤如下:
-
- 安装MinIO Operator
-
- 创建租户
- 创建存储桶
从这里开始的步骤假设已经有一个由多个节点组成的Kubernetes集群。
此外,请尽量按需跳过或重新解释以下内容。
-
- External IPを使ってサービスを外部公開する
- Tanzu Kubernetes Cluster(vSphere with Tanzuのクラスタ)向けにPSPを設定する
此外,之所以写着“多个Node”是因为它需要多个Node作为前提条件。如果只有一个Node组成,Minio Operator的Pod将一直处于挂起状态,无法继续部署(请参考此问题)。
安装MinIO Operator。
如果你还没有安装krew, 运行下面的命令来安装: MinIO的安装程序是作为kubectl的插件提供的,因此需要安装该插件。
(
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
)
如果可以使用krew,请执行以下操作以安装MinIO的插件。
kubectl krew update
kubectl krew install minio
安装完成后,执行下列命令确认版本号是否显示,即表示安装已成功完成。
kubectl minio version
当插件安装完成后,安装操作者。
kubectl minio init
执行上述命令后,将创建名为minio-operator的命名空间,并创建以下Pod。(注意,尽管可以通过选项更改命名空间等内容,但本次省略此操作)
$ kubectl get pod -n minio-operator
NAME READY STATUS RESTARTS AGE
console-68fb58cbcb-84gx9 1/1 Running 0 20h
minio-operator-6b8b678c66-jt9ff 1/1 Running 0 20h
minio-operator-6b8b678c66-rf5rj 1/1 Running 0 20h
此外,如果使用的是Tanzu Kubernetes Cluster(vSphere with Tanzu的集群),默认权限不足,无法启动Pod。在这种情况下,需要向minio-operator Namespace内的ServiceAccount授予权限。
cat << EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: cluster-admin-minio-rolebinding
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: minio-operator
namespace: minio-operator
- kind: ServiceAccount
name: console-sa
namespace: minio-operator
EOF
授予权限后,删除ReplicaSet将正常创建Pod。
kubectl delete rs -n minio-operator --all
创建租户
提前创建一个用于展示租户的命名空间。
kubectl create ns velero-tenant
接下来将通过GUI进行操作。默认情况下,用于创建租户的控制台界面服务以Type:LoadBalancer的方式进行公开。
$ kubectl get svc -n minio-operator
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
console LoadBalancer 10.98.212.154 10.220.14.117 9090:31881/TCP,9443:30258/TCP 21h
operator ClusterIP 10.100.37.245 <none> 4222/TCP,4221/TCP 21h
访问ExternalIP的Port9090(在这里是http://10.220.14.117:9090)。
在”Enter JWT”的位置指定使用以下命令获取的令牌。
kubectl minio proxy
此外,在执行命令后开始进行PortForward,但忽略它并使用Ctrl+C等方式强制终止命令是没有问题的。
登录后,单击右上角的“创建租户”。
虽然有很多设置选项,但只需填写名称、命名空间、服务器数量和总大小即可创建租户。
我将其设置如下。由于默认大小较大,所以建议在这里进行检查。
如果在Velero用途中使用MinIO,如果自定义的TLS已启用,则可能导致安装和备份失败(虽然有–insecure-skip-tls-verify选项,但它较新且有限支持)。对于Velero的验证用途,也应考虑将TLS关闭。
点击“Create”后,将显示访问秘钥和密钥,以便访问租户,务必妥善保存。
过一段时间后,将创建以下类似资源(创建所有资源需花费几分钟时间)。
$ kubectl get all -n velero-tenant
NAME READY STATUS RESTARTS AGE
pod/velero-tenant-log-0 1/1 Running 0 97s
pod/velero-tenant-log-search-api-677556bdbf-jfcgk 1/1 Running 3 96s
pod/velero-tenant-pool-0-0 1/1 Running 0 99s
pod/velero-tenant-pool-0-1 1/1 Running 0 99s
pod/velero-tenant-prometheus-0 2/2 Running 0 38s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/minio LoadBalancer 10.109.40.11 10.220.14.120 443:30090/TCP 2m39s
service/velero-tenant-console LoadBalancer 10.108.235.108 10.220.14.121 9443:30543/TCP 2m39s
service/velero-tenant-hl ClusterIP None <none> 9000/TCP 2m39s
service/velero-tenant-log-hl-svc ClusterIP None <none> 5432/TCP 97s
service/velero-tenant-log-search-api ClusterIP 10.96.85.93 <none> 8080/TCP 96s
service/velero-tenant-prometheus-hl-svc ClusterIP None <none> 9090/TCP 38s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/velero-tenant-log-search-api 1/1 1 1 96s
NAME DESIRED CURRENT READY AGE
replicaset.apps/velero-tenant-log-search-api-677556bdbf 1 1 1 96s
NAME READY AGE
statefulset.apps/velero-tenant-log 1/1 98s
statefulset.apps/velero-tenant-pool-0 2/2 100s
statefulset.apps/velero-tenant-prometheus 1/1 39s
创建一个桶
使用之前创建的租户资源中的Service的velero-tenant-console通过HTTPS进行访问。由于ExternalIP为10.220.14.121,使用Port9443进行公开,所以在浏览器中访问https://10.220.14.121:9443/。
然后将显示以下登录页面,使用之前保存的Access Key和Secret Key进行登录。
登录后,选择右上方的“创建存储桶”,然后会显示存储桶创建页面,您可以设置一个喜欢的名称和配置,点击“创建存储桶”即可成功创建存储桶。
对于存储桶的访问
因为已经创建的Access Key和Secret Key不方便使用,所以请首先生成新的凭证。
请在侧边栏中选择Administrator -> Identity -> Users,点击Create User创建你所需的用户。请记住,不要忘记将consoleAdmin或其他适当的权限授予Policy,就像下面的图片示例一样。
密码必须至少为8个字符以上。
使用创建的账号重新登录后,可以顺利登录。
最后,通过使用mc命令访问存储桶。
所有的Windows、Mac和Linux都提供二进制发布,安装容易,所以不再介绍安装方法。
首先初始化mc命令。注意到需要使用–insecure选项。另外,这里指定的IP是Serviceminio公开的IP,而不是控制台的IP。
$ mc alias set velero-bucket https://10.220.14.120/ demouser demodemo123 --insecure
Added `velero-bucket` successfully.
如果配置正确,可以使用以下命令获取租户内的信息。
$ mc admin info velero-bucket --insecure
● velero-tenant-pool-0-0.velero-tenant-hl.velero-tenant.svc.cluster.local:9000
Uptime: 20 hours
Version: 2022-11-11T03:44:20Z
Network: 2/2 OK
Drives: 2/2 OK
Pool: 1
● velero-tenant-pool-0-1.velero-tenant-hl.velero-tenant.svc.cluster.local:9000
Uptime: 20 hours
Version: 2022-11-11T03:44:20Z
Network: 2/2 OK
Drives: 2/2 OK
Pool: 1
Pools:
1st, Erasure sets: 1, Drives per erasure set: 4
0 B Used, 1 Bucket, 0 Objects
4 drives online, 0 drives offline
试着在存储桶中创建文件。
echo "demo" > ./aaa.txt
mc cp aaa.txt velero-bucket/velero-bucket/aaa.txt --insecure
确认。
$ mc ls velero-bucket/ --insecure -r
[2022-11-17 10:43:18 JST] 5B STANDARD velero-bucket/aaa.txt
辛苦啦。
额外的:可以在Linux上正常搭建
如果在Kubernetes上设置很麻烦,按照这里的步骤可以轻松在Linux上设置。
我贴上了为了自动化而脚本化的内容。
#!/bin/bash
set -x
IPADDR=$(hostname -I | awk '{print $1}')
curl -O https://dl.minio.io/server/minio/release/linux-amd64/minio
sudo install minio /usr/local/bin
sudo mkdir -p /usr/local/share/minio
sudo mkdir -p /usr/local/share/minio
sudo useradd minio-user
sudo chown minio-user:minio-user /usr/local/share/minio
sudo mkdir -p /etc/minio
sudo chown minio-user:minio-user /etc/minio
cat << EOF > /tmp/minio-default
MINIO_VOLUMES="/usr/local/share/minio/"
MINIO_OPTS="-C /etc/minio --address $IPADDR:9000"
MINIO_ACCESS_KEY="minio"
MINIO_SECRET_KEY="minio123"
EOF
sudo mv /tmp/minio-default /etc/default/minio
curl -O https://raw.githubusercontent.com/minio/minio-service/master/linux-systemd/minio.service
sudo mv minio.service /etc/systemd/system
sudo systemctl daemon-reload
sudo systemctl enable minio
sudo systemctl start minio
可以使用sudo systemctl status minio命令来确认控制台的连接位置。
到这里创建桶。
curl https://dl.min.io/client/mc/release/linux-amd64/mc \
-o $HOME/mc
sudo install mc /usr/local/bin/
mc alias set minio-server http://localhost:9000 minio minio123
mc mb minio-server/mybucket
如果想支持TLS,请按照官方文档的步骤执行以下操作。
1. 制作自己的签名证书。
2. 将文件名称根据官方文件进行重命名,然后放置在适当的地方(例如/home/ubuntu/.minio/certs)。
3. 更改所有者,以便minio用户可以查看。
chown -R minio-user.minio-user /home/ubuntu/.minio/certs
4. 修改/etc/systemd/system/minio.service文件,将ExecStart的值修改为添加了–certs-dir选项的形式。
ExecStart=/usr/local/bin/minio server --certs-dir /home/ubuntu/.minio/certs $MINIO_OPTS $MINIO_VOLUMES
5. 重新启动
sudo systemctl daemon-reload
sudo systemctl restart minio