
Parte 1 Implementamos o ambiente para trabalhar com microsserviços. Parte 1 instalando o Kubernetes HA no bare metal (Debian)
Olá, queridos leitores da Habr!
Em uma postagem anterior , falei sobre como implantar um cluster de failover do Kubernetes. Mas o fato é que no Kubernetes é conveniente implantar aplicativos sem estado que não precisam manter seu estado ou trabalhar com dados. Mas, na maioria dos casos, precisamos salvar os dados e não perdê-los ao reiniciar os lares.
O Kubernetes usa volumes para esses fins. Quando trabalhamos com as soluções em nuvem Kubernetes, não há problemas específicos. Só precisamos solicitar o volume necessário do Google, Amazon ou outro provedor de nuvem e, guiados pela documentação , conectar os volumes recebidos aos pods.
Quando lidamos com o bare metal, as coisas são um pouco mais complicadas. Hoje eu quero falar sobre uma das soluções baseadas no uso do ceph.
Nesta publicação, direi:
- como implantar armazenamento distribuído ceph
- Como usar o Ceph ao trabalhar com o Kubernetes
1. Introdução
Para começar, gostaria de explicar a quem este artigo será útil. Em primeiro lugar, para os leitores que implantaram o cluster de acordo com minha primeira publicação para continuar a construir uma arquitetura de microsserviço. Em segundo lugar, para as pessoas que desejam tentar implantar um cluster ceph por conta própria e avaliar seu desempenho.
Nesta publicação, não abordarei o tópico planejamento de cluster para nenhuma necessidade; falarei apenas sobre princípios e conceitos gerais. Não vou me aprofundar em "tuning" e deep tuning, existem muitas publicações sobre esse assunto, inclusive no Habr. O artigo será de natureza mais introdutória, mas, ao mesmo tempo, permitirá que você obtenha uma solução funcional que possa se adaptar às suas necessidades no futuro.
- Lista de hosts, recursos de host, versões de SO e software
- Estrutura do Cluster Ceph
- Configurar nós do cluster antes da instalação
- Instalar ceph-deploy
- Criando um cluster ceph
- Configuração de rede
- Instale pacotes ceph
- Instalação e inicialização de monitores
- Adicionando OSD
- Conectar ceph ao kubernetes
- Criando um pool de dados
- Criando um segredo do cliente
- Implantar ceph rbd provisioner
- Criando uma classe de armazenamento
- Teste de ligamentos de Kubernetes + ceph
- Lista de materiais utilizados na preparação do artigo
Lista de hosts e requisitos do sistema
Ao escrever um artigo, eu uso máquinas virtuais com esta configuração

Cada um possui um sistema operacional Debian 9.5 instalado. São máquinas de teste, cada uma com dois discos, o primeiro para o sistema operacional e o segundo para o OSD Cef
Implementarei o cluster por meio do utilitário ceph-deploy. Você pode implantar um cluster ceph no modo manual, todas as etapas estão descritas na documentação, mas o objetivo deste artigo é informar com que rapidez você pode implantar o ceph e começar a usá-lo no kubernetes.
Ceph é bastante guloso para recursos, especialmente RAM. Para uma boa velocidade, é aconselhável usar unidades ssd.
Você pode ler mais sobre os requisitos na documentação oficial do ceph.
Estrutura do Cluster Ceph
MON
Um monitor é um daemon que atua como o coordenador a partir do qual o cluster começa. Assim que temos pelo menos um monitor em funcionamento, temos um cluster Ceph. O monitor armazena informações sobre a saúde e as condições do cluster trocando vários cartões com outros monitores. Os clientes recorrem aos monitores para descobrir em qual OSD gravar / ler dados. Quando você implanta um novo armazenamento, a primeira coisa a fazer é criar um monitor (ou vários). O cluster pode viver em um monitor, mas é recomendável criar 3 ou 5 monitores para evitar a queda de todo o sistema devido à queda de um único monitor. O principal é que o número destes deve ser ímpar, a fim de evitar situações de cérebro dividido. Os monitores funcionam em um quorum; portanto, se mais da metade dos monitores cair, o cluster será bloqueado para evitar inconsistência de dados.
Mons.
O daemon do Ceph Manager trabalha com o daemon de monitor para fornecer controle adicional.
Desde a versão 12.x, o daemon ceph-mgr tornou-se necessário para a operação normal.
Se o daemon mgr não estiver em execução, você verá um aviso sobre isso.
OSD (dispositivo de armazenamento de objeto)
OSD é uma unidade de armazenamento que armazena os dados em si e processa solicitações de clientes trocando dados com outros OSDs. Isso geralmente é um disco. E geralmente para cada OSD, existe um daemon OSD separado que pode ser executado em qualquer máquina na qual esse disco está instalado.
Todos os três daemons funcionarão em cada máquina em nosso cluster. Assim, monitore e gerencie os daemons como daemons de serviço e OSD para uma unidade de nossa máquina virtual.
Configurar nós do cluster antes da instalação
A documentação do ceph especifica o seguinte fluxo de trabalho:

Trabalharei a partir do primeiro nó do cluster ceph01-test, será o Nó Admin, também conterá arquivos de configuração para o utilitário ceph-deploy. Para que o utilitário ceph-deploy funcione corretamente, todos os nós do cluster devem estar acessíveis via ssh com o nó Admin. Por conveniência, escreverei nos nomes abreviados dos hosts do cluster
10.73.88.52 ceph01-test 10.73.88.53 ceph02-test 10.73.88.54 ceph03-tset
E copie as chaves para os outros hosts. Todos os comandos que executarei a partir do root.
ssh-copy-id ceph02-test ssh-copy-id ceph03-test
Documentação de instalação
ceph-deployInstalar ceph-deploy
A primeira etapa é instalar o ceph-deploy na máquina ceph01-test
wget -q -O- 'https://download.ceph.com/keys/release.asc' | apt-key add -
Em seguida, você precisa escolher o lançamento que deseja colocar. Mas aqui existem dificuldades, atualmente o ceph para o Debian OS suporta apenas pacotes luminosos.
Se você deseja publicar uma versão mais recente, precisará usar um espelho, por exemplo
https://mirror.croit.io/debian-mimic/dists/
Adicione um repositório com imitação nos três nós
apt install curl apt-transport-https -y curl https://mirror.croit.io/keys/release.gpg > /usr/share/keyrings/croit-signing-key.gpg echo 'deb [signed-by=/usr/share/keyrings/croit-signing-key.gpg] https://mirror.croit.io/debian-mimic/ stretch main' > /etc/apt/sources.list.d/croit-ceph.list apt update apt install ceph-deploy
Se luminous é o suficiente para você, você pode usar os repositórios oficiais
echo deb https://download.ceph.com/debian-luminous/ $(lsb_release -sc) main | tee /etc/apt/sources.list.d/ceph.list apt-transport-https apt update apt install ceph-deploy
Também instalamos o NTP nos três nós.
uma vez que esta recomendação está na documentação do cephRecomendamos instalar o NTP nos nós Ceph (especialmente nos nós Ceph Monitor) para evitar problemas decorrentes do desvio do relógio.
apt install ntp
Certifique-se de ativar o serviço NTP. Certifique-se de que cada nó Ceph use o mesmo servidor NTP. Você pode ver mais detalhes aqui
Criando um cluster ceph
Crie um diretório para arquivos de configuração e arquivos ceph-deploy
mkdir my-cluster cd my-cluster
Vamos criar uma nova configuração de cluster, ao criar, indicar que haverá três monitores em nosso cluster
ceph-deploy new ceph01-test ceph02-test ceph03-test
Configuração de rede
Agora o ponto importante, é hora de falar sobre a rede para ceph. O Ceph usa duas redes públicas e uma rede de cluster para trabalhar

Como você pode ver no diagrama da rede pública, esse é o nível do usuário e do aplicativo, e a rede de cluster é a rede através da qual os dados são replicados.
É altamente desejável separar essas duas redes uma da outra. Além disso, a rede de cluster de velocidade da rede é desejável pelo menos 10 Gb.
Obviamente, você pode manter tudo na mesma rede. Mas isso é preocupante porque, assim que o volume de replicação entre OSDs aumenta, por exemplo, quando novos OSDs (discos) caem ou são adicionados, a carga da rede MUITO aumenta. Portanto, a velocidade e a estabilidade da sua infraestrutura dependerão muito da rede usada pelo ceph.
Infelizmente, meu cluster de virtualização não possui uma rede separada e usarei um segmento de rede comum.
A configuração de rede para o cluster é feita através do arquivo de configuração, que geramos com o comando anterior.
/my-cluster# cat ceph.conf [global] fsid = 2e0d92b0-e803-475e-9060-0871b63b6e7f mon_initial_members = ceph01-test, ceph02-test, ceph03-test mon_host = 10.73.88.52,10.73.88.53,10.73.88.54 auth_cluster_required = cephx auth_service_required = cephx auth_client_required = cephx
Como podemos ver, o cef deploy não criou as configurações de rede padrão para nós, então adicionarei o parâmetro public network = {public-network / netmask} à seção global da configuração. Minha rede é 10.73.0.0/16, então, depois de adicionar minha configuração, será assim
[global] fsid = 2e0d92b0-e803-475e-9060-0871b63b6e7f mon_initial_members = ceph01-test, ceph02-test, ceph03-test mon_host = 10.73.88.52,10.73.88.53,10.73.88.54 public network = 10.73.0.0/16 auth_cluster_required = cephx auth_service_required = cephx auth_client_required = cephx
Se você deseja separar a rede do cluster de pública, adicione o parâmetro cluster network = {cluster-network / netmask}
Você pode ler mais sobre redes na documentação.
Instale pacotes ceph
Usando ceph-deploy, instalamos todos os pacotes ceph necessários em nossos três nós.
Para fazer isso, em ceph01-test, execute
Se a versão for simulada, então
ceph-deploy install --release mimic ceph01-test ceph02-test ceph03-test
Se a versão for luminosa, então
ceph-deploy install --release luminous ceph01-test ceph02-test ceph03-test
E espere até que tudo esteja estabelecido.
Instalação e inicialização de monitores
Após a instalação de todos os pacotes, criaremos e iniciaremos os monitores do nosso cluster.
C ceph01-test faça o seguinte
ceph-deploy mon create-initial
Os monitores serão criados no processo, os daemons serão lançados e o ceph-deploy verificará o quorum.
Agora espalhe as configurações nos nós do cluster.
ceph-deploy admin ceph01-test ceph02-test ceph03-test
E verifique o status do nosso cluster, se você fez tudo corretamente, o status deve ser
HEALTH_OK
~/my-cluster# ceph status cluster: id: 2e0d92b0-e803-475e-9060-0871b63b6e7f health: HEALTH_OK services: mon: 3 daemons, quorum ceph01-test,ceph02-test,ceph03-test mgr: no daemons active osd: 0 osds: 0 up, 0 in data: pools: 0 pools, 0 pgs objects: 0 objects, 0 B usage: 0 B used, 0 B / 0 B avail pgs:
Criar gerente
ceph-deploy mgr create ceph01-test ceph02-test ceph03-test
E verifique o status novamente
ceph -s
Uma linha deve aparecer
mgr: ceph01-test(active), standbys: ceph02-test, ceph03-test
Escrevemos a configuração para todos os hosts no cluster
ceph-deploy admin ceph01-test ceph02-test ceph03-test
Adicionando OSD
No momento, temos um cluster em funcionamento, mas ele ainda não possui discos (osd na terminologia ceph) para armazenar informações.
OSD pode ser adicionado com o seguinte comando (visão geral)
ceph-deploy osd create --data {device} {ceph-node}
Na minha mesa de teste, o disco / dev / sdb é alocado no osd, portanto, no meu caso, os comandos serão os seguintes
ceph-deploy osd create --data /dev/sdb ceph01-test ceph-deploy osd create --data /dev/sdb ceph02-test ceph-deploy osd create --data /dev/sdb ceph03-test
Verifique se todos os OSDs estão funcionando.
ceph -s
Conclusão
cluster: id: 2e0d92b0-e803-475e-9060-0871b63b6e7f health: HEALTH_OK services: mon: 3 daemons, quorum ceph01-test,ceph02-test,ceph03-test mgr: ceph01-test(active) osd: 3 osds: 3 up, 3 in
Você também pode tentar alguns comandos úteis para OSD.
ceph osd df ID CLASS WEIGHT REWEIGHT SIZE USE AVAIL %USE VAR PGS 0 hdd 0.00490 1.00000 5.0 GiB 1.0 GiB 4.0 GiB 20.05 1.00 0 1 hdd 0.00490 1.00000 5.0 GiB 1.0 GiB 4.0 GiB 20.05 1.00 0 2 hdd 0.00490 1.00000 5.0 GiB 1.0 GiB 4.0 GiB 20.05 1.00 0 TOTAL 15 GiB 3.0 GiB 12 GiB 20.05
e
ceph osd tree ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF -1 0.01469 root default -3 0.00490 host ceph01-test 0 hdd 0.00490 osd.0 up 1.00000 1.00000 -5 0.00490 host ceph02-test 1 hdd 0.00490 osd.1 up 1.00000 1.00000 -7 0.00490 host ceph03-test 2 hdd 0.00490 osd.2 up 1.00000 1.00000
Se estiver tudo bem, temos um cluster ceph em funcionamento. Na próxima parte, mostrarei como usar o ceph com o kubernetes
Conectar ceph ao kubernetes
Infelizmente, não poderei descrever em detalhes a operação dos volumes Kubernetes neste artigo; portanto, tentarei caber em um parágrafo.
O Kubernetes usa classes de armazenamento para trabalhar com volumes de dados, cada classe de armazenamento possui seu próprio provedor, você pode considerá-lo como um tipo de "driver" para trabalhar com diferentes volumes de armazenamento de dados. A lista completa que suporta kubernetes pode ser encontrada na documentação oficial .
O próprio Kubernetes também tem suporte para trabalhar com rbd, mas não há nenhum cliente rbd instalado na imagem oficial do kube-controller-manager, portanto, você precisa usar uma imagem diferente.
Também deve ser observado que os volumes (pvc) criados como rbd só podem ser ReadWriteOnce (RWO) e, o que significa que você pode montar o volume criado SOMENTE em um coração.
Para que nosso cluster possa trabalhar com volumes ceph, precisamos:
em um cluster Ceph:
- criar conjunto de dados no cluster ceph
- criar um cliente e chave de acesso ao conjunto de dados
- obter ceph admin secret
Para que nosso cluster possa trabalhar com volumes ceph, precisamos:
em um cluster Ceph:
- criar conjunto de dados no cluster ceph
- criar um cliente e chave de acesso ao conjunto de dados
- obter ceph admin secret
no cluster Kubernetes:
- criar ceph admin secret e ceph client key
- instale o ceph rbd provisioner ou altere a imagem do kube-controller-manager para uma imagem que suporte rbd
- criar segredo com a chave do cliente ceph
- criar classe de armazenamento
- instalar ceph-common nas notas do trabalhador do kubernetes
Criando um pool de dados
No cluster ceph, crie um pool para os volumes kubernetes
ceph osd pool create kube 8 8
Aqui vou fazer uma pequena explicação, os números 8 8 no final são os números de pg e pgs. Esses valores dependem do tamanho do seu cluster ceph. Existem calculadoras especiais que calculam a quantidade de páginas e páginas, por exemplo, oficiais do ceph
Para começar, recomendo deixá-lo por padrão, se no futuro esse valor puder ser aumentado (só pode ser reduzido com a versão do Nautilus).
Criando um cliente para um conjunto de dados
Crie um cliente para o novo pool
ceph auth add client.kube mon 'allow r' osd 'allow rwx pool=kube'
Receberemos uma chave para o cliente, no futuro precisaremos dela para criar um kubernetes secreto
ceph auth get-key client.kube AQDd5aldka5KJRAAkpWTQYUMQi+5dfGDqSyxkg==
Obtendo a chave do administrador
E obtenha a chave de administrador
ceph auth get client.admin 2>&1 |grep "key = " |awk '{print $3'} AQAv+Itdx4DwKBAAKVhWRS3+eEPqV3Xrnlg9KA==
No cluster ceph, todo o trabalho está concluído e agora precisamos ir para uma máquina que tenha acesso ao cluster kubernetes
Trabalharei com o master01-test (10.73.71.25) do cluster implantado por mim na primeira publicação.
Criando um segredo do cliente
Crie um arquivo com o token do cliente que recebemos (não esqueça de substituí-lo pelo seu token)
echo AQDd5aldka5KJRAAkpWTQYUMQi+5dfGDqSyxkg== > /tmp/key.client
E crie um segredo que usaremos no futuro
kubectl create secret generic ceph-secret --from-file=/tmp/key.client --namespace=kube-system --type=kubernetes.io/rbd
Criar segredo do administrador
Crie um arquivo com token de administrador (não esqueça de substituí-lo pelo seu token)
echo AQAv+Itdx4DwKBAAKVhWRS3+eEPqV3Xrnlg9KA== > /tmp/key.admin
Depois disso, crie um segredo de administrador
kubectl create secret generic ceph-admin-secret --from-file=/tmp/key.admin --namespace=kube-system --type=kubernetes.io/rbd
Verifique se os segredos foram criados
kubectl get secret -n kube-system | grep ceph ceph-admin-secret kubernetes.io/rbd 1 8m31s ceph-secret kubernetes.io/rbd 1 7m32s
Método primeiro implantar ceph rbd provisioner
Nós clonamos o repositório kubernetes-incubator / external-storage do github, ele tem tudo o que você precisa para fazer o kubernetes agrupar amigos do repositório ceph.
git clone https://github.com/kubernetes-incubator/external-storage.git cd external-storage/ceph/rbd/deploy/ NAMESPACE=kube-system sed -r -i "s/namespace: [^ ]+/namespace: $NAMESPACE/g" ./rbac/clusterrolebinding.yaml ./rbac/rolebinding.yaml
kubectl -n $NAMESPACE apply -f ./rbac
Conclusão
clusterrole.rbac.authorization.k8s.io/rbd-provisioner created clusterrolebinding.rbac.authorization.k8s.io/rbd-provisioner created deployment.extensions/rbd-provisioner created role.rbac.authorization.k8s.io/rbd-provisioner created rolebinding.rbac.authorization.k8s.io/rbd-provisioner created serviceaccount/rbd-provisioner created
Método 2: Substitua a imagem do kube-controller-manager
Não há suporte rbd na imagem oficial do kube-controller-manager, portanto, precisaremos alterar a imagem do controller-manager.
Para fazer isso, em cada um dos assistentes do Kubernetes, você precisa editar o arquivo kube-controller-manager.yaml e substituir a imagem por gcr.io/google_containers/hyperkube:v1.15.2. Preste atenção na versão da imagem que deve corresponder à sua versão do cluster Kubernetes.
vim /etc/kubernetes/manifests/kube-controller-manager.yaml
Depois disso, você precisará reiniciar o kube-controller-manager
ubectl get pods -A | grep manager kube-system kube-controller-manager-master01-test 1/1 Running 0 5m54s kube-system kube-controller-manager-master02-test 1/1 Running 0 5m54s kube-system kube-controller-manager-master03-test 1/1 Running 9111 103d
Os pods devem ser atualizados automaticamente, mas, por algum motivo, isso não aconteceu, você pode recriá-los manualmente, através da exclusão.
kubectl delete pod -n kube-system kube-controller-manager-master01-test kubectl delete pod -n kube-system kube-controller-manager-master02-test kubectl delete pod -n kube-system kube-controller-manager-master03-test
Verifique se está tudo bem
kubectl describe pod -n kube-system kube-controller-manager-master02-test | grep Image: Image: gcr.io/google_containers/hyperkube:v1.15.2
-
Criando uma classe de armazenamento
Método um - se você usou o provisionador ceph.com/rbd
Crie um arquivo yaml com uma descrição da nossa classe de armazenamento. Além disso, todos os arquivos usados abaixo podem ser baixados no meu repositório no diretório ceph
cat <<EOF >./storage-class.yaml kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: ceph-rbd provisioner: ceph.com/rbd parameters: monitors: 10.73.88.52:6789, 10.73.88.53:6789, 10.73.88.54:6789 pool: kube adminId: admin adminSecretNamespace: kube-system adminSecretName: ceph-admin-secret userId: kube userSecretNamespace: kube-system userSecretName: ceph-secret imageFormat: "2" imageFeatures: layering EOF
E incorporá-lo em nosso cluster
kubectl apply -f storage-class.yaml
Verifique se está tudo bem
kubectl get sc NAME PROVISIONER AGE ceph-rbd ceph.com/rbd 7s
Método dois - se você usou o provisionador kubernetes.io/rbd
Criar classe de armazenamento
cat <<EOF >./storage-class-hyperkube.yaml kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: ceph-rbd provisioner: kubernetes.io/rbd allowVolumeExpansion: true parameters: monitors: 10.73.88.52:6789, 10.73.88.53:6789, 10.73.88.54:6789 pool: kube adminId: admin adminSecretNamespace: kube-system adminSecretName: ceph-admin-secret userId: kube userSecretNamespace: kube-system userSecretName: ceph-secret imageFormat: "2" imageFeatures: layering EOF
E incorporá-lo em nosso cluster
kubectl apply -f storage-class-hyperkube.yaml storageclass.storage.k8s.io/ceph-rbd created
Verifique se está tudo bem
kubectl get sc NAME PROVISIONER AGE ceph-rbd kubernetes.io/rbd 107s
Teste de ligamentos de Kubernetes + ceph
Antes de testar o ceph + kubernetes, você deve instalar o pacote ceph-common em TODOS os códigos de trabalho do cluster.
apt install curl apt-transport-https -y curl https://mirror.croit.io/keys/release.gpg > /usr/share/keyrings/croit-signing-key.gpg echo 'deb [signed-by=/usr/share/keyrings/croit-signing-key.gpg] https://mirror.croit.io/debian-mimic/ stretch main' > /etc/apt/sources.list.d/croit-ceph.list apt update apt install ceph-common
Crie um arquivo yaml PersistentVolumeClaim
cat <<EOF >./claim.yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: claim1 spec: accessModes: - ReadWriteOnce storageClassName: ceph-rbd resources: requests: storage: 1Gi EOF
Mate ele
kubectl apply -f claim.yaml
Verifique se PersistentVolumeClaim está criado.
bectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE claim1 Bound pvc-d1e47825-289c-4201-acb8-033e62a3fe81 1Gi RWO ceph-rbd 44m
E também criou automaticamente o PersistentVolume.
kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-d1e47825-289c-4201-acb8-033e62a3fe81 1Gi RWO Delete Bound default/claim1 ceph-rbd 37m
Vamos criar um pod de teste no qual incluímos o pvc criado no diretório / mnt. Execute este arquivo /mnt/test.txt com o texto "Hello World!"
cat <<EOF >./create-file-pod.yaml kind: Pod apiVersion: v1 metadata: name: create-file-pod spec: containers: - name: test-pod image: gcr.io/google_containers/busybox:1.24 command: - "/bin/sh" args: - "-c" - "echo Hello world! > /mnt/test.txt && exit 0 || exit 1" volumeMounts: - name: pvc mountPath: "/mnt" restartPolicy: "Never" volumes: - name: pvc persistentVolumeClaim: claimName: claim1 EOF
Vamos matá-lo e verificar se ele completou sua tarefa
kubectl apply -f create-file-pod.yaml kubectl get pods -w
Vamos esperar pelo status
create-file-pod 0/1 Completed 0 16s
Vamos criar outro, conecte nosso volume a ele, mas já em / mnt / test, e depois verifique se o arquivo criado pelo primeiro volume está no lugar
cat <<EOF >./test-pod.yaml kind: Pod apiVersion: v1 metadata: name: test-pod spec: containers: - name: test-pod image: gcr.io/google_containers/busybox:1.24 command: - "/bin/sh" args: - "-c" - "sleep 600" volumeMounts: - name: pvc mountPath: "/mnt/test" restartPolicy: "Never" volumes: - name: pvc persistentVolumeClaim: claimName: claim1 EOF
Execute o kubectl get po -w e aguarde até que o pod esteja em execução
Depois disso, vamos examinar e verificar se o volume está conectado e nosso arquivo no diretório / mnt / test
kubectl exec test-pod -ti sh cat /mnt/test/test.txt Helo world!
Obrigado por ler até o fim. Desculpe pelo atraso na postagem.
Estou pronto para responder a todas as perguntas em mensagens pessoais ou nas redes sociais indicadas no meu perfil.
Na próxima publicação pequena, mostrarei como implantar o armazenamento S3 com base no cluster ceph criado e, em seguida, de acordo com o plano da primeira publicação.
Materiais utilizados para publicação