preloader
  • Início
  • Implantar MinIO no OpenShift 4.16 como solução de Object Storage

Implantar MinIO no Red Hat OpenShift pode ser um pouco trabalhoso. No entanto, se você não tem uma subscrição ativa para um Object Storage, esta pode ser uma boa solução. Aprenda aqui como Implantar MinIO no OpenShift. MinIO Object Storage para OpenShift.

blog-thumb

Implantar o MinIO em um cluster Kubernetes Red Hat OpenShift

Talvez não seja uma tarefa fácil. Este post inclui as instruções necessárias para implementação, pois existem algumas peculiaridades para implantar o MinIO em um cluster OpenShift.


Importante saber: O MinIO Operator NÃO FUNCIONA com o OpenShift 4.16, que foi a versão utilizada nesta implementação. Na realidade, eu já tive outros problemas com este operador no passado, mesmo com outras versões de OCP. Por isso eu não o utilizo. Logo, iremos utilizar uma abordagem diferente para fazer o deploy.


Não se preocupe, que vou explicar tudo que você precisa saber! 😎

Em todo caso, a documentação oficial pode ser encontrada aqui.


Requisitos

* Red Hat OpenShift 4.16 (funciona em outros também)

* Acesso administrativo ao cluster


MinIO para Kubernetes

Usaremos o POD oficial. Simples assim. Sem enfeitar muito o pavão. O processo consiste em fazer o básico:

- Criar Namespace

- Criar PVC

- Criar Serviço

- Criar Rotas de acesso

- Criar um Deployment


🤜🏻 Mãos a obra! 🤛🏻


Namespace

Apenas o padrão.

$ cat minio-ns.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: minio-ocp
  labels:
    name: minio-ocp
$ oc create -f minio-ns.yaml
namespace/minio-ocp created

PVC

Certifique-se de ajustar o Storage Class Name de acordo com seu ambiente.

$ cat minio-pvc.yaml

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: minio-ocp
  namespace: minio-ocp
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 100Gi
  storageClassName: thin-csi
  volumeMode: Filesystem

$ oc create -f minio-pvc.yaml
persistentvolumeclaim/minio-ocp created

MinIO Instance

Este eu criei do zero, baseado no comportamento do POD. Aproveitei e adicionei algumas probes.

* Ajuste o nodeSelector e os volumes de acordo com seu ambiente.


$ cat minio-ocp.yaml

kind: Deployment
apiVersion: apps/v1
metadata:
  name: minio
  namespace: minio-ocp
  annotations:
    deployment.kubernetes.io/revision: '1'
spec:
  replicas: 1
  selector:
    matchLabels:
      app: minio
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: minio
    spec:
      volumes:
        - name: minio-ocp
          persistentVolumeClaim:
            claimName: minio-ocp
      containers:
        - resources: {}
          readinessProbe:
            tcpSocket:
              port: 9090
            timeoutSeconds: 5
            periodSeconds: 10
            successThreshold: 1
            failureThreshold: 3
          terminationMessagePath: /dev/termination-log
          name: container
          command:
            - /bin/bash
            - '-c'
          ports:
            - containerPort: 9090
              protocol: TCP
            - containerPort: 9000
              protocol: TCP
          imagePullPolicy: IfNotPresent
          volumeMounts:
            - name: minio-ocp
              mountPath: /data
          terminationMessagePolicy: File
          image: 'quay.io/minio/minio:latest'
          args:
            - 'minio server /data --console-address :9090'
      restartPolicy: Always
      terminationGracePeriodSeconds: 30
      dnsPolicy: ClusterFirst
      nodeSelector:
        node-role.kubernetes.io/worker: ''
      securityContext: {}
      schedulerName: default-scheduler
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
  revisionHistoryLimit: 10
  progressDeadlineSeconds: 600


⚠️ Nota: Foi utilizado replicas: 1 pois o PVC deste exemplo suporta apenas RWO. Para utilizar mais de uma réplica, será necessário utilizar um volume com suporte a RWX.



Ao criar a instância, alguns erros serão exibidos. Isso tem a ver com as restrições de SCC do OpenShift. Veremos como ajustar isso mais adiante.

$ oc create -f minio-ocp.yaml

Warning: would violate PodSecurity "restricted:v1.24": allowPrivilegeEscalation != false (container "minio" must set securityContext.allowPrivilegeEscalation=false), unrestricted capabilities (container "minio" must set securityContext.capabilities.drop=["ALL"]), runAsNonRoot != true (pod or container "minio" must set securityContext.runAsNonRoot=true), seccompProfile (pod or container "minio" must set securityContext.seccompProfile.type to "RuntimeDefault" or "Localhost")

pod/minio created

MinIO POD SCC

Confira se o namespace ativo é “minio-ocp”:

$ oc project

Using project "minio-ocp" on server "https://api.onpremises.example.com:6443".

Verifique se o POD está rodando:

$ oc get pods

NAME                     READY   STATUS    RESTARTS   AGE
minio-5cc789844f-kf8jr   1/1     Running   0          89m

Agora, faça uma análise dos SCC necessários para o POD rodar:

$ oc get deployment/minio -o yaml | oc adm policy scc-subject-review -f -

RESOURCE    ALLOWED BY
Pod/minio   anyuid

Verifique a conta de serviço usada pelo POD:

$ oc get pod/minio-5cc789844f-kf8jr -o yaml | grep serviceAccountName

  serviceAccountName: default

Aplique as políticas necessárias na conta de serviço do POD:

$ oc adm policy add-scc-to-user anyuid -z default

clusterrole.rbac.authorization.k8s.io/system:openshift:scc:anyuid added: "default"


⚠️ Nota: Este não é o método ideal para atribuir os privilégios ao POD. Seria melhor criar uma outra conta de serviço para o MinIO, e trabalhar sobre esta conta. Melhor ainda seria criar uma política customizada, contendo apenas os requisitos de acesso que o POD precisa para funcionar. Fica esta dica para você melhorar esta parte. 😉



Verifique se o PVC foi montado:

$ oc get pvc

NAME        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
minio-ocp   Bound    pvc-807f9aa6-509b-47ed-a0c3-f2bcf7335917   100Gi      RWO            thin-csi       <unset>                 12m

Services

Verifique a porta que o POD do MinIO está utilizando:

$ oc describe pod/minio-5cc789844f-kf8jr | grep server
      minio server /data --console-address :9090

Utilize um YAML como este para criar o serviço:

$ cat minio-svc.yaml

kind: Service
apiVersion: v1
metadata:
  name: minio-webui
  namespace: minio-ocp
  labels:
    app: minio
spec:
  ports:
    - protocol: TCP
      port: 9090
      targetPort: 9090
      name: webui
  type: ClusterIP
  selector:
    app: minio
---
kind: Service
apiVersion: v1
metadata:
  name: minio-api
  namespace: minio-ocp
  labels:
    app: minio
spec:
  ports:
    - protocol: TCP
      port: 9000
      targetPort: 9000
      name: api
  type: ClusterIP
  selector:
    app: minio
$ oc create -f minio-svc.yaml

⚠️ Nota: Você deve ter percebido que a declaração do serviço contempla as potas TCP 9090 (WebUI) e 9000 (API).A porta TCP 9000 só será ativada quando o primeiro Bucket S3 for criado no MinIO.


Verifique se os serviços foram criados:

$ oc get svc

NAME          TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
minio-api     ClusterIP   172.32.188.189   <none>        9000/TCP   15m
minio-webui   ClusterIP   172.32.73.106    <none>        9090/TCP   15m

Routes

Para acessar o console Web do MinIO, precisamos de uma Rota (similar a um Ingress). O mesmo para o endpoint S3.


⚠️ Ajuste o parâmetro da variável host de acordo com seu ambiente.


Utilize um YAML como este para criar a rota:

$ cat minio-route.yaml

kind: Route
apiVersion: route.openshift.io/v1
metadata:
  name: webui
  namespace: minio-ocp
  labels:
    app: minio
spec:
  host: webui-minio-ocp.apps.onpremises.example.com
  to:
    kind: Service
    name: minio-webui
    weight: 100
  port:
    targetPort: webui
  wildcardPolicy: None
---
kind: Route
apiVersion: route.openshift.io/v1
metadata:
  name: s3
  namespace: minio-ocp
  labels:
    app: minio
spec:
  host: s3-minio-ocp.apps.onpremises.example.com
  to:
    kind: Service
    name: minio-api
    weight: 100
  port:
    targetPort: api
  wildcardPolicy: None
$ oc create -f minio-route.yaml

Importante:

🔹 O nome de host que inicia com webui-minio-ocp será utilizado para acesso a WebUI do MinIO.

🔸 O nome do host que inicia com s3-minio-ocp será utilizado para acesso aos buckets do MinIO.


Verifique os endpoints das rotas criadas:

$ oc get routes

NAME    HOST/PORT                                      PATH   SERVICES      PORT    TERMINATION   WILDCARD
s3      s3-minio-ocp.apps.onpremises.example.com              minio-api     api                   None
webui   webui-minio-ocp.apps.onpremises.example.com           minio-webui   webui                 None


⚠️ Nota: Eu recomendo que crie rotas do tipo Edge para o MinIO. Consulte a documentação do MinIO e do OpenShift para aprender como configurar o uso de certificados TLS.

Talvez eu faça um outro artigo para complementar esta parte. Talvez não. 😅



Observe todos os recursos criados até agora:

$ oc get all

NAME                         READY   STATUS    RESTARTS   AGE
pod/minio-5f6f944f78-fqgjr   1/1     Running   0          56m

NAME                  TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
service/minio-api     ClusterIP   172.32.188.189   <none>        9000/TCP   23m
service/minio-webui   ClusterIP   172.32.73.106    <none>        9090/TCP   23m

NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/minio   1/1     1            1           5h1m

NAME                               DESIRED   CURRENT   READY   AGE
replicaset.apps/minio-5f6f944f78   1         1         1       56m

NAME                             HOST/PORT                                      PATH   SERVICES      PORT    TERMINATION   WILDCARD
route.route.openshift.io/s3      s3-minio-ocp.apps.onpremises.example.com              minio-api     api                   None
route.route.openshift.io/webui   webui-minio-ocp.apps.onpremises.example.com           minio-webui   webui                 None

Agora é só testar o acesso na URL da WebUI:

http://webui-minio-ocp.apps.onpremises.example.com/

MinIO Console Login

Beleza! Mas… Cadê o login?? 🧐

De acordo com a documentação oficial:

minioadmin | minioadmin

Você pode conferir essa informação nos logs do POD.

MinIO POD Log

🔴 Não esqueça de mudar a senha do usuário minioadmin!


MinIO Console

😎 Molezinha. No entanto, ainda precisaremos customizar alguns detalhes. ⚙️


S3 Buckets

Finalmente o que você queria! Mas antes de criar o primeiro bucket, precisaremos de um usuário e uma chave de acesso.


Usuário para acesso ao Bucket

Para atribuir acesso a um bucket, precisamos de um usuário. Para criá-lo, navegue pelas opções Identity > Users > Create User.

No exemplo, criamos um usuário nomeado loki com a senha password.

MinIO User Creation

Atribua a access key loki ao usuário loki:

MinIO User Access Key

Agora adicione os detalhes da Access Key:

MinIO User Access Key

MinIO User Access Key

MinIO User Access Key

Um aviso será exibido, para que você anote ou baixe a Access Key, pois não será possível recuperar o conteúdo da secret depois:

MinIO User Access Key

Ao ser baixado, o conteúdo do JSON será similar a este:

 
{"url":"http://127.0.0.1:9000","accessKey":"imzYtyEHhI8pAPWeJNUI","secretKey":"wiTKO6sFwHKPrWp1jrWkqzb4hl2plX0uPAGpZMgV","api":"s3v4","path":"auto"}
 

Você vai perceber que na guia Service Accounts do usuário loki, haverá uma Access Key.

MinIO User Access Key


Object Bucket

Vá em Administrator > Buckets e crie um bucket nomeado loki.

MinIO Object Bucket

MinIO Object Bucket

Vá em Administrator > Buckets > loki > Access. Observe que em Access Audit teremos o usuário loki.

MinIO Object Bucket

Acessando o Bucket

O acesso ao bucket é padrão S3. Nesse nosso exemplo, você irá precisar dos seguintes dados:

* S3 endpoint: https://s3-minio-ocp.apps.onpremises.example.com

* Bucket Name: loki

* Access Key: imzYtyEHhI8pAPWeJNUI

* Secret Key: wiTKO6sFwHKPrWp1jrWkqzb4hl2plX0uPAGpZMgV


Quando sua aplicação montar o bucket, será possível observar na interface do MinIO alguns detalhes de uso e consumo do bucket.

MinIO Object Bucket Stats

MinIO Object Bucket Stats

Poderemos ver no POD os dados armazenados no PVC:

 
$ oc rsh minio-5f6f944f78-fqgjr du -h /data/loki/

8.0K    /data/loki/index/delete_requests/delete_requests.gz
12K     /data/loki/index/delete_requests
8.0K    /data/loki/index/index_20097/1736407355-logging-loki-ingester-0-1736401784020620447.tsdb.gz
8.0K    /data/loki/index/index_20097/1736407417-logging-loki-ingester-1-1736401848077981316.tsdb.gz
20K     /data/loki/index/index_20097
36K     /data/loki/index
64K     /data/loki/audit/3ab47c3c45f75a78/19449ee35ec:19449ee45f7:2530a44c
68K     /data/loki/audit/3ab47c3c45f75a78
72K     /data/loki/audit
112K    /data/loki/
(...)
 

MinIO Client

Podemos instalar o client mc para gerenciamento do MinIO via CLI.


Prometheus

É possível configurar uma conexão ao Prometheus do OpenShift. Porém o processo é um pouco trabalhoso.

Talvez eu faça um outro artigo para complementar esta parte. Talvez não. 😅


Dicas Finais

Em ambientes de produção, o ideal é criar Tenants, para melhor isolamento e escalabilidade do MinIO. Consulte a documentação oficial para mais informações.

Espero que este material tenha sido útil.



Gostou do conteúdo? Dê uma olhada nesses outros artigos interessantes! 🔥

✅ Deixe uma mensagem com sua dúvida! Compartilhe este material com sua rede!



Apoie nosso trabalho 💖

Gostou do que encontrou aqui? A cada clique em um banner, você ajuda a manter este site vivo e gratuito. Seu apoio faz toda a diferença para que possamos continuar trazendo conteúdos que você adora. Muito obrigado! 😊

comments powered by Disqus