Entendendo a Interface de Armazenamento de Contêiner (no Kubernetes e mais)

Nota perev. : Conversamos pela primeira vez sobre os chamados plug-ins de armazenamento Kubernetes (Out-of-Tree CSI Volume Plugins) em nossa análise da versão K8s 1.9 , onde esse recurso apareceu no status da versão alfa. O autor do novo material, Anoop Vijayan Maniankara (engenheiro líder de DevOps da empresa finlandesa Tuxera), reuniu informações importantes sobre as idéias e o dispositivo CSI, que ajuda a se familiarizar rapidamente com o novo conceito, que, segundo alguns de nossos funcionários, “será a próxima grande novidade”. Para um estudo mais detalhado e técnico da CSI, links úteis são fornecidos no final do artigo, entre os quais destacamos especialmente a apresentação de um dos autores desta especificação (Jie Yu). Mas vale a pena começar com o "quadro geral" de qualquer maneira ...



A CSI (Container Storage Interface) é uma iniciativa para unificar a interface de armazenamentos, como Ceph, Portworx, NetApp, etc., em sistemas de orquestração de contêineres: Kubernetes, Mesos, Docker Swarm, Cloud Foundry e outros. A idéia é que a implementação de um CSI pelo fabricante de armazenamento funcione com todos esses sistemas.


Fonte da imagem: Relatório Jie Yu CSI no CloudNativeCon EU 2018

Observe : este artigo fala apenas sobre provisionamento dinâmico. Volumes pré-configurados e flex volumes vão além de seu escopo. Se você quiser entender melhor o que será discutido, leia primeiro a documentação do Kubernetes . Além disso, o artigo não se aprofundará nos detalhes da implementação do CSI. Vou fornecer uma visão geral de alto nível do CSI e estabelecer as bases para a criação de um volume CSI. Por fim, as informações do Kubernetes são usadas para exemplos e links para detalhes.

Antes de mergulhar no tópico, também é importante saber o que são os contêineres laterais no Kubernetes. Eles expandem os recursos do contêiner principal ( principal ), existente no mesmo coração, compartilhando armazenamento e rede.

No momento da redação deste artigo (13 de agosto de 2018), os componentes CSI tinham as seguintes versões:



Antes da CSI


A primeira versão do CSI - v0.1 - ocorreu em dezembro de 2017. Obviamente, o provisionamento poderia ser feito para armazenamento externo em sistemas de orquestração antes mesmo de aparecer. No caso do Kubernetes, plugins de volume - os plugins de volume foram responsáveis ​​pelas necessidades de armazenamento:



Como você pode ver na figura acima, esses plug-ins fazem parte do núcleo do sistema de orquestração. Por esse motivo, ocorreram os seguintes problemas mencionados no documento de arquitetura CSI :

  • O desenvolvimento do plug-in de volume está intimamente relacionado e depende das versões do Kubernetes.
  • Os desenvolvedores / comunidade do Kubernetes são responsáveis ​​por testar e dar suporte a todos os plugins, em vez de apenas testar e manter uma API de plug-in estável;
  • os bugs nos plug-ins de volume podem eliminar não apenas o próprio plug-in, mas também componentes críticos do Kubernetes;
  • os plugins obtêm privilégios totais dos componentes do Kubernetes (kubelet e kube-controller-manager);
  • Os desenvolvedores de plug-ins são forçados a publicar o código-fonte do plug-in e não podem escolher o caminho dos binários.

Entendendo CSI


Apresentando o CSI, a equipe do Kubernetes lançou componentes externos que não fazem parte do kernel e foram projetados para interagir com outros componentes externos fornecidos pelos fabricantes. Eles se comunicam por meio de soquetes de domínio (soquetes de domínio UNIX - aprox. Transl.) Usando gRPC .



Componentes externos do Kubernetes


Eles são totalmente implementados e suportados pela equipe do Kubernetes e estendem as atividades do Kubernetes fora do Kubernetes. Os fabricantes não podem se preocupar com os recursos de sua implementação. Consistem em três partes:

  • O registrador de driver é um contêiner lateral que registra o driver CSI no kubelet e adiciona o driver NodeId ao rótulo do objeto do nó na API do Kubernetes. Para fazer isso, ele interage com o serviço de driver do Identity CSI (para obter mais detalhes, veja abaixo - aprox. Transl.) E chama GetNodeId no CSI;
  • Provedor externo - um contêiner lateral que monitora os objetos PersistentVolumeClaim na API Kubernetes e chama os DeleteVolume CreateVolume e CreateVolume para o driver do nó de extremidade;
  • O attacher externo é um contêiner lateral que monitora os objetos VolumeAttachment na API do Kubernetes e chama os comandos ControllerUnpublish e ControllerUnpublish para o driver do nó de extremidade.

Componente externo do fabricante de armazenamento / terceiros


Implementação específica do fornecedor. Cada fabricante implementa as APIs necessárias como parte das funções do serviço gRPC. Por exemplo, uma implementação de GCE PD ou Ceph , etc. Eles também consistem em três componentes:

  • Identidade CSI - principalmente para identificar um plugin: verifique se ele funciona, retorne informações básicas sobre o plugin;

     service Identity { //      rpc GetPluginInfo(GetPluginInfoRequest) returns (GetPluginInfoResponse) {} // ,       Controller rpc GetPluginCapabilities(GetPluginCapabilitiesRequest) returns (GetPluginCapabilitiesResponse) {} //   ,  ,    rpc Probe (ProbeRequest) returns (ProbeResponse) {} } 

    ( kubernetes-csi-identity.proto )
  • O CSI Controller é responsável por controlar e gerenciar volumes: criação, exclusão, anexar / desanexar, instantâneos, etc;

     service Controller { //  provisioning  rpc CreateVolume (CreateVolumeRequest) returns (CreateVolumeResponse) {} //     rpc DeleteVolume (DeleteVolumeRequest) returns (DeleteVolumeResponse) {} //       rpc ControllerPublishVolume (ControllerPublishVolumeRequest) returns (ControllerPublishVolumeResponse) {} //       rpc ControllerUnpublishVolume (ControllerUnpublishVolumeRequest) returns (ControllerUnpublishVolumeResponse) {} // ,     /    rpc ValidateVolumeCapabilities (ValidateVolumeCapabilitiesRequest) returns (ValidateVolumeCapabilitiesResponse) {} //     rpc ListVolumes (ListVolumesRequest) returns (ListVolumesResponse) {} //       rpc GetCapacity (GetCapacityRequest) returns (GetCapacityResponse) {} // ,      GetCapacity  Snapshotting rpc ControllerGetCapabilities (ControllerGetCapabilitiesRequest) returns (ControllerGetCapabilitiesResponse) {} //   rpc CreateSnapshot (CreateSnapshotRequest) returns (CreateSnapshotResponse) {} //   rpc DeleteSnapshot (DeleteSnapshotRequest) returns (DeleteSnapshotResponse) {} //    rpc ListSnapshots (ListSnapshotsRequest) returns (ListSnapshotsResponse) {} } 

    ( kubernetes-csi-controller.proto )
  • O nó CSI é responsável pelo monitoramento da atividade do volume no host Kubernetes.

     service Node { //     staging- rpc NodeStageVolume (NodeStageVolumeRequest) returns (NodeStageVolumeResponse) {} //    staging- rpc NodeUnstageVolume (NodeUnstageVolumeRequest) returns (NodeUnstageVolumeResponse) {} //    staging    rpc NodePublishVolume (NodePublishVolumeRequest) returns (NodePublishVolumeResponse) {} //      rpc NodeUnpublishVolume (NodeUnpublishVolumeRequest) returns (NodeUnpublishVolumeResponse) {} //    rpc NodeGetVolumeStats (NodeGetVolumeStatsRequest) returns (NodeGetVolumeStatsResponse) {} //   ID  rpc NodeGetId (NodeGetIdRequest) returns (NodeGetIdResponse) { option deprecated = true; } //   (capabilities)  rpc NodeGetCapabilities (NodeGetCapabilitiesRequest) returns (NodeGetCapabilitiesResponse) {} //   NodeGetId rpc NodeGetInfo (NodeGetInfoRequest) returns (NodeGetInfoResponse) {} } 

    ( kubernetes-csi-node.proto )

Conclusão


O advento do CSI trouxe uma vantagem óbvia aos sistemas de orquestração e aos fabricantes de armazenamento. Além disso, interfaces bem definidas ajudam a implementação e teste simples de CSI para desenvolvedores e futuros sistemas de orquestração. Se você decidir começar a implementar seu CSI depois de ler este artigo, o plugin Como Escrever um CSI (Container Storage Interface) da Fatih Arslan é um bom ponto de partida.

Referências


  1. Especificação CSI ;
  2. Contêineres laterais em Kubernetes ;
  3. Relatório CSI de Jie Yu no KubeCon EU: CloudNativeCon EU 2018 (e aqui está o vídeo desta apresentação - aprox. Transl.) ;
  4. Documento de arquitetura CSI
  5. Documentação atual sobre CSI do Kubernetes ;
  6. Documentação CSI obsoleta do Kubernetes .

PS do tradutor


Leia também em nosso blog:

Source: https://habr.com/ru/post/pt424211/


All Articles