使用MinIO Operator来部署MinIO

使用MinIO Operator搭建MinIO的笔记。
需要使用Velero的人可以参考一下。

中国语中,”MinIO是什么”的同义表达可以是:

什么是MinIO

MinIO是一种对象存储解决方案,可在本地环境等自建,具备与AWS S3兼容的API。
因此,在无法轻松使用S3存储的本地环境等进行验证时,MinIO是非常有用的开源软件。

以前,只需要简单地应用 YAML 文件就能安装,但最近需要通过操作符来完成安装,这增加了一些复杂性,但也带来了更多功能。

大致的使用步骤如下:

    1. 安装MinIO Operator

 

    1. 创建租户

 

    创建存储桶

从这里开始的步骤假设已经有一个由多个节点组成的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)。

1668565638136.png

在”Enter JWT”的位置指定使用以下命令获取的令牌。

kubectl minio proxy

此外,在执行命令后开始进行PortForward,但忽略它并使用Ctrl+C等方式强制终止命令是没有问题的。

登录后,单击右上角的“创建租户”。
虽然有很多设置选项,但只需填写名称、命名空间、服务器数量和总大小即可创建租户。
我将其设置如下。由于默认大小较大,所以建议在这里进行检查。

1668566368952.png
image.png

如果在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进行登录。

1668573671595.png

登录后,选择右上方的“创建存储桶”,然后会显示存储桶创建页面,您可以设置一个喜欢的名称和配置,点击“创建存储桶”即可成功创建存储桶。

1668573801783.png

对于存储桶的访问

因为已经创建的Access Key和Secret Key不方便使用,所以请首先生成新的凭证。
请在侧边栏中选择Administrator -> Identity -> Users,点击Create User创建你所需的用户。请记住,不要忘记将consoleAdmin或其他适当的权限授予Policy,就像下面的图片示例一样。

1668587252993.png

密码必须至少为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
1668649490986.png

辛苦啦。

额外的:可以在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
广告
将在 10 秒后关闭
bannerAds