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.
*
Red Hat OpenShift 4.16 (funciona em outros também)
*
Acesso administrativo ao cluster
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! 🤛🏻
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
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
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
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
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
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/
Beleza! Mas… Cadê o login?? 🧐
De acordo com a documentação oficial:
minioadmin | minioadmin
Você pode conferir essa informação nos logs do POD.
🔴 Não esqueça de mudar a senha do usuário minioadmin!
😎 Molezinha. No entanto, ainda precisaremos customizar alguns detalhes. ⚙️
Finalmente o que você queria! Mas antes de criar o primeiro bucket, precisaremos de um usuário e uma chave de acesso.
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
.
Atribua a access key loki ao usuário loki:
Agora adicione os detalhes da 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:
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.
Vá em Administrator > Buckets
e crie um bucket nomeado loki.
Vá em Administrator > Buckets > loki > Access
. Observe que em Access Audit
teremos o usuário loki.
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.
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/
(...)
Podemos instalar o client mc para gerenciamento do MinIO via CLI.
É 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. 😅
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!
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! 😊