Rook — um armazenamento de dados "autossuficiente" para Kubernetes

Rook — um armazenamento de dados "autossuficiente" para Kubernetes

Em 29 de janeiro, o comitê técnico da organização CNCF (Cloud Native Computing Foundation), responsável por Kubernetes, Prometheus e outros produtos Open Source do mundo dos containers e cloud native, anunciou aprova o projeto Rook em seu grupo. Uma ótima oportunidade para conhecer melhor este "orquestrador de sistemas de armazenamento de dados distribuídos no Kubernetes".

O que é o Rook?

Rook — é um software escrito em Go (é distribuído sobre a licença Apache License 2.0), destinado a dotar os armazenamentos de dados com funções automatizadas que os tornam autogerenciáveis, autoescaláveis e autorrecuperáveis. Para isso, o Rook automatiza (para os armazenamentos de dados utilizados no ambiente Kubernetes): implantação, inicialização, configuração, provisionamento, escalonamento, atualizações, migrações, recuperação de falhas, monitoramento e gerenciamento de recursos.

O projeto está em fase alfa e se especializa na orquestração do sistema de armazenamento distribuído Ceph nos clusters Kubernetes. Os autores também afirmam planos para suportar outros sistemas de armazenamento, mas isso não ocorrerá nas versões mais próximas.

Componentes e estrutura técnica

A base do funcionamento do Rook dentro do Kubernetes é um operador especial (falamos mais sobre Kubernetes Operators em este artigo), que automatiza a configuração do armazenamento e implementa seu monitoramento.

Então, o operador Rook é apresentado como um container que contém tudo o que é necessário para a implantação e manutenção subsequente do armazenamento. Entre as responsabilidades do operador estão:

  • criação de um DaemonSet para os demônios de armazenamento Ceph (ceph-osd) com um cluster RADOS simples;
  • criação de pods para monitoramento do Ceph (com ceph-mon, que verificam o estado do cluster; para um quórum, na maioria dos casos, são implantadas três instâncias, e se qualquer uma delas falha, uma nova é levantada);
  • gerenciamento de CRDs (Custom Resource Definitions) para o próprio cluster, pools de armazenamento, object stores (conjuntos de recursos e serviços para atender solicitações HTTP, que executam PUT/GET para objetos, — eles são compatíveis com S3 e Swift API), além de sistemas de arquivos;
  • inicialização de pods para executar todos os serviços necessários;
  • criação de agentes Rook.

Os agentes Rook são apresentados como pods separados, que são implantados em cada nó do Kubernetes. A finalidade do agente é configurar o plugin FlexVolume, que fornece suporte para volumes de armazenamento no Kubernetes. O agente gerencia o armazenamento: conecta dispositivos de armazenamento em rede, monta volumes, formata o sistema de arquivos, etc.

Rook — um armazenamento de dados "autossuficiente" para Kubernetes
O lugar e o papel dos componentes Rook no esquema geral do cluster Kubernetes

O Rook oferece três tipos de armazenamento:

  1. armazenamento em bloco (Block, StorageClass) — monta o armazenamento a um único pod;
  2. armazenamento de objeto (Object, ObjectStore) — disponível dentro e fora do cluster Kubernetes (via API S3);
  3. sistema de arquivos compartilhado (Shared File System, Filesystem) — sistema de arquivos que pode ser montado como leitura e escrita por múltiplos pods.

O dispositivo interno do Rook inclui:

  • Mons — pods para monitorar o Ceph (com os já mencionados ceph-mon);
  • OSDs — pods com demônios ceph-osd (Demônios de Armazenamento de Objetos);
  • MGR — pods com o demônio ceph-mgr (Ceph Manager), que fornece funcionalidades adicionais de monitoramento e interfaces para sistemas externos (monitoramento/gestão);
  • RGW (opcional) — pods com armazenamento de objeto;
  • MDS (opcional) — pods com sistema de arquivos compartilhado.

Rook — um armazenamento de dados "autossuficiente" para Kubernetes

Todos os demônios do Rook (Mons, OSDs, MGR, RGW, MDS) são compilados em um único binário (rook), executado em um contêiner.

Para uma breve apresentação do projeto Rook, também pode ser útil este pequeno (12 slides) apresentação de Bassam Tabbara (CTO da Quantum Corp).

Operação do Rook

O operador Rook oferece suporte total ao Kubernetes na versão 1.6 e superior (e, parcialmente, a versão mais antiga do K8s — 1.5.2). Sua instalação em em um cenário simples é assim:

cd cluster/examples/kubernetes
kubectl create -f rook-operator.yaml
kubectl create -f rook-cluster.yaml

Além disso, para o operador Rook, foi preparado um Helm chart, permitindo que a instalação possa ser realizada também dessa maneira:

helm repo add rook-alpha https://charts.rook.io/alpha
helm install rook-alpha/rook

Há um pequeno número de opções de configuração (por exemplo, você pode desativar o suporte a RBAC, se essa funcionalidade não for utilizada no seu cluster), que são passadas ao helm install através do parâmetro --set key=value[,key=value] (ou armazenar em um arquivo YAML separado e passar — através de -f values.yaml).

Após a instalação do operador Rook e a execução dos pods com seus agentes, resta criar o próprio cluster Rook, cuja configuração mais simples é a seguinte (rook-cluster.yaml):

apiVersion: v1
kind: Namespace
metadata:
  name: rook
---
apiVersion: rook.io/v1alpha1
kind: Cluster
metadata:
  name: rook
  namespace: rook
spec:
  dataDirHostPath: /var/lib/rook
  storage:
    useAllNodes: true
    useAllDevices: false
    storeConfig:
      storeType: bluestore
      databaseSizeMB: 1024
      journalSizeMB: 1024

Nota: deve-se prestar atenção especial ao atributo dataDirHostPath, cujo valor correto é necessário para manter o cluster após reinicializações. Para casos de uso como um local de armazenamento permanente de dados, os autores do Rook recomendam ter pelo menos 5 GB de espaço livre em disco neste diretório nos hosts Kubernetes.

Resta criar o cluster a partir da configuração e garantir que os pods foram criados no cluster (no namespace rook):

kubectl create -f rook-cluster.yaml
kubectl -n rook get pod
NOME                              PRONTO     STATUS    REINICIAÇÕES   IDADE
rook-api-1511082791-7qs0m         1/1       Em Execução   0          5m
rook-ceph-mgr0-1279756402-wc4vt   1/1       Em Execução   0          5m
rook-ceph-mon0-jflt5              1/1       Em Execução   0          6m
rook-ceph-mon1-wkc8p              1/1       Em Execução   0          6m
rook-ceph-mon2-p31dj              1/1       Em Execução   0          6m
rook-ceph-osd-0h6nb               1/1       Em Execução   0          5m

Atualização do cluster Rook (para uma nova versão) é um procedimento que neste estágio requer a atualização sequencial de todos os seus componentes em uma ordem específica, e pode ser iniciado apenas depois de garantir que a instalação atual do Rook está em estado completamente 'saudável'. Um guia passo a passo detalhado usando a atualização do Rook da versão 0.5.0 para 0.5.1 pode ser encontrado na documentação do projeto.

Em novembro do ano passado, no blog do Rook foi publicada uma comparação de desempenho com EBS. Os resultados merecem atenção e, em resumo, são os seguintes:

Rook — um armazenamento de dados "autossuficiente" para Kubernetes
Rook — um armazenamento de dados "autossuficiente" para Kubernetes

Perspectivas

O status atual do Rook é alpha, e o último grande lançamento até o momento é a versão 0.6, lançada em novembro de 2017 (a correção atual é v0.6.2 — lançada em 14 de dezembro). Já na primeira metade de 2018, são esperados lançamentos de versões mais maduras: betas e estáveis (oficialmente prontas para uso em produção).

De acordo com roadmap do projeto, os desenvolvedores têm uma visão detalhada sobre o desenvolvimento do Rook, pelo menos em dois lançamentos próximos: 0.7 (sua prontidão no rastreador do GitHub é avaliada como 60%) e 0.8. Entre as mudanças esperadas estão a transição do suporte a Ceph Block e Ceph Object para o status beta, provisionamento dinâmico de volumes para CephFS, um sistema de logging avançado, atualizações automatizadas do cluster, suporte a snapshots para volumes.

A aceitação do Rook entre os projetos CNCF ainda está em uma fase inicial — 'inception-level', — ao lado de linkerd e CoreDNS) é uma garantia única do crescente interesse pelo produto. O quanto ele se consolidará no mundo das aplicações em nuvem ficará mais claro após o lançamento de versões estáveis, que certamente trarão novos 'testadores' e usuários para o Rook.

P.S.

Confira também em nosso blog:

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster