Apresentando a versão alfa dos snapshots de volume no Kubernetes



Nota perev. : O artigo original foi publicado recentemente no blog Kubernetes e foi escrito por funcionários do Google e Huawei (Jing Xu, Xing Yang, Saad Ali), cujas atividades você certamente viu no GitHub do projeto, se você já se interessou pelos recursos e problemas do K8s relacionados a com armazenamento de dados. Os engenheiros falam sobre o objetivo dos instantâneos de volume, seus recursos atuais e os conceitos básicos de trabalhar com eles.

O Kubernetes v1.12 introduziu uma versão alfa do suporte para capturas instantâneas de volumes. Esse recurso permite criar e excluir instantâneos de volumes, bem como criar novos volumes a partir de instantâneos usando os meios "nativos" do sistema - por meio da API do Kubernetes.

O que é um instantâneo?


Muitos sistemas de armazenamento (como o Google Cloud Persistent Disks, o Amazon Elastic Block Storage e vários sistemas de armazenamento no local) oferecem a capacidade de criar um instantâneo ("instantâneo") para um volume persistente. Um instantâneo é uma cópia de um volume em um determinado momento. Ele pode ser usado para fornecer um novo volume (já preenchido com dados de uma captura instantânea) ou restaurar um volume existente para um estado anterior (que é apresentado em uma captura instantânea).

Por que adicionar instantâneos ao Kubernetes?


Uma poderosa abstração já está disponível no sistema de plug-in de volume Kubernetes, automatizando o provisionamento, conectando e montando os armazenamentos de blocos e arquivos.

O fornecimento de todos esses recursos faz parte dos objetivos de tolerância à carga de trabalho do Kubernetes: O Kubernetes visa criar um nível de abstração entre aplicativos que funcionam como sistemas distribuídos e clusters subjacentes, para que os aplicativos sejam independentes do cluster específico no qual estão executando, e a implantação do aplicativo não requer qualquer conhecimento específico de cluster.

O Kubernetes Storage SIG identificou as operações de captura instantânea como recursos críticos para uma variedade de cargas de trabalho com estado. Por exemplo, um administrador de banco de dados pode querer capturar instantâneos seu banco de dados antes de executar qualquer operação nele.

Ao obter a API do Kubernetes como uma maneira padrão de chamar operações de captura instantânea, os usuários do Kubernetes podem trabalhar com eles sem a necessidade de soluções alternativas (e chamada manual de operações específicas para o sistema de armazenamento). Em vez disso, os usuários tiveram a oportunidade de incorporar operações de captura instantânea em suas ferramentas e políticas com o entendimento calmo de que tudo funcionará com qualquer cluster do Kubernetes, independentemente do armazenamento subjacente.

Além disso, essas primitivas do Kubernetes funcionam como blocos de construção básicos, abrindo caminho para o desenvolvimento de recursos mais avançados de nível corporativo para gerenciamento de armazenamento - por exemplo, para proteção, replicação e migração de dados.

Quais plug-ins de volume suportam instantâneos no Kubernetes?


O Kubernetes suporta três tipos de plugins de volume: in-tree, Flex e CSI. Consulte as Perguntas frequentes sobre o plug-in de volume Kubernetes para obter detalhes.

As capturas instantâneas são suportadas apenas para drivers CSI (não são suportadas na árvore ou no Flex). Para tirar proveito desse recurso, verifique se o driver CSI que implementa o suporte à captura instantânea está implantado no cluster Kubernetes.

Até o momento desta publicação no blog (9 de outubro de 2018 - aprox. Transl. ) , Os snapshots são suportados pelos seguintes drivers CSI:


O suporte para snapshots para outros drivers está em desenvolvimento e deve estar disponível em breve. Mais detalhes sobre o CSI e como implantar drivers CSI estão descritos na publicação “ Interface de armazenamento em contêiner (CSI) para o Kubernetes Goes Beta(e também veja nossa tradução da nota “ Entendendo a interface de armazenamento em contêiner (no Kubernetes e mais) ” - aprox. Transl. ) .

API Kubernetes para capturas instantâneas


Para gerenciar snapshots, o Kubernetes Volume Snapshots apresenta três novos objetos de API da mesma maneira que na API Kubernetes Persistent Volumes:

  • VolumeSnapshot
    • Criado pelo usuário do Kubernetes para solicitar uma captura instantânea para o volume especificado. Contém informações sobre a operação de captura instantânea, como o registro de data e hora para remoção de captura instantânea e se está pronta para uso.
    • Como o objeto PersistentVolumeClaim , criar e excluir esse objeto representa o desejo do usuário de criar ou excluir um recurso de cluster (captura instantânea).
  • VolumeSnapshotContent
    • Criado pelo driver CSI quando o instantâneo foi criado com sucesso. Contém informações sobre o instantâneo, incluindo seu ID.
    • Como um objeto PersistentVolume , ele representa um recurso já atendido pelo cluster (captura instantânea).
    • Como os objetos PersistentVolume e PersistentVolume , quando um instantâneo é criado, o objeto VolumeSnapshotContent anexado ao VolumeSnapshot para o qual foi criado (o mapeamento individual é usado).
  • VolumeSnapshotClass
    • Definido pelos administradores de cluster para descrever quais capturas instantâneas podem ser criadas. Inclui informações do motorista, segredos para acessar instantâneos, etc.

É importante observar que - diferentemente dos principais objetos de Volume Persistente no Kubernetes - esses objetos de snap shot são definidos como CustomResourceDefinitions (CRDs) . O projeto Kubernetes está se afastando gradualmente dos tipos de recursos predefinidos no API Server, aproximando-se de um modelo no qual o API Server é independente dos objetos da API. Essa abordagem permite reutilizar o servidor API em outros projetos (além do Kubernetes), e os consumidores (como o Kubernetes) podem definir os tipos de recursos necessários como CRD.

Os drivers CSI que suportam instantâneos instalam automaticamente os CRDs necessários. Os usuários finais do Kubernetes precisam apenas verificar se o driver CSI que suporta snapshots está implantado no cluster.

Além desses novos objetos, o PersistentVolumeClaim existente PersistentVolumeClaim um novo campo DataSource :

 type PersistentVolumeClaimSpec struct { AccessModes []PersistentVolumeAccessMode Selector *metav1.LabelSelector Resources ResourceRequirements VolumeName string StorageClassName *string VolumeMode *PersistentVolumeMode DataSource *TypedLocalObjectReference } 

Este campo (no status da versão alfa) permite preenchê-lo automaticamente com dados de uma captura instantânea existente ao criar um novo volume.

Requisitos de instantâneo do Kubernetes


Antes de usar instantâneos de volume no Kubernetes, você deve:

  • verifique se o driver CSI que implementa capturas instantâneas está implementado e em execução no cluster;
  • ative a função de captura instantânea de volume do Kubernetes através do novo portão de recurso (desativado por padrão na versão alfa):
    • defina o seguinte sinalizador para o --feature-gates=VolumeSnapshotDataSource=true servidor de API: --feature-gates=VolumeSnapshotDataSource=true

Antes de criar um instantâneo, você também deve determinar qual driver CSI usar, o que é feito criando um objeto VolumeSnapshotClass e especificando o driver CSI no campo snapshotter . No exemplo VolumeSnapshotClass abaixo, esse driver é com.example.csi-driver . Cada provedor de captura instantânea requer pelo menos um objeto VolumeSnapshotClass . Também é possível definir um VolumeSnapshotClass padrão para cada driver CSI - isso é feito configurando a anotação snapshot.storage.kubernetes.io/is-default-class: "true" na definição de classe:

 apiVersion: snapshot.storage.k8s.io/v1alpha1 kind: VolumeSnapshotClass metadata: name: default-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" snapshotter: com.example.csi-driver apiVersion: snapshot.storage.k8s.io/v1alpha1 kind: VolumeSnapshotClass metadata: name: csi-snapclass snapshotter: com.example.csi-driver parameters: fakeSnapshotOption: foo csiSnapshotterSecretName: csi-secret csiSnapshotterSecretNamespace: csi-namespace 

Todos os parâmetros necessários devem ser definidos de acordo com a documentação do driver CSI. No exemplo acima, o parâmetro fakeSnapshotOption: foo e todos os segredos mencionados serão transmitidos ao driver CSI durante a criação e remoção do instantâneo. O CSI external-snapshotter, por padrão, salva as chaves de parâmetro csiSnapshotterSecretNamespace e csiSnapshotterSecretNamespace .

Por fim, antes de criar um instantâneo, você deve criar o volume através do driver CSI e preenchê-lo com os dados que deseja ver lá (consulte esta publicação para obter detalhes sobre como usar volumes CSI).

Criando um novo instantâneo no Kubernetes


Depois que o objeto VolumeSnapshotClass definido e for o volume do qual você deseja remover o instantâneo, você poderá executar esta operação criando o objeto VolumeSnapshot .

A origem do instantâneo é determinada por dois parâmetros:

  • kind - PersistentVolumeClaim indicado aqui;
  • name - o nome real do objeto PVC.

Entende-se que o espaço para nome do volume para o qual a captura instantânea é criada é determinado pelo espaço para nome do objeto VolumeSnapshot .

 apiVersion: snapshot.storage.k8s.io/v1alpha1 kind: VolumeSnapshot metadata: name: new-snapshot-demo namespace: demo-namespace spec: snapshotClassName: csi-snapclass source: name: mypvc kind: PersistentVolumeClaim 

A especificação VolumeSnapshot pode VolumeSnapshot um VolumeSnapshotClass que contém informações sobre qual driver CSI será usado para criar a captura instantânea. Conforme relatado anteriormente, após a criação do objeto VolumeSnapshot o parâmetro fakeSnapshotOption: foo e todos os segredos mencionados VolumeSnapshotClass são transmitidos para o plug com.example.csi-driver in CSI com.example.csi-driver na chamada CreateSnapshot .

Em resposta a essa solicitação, o driver CSI tira um instantâneo do volume e cria automaticamente um objeto VolumeSnapshotContent que representa o novo instantâneo e vincula esse objeto ao VolumeSnapshot , preparando-o para o uso. Se o driver CSI não puder criar um instantâneo e retornar um erro, o controlador de instantâneo VolumeSnapshot esse erro no status do objeto VolumeSnapshot e não fará novas tentativas (esse comportamento é diferente de outros controladores no Kubernetes - ele é implementado para não criar um instantâneo em horários imprevisíveis) .

Se a classe de captura instantânea não for especificada, o external-snapshotter tentará encontrar a classe padrão e utilizá-la para a captura instantânea criada. Nesse caso, o driver CSI apontado pelo snapshotter na classe padrão deve corresponder ao driver CSI apontado pelo provisioner na classe de armazenamento PVC.

Observe que a liberação alfa de instantâneos para o Kubernetes não fornece uma garantia de consistência. Para garantir dados completos em um instantâneo, é necessário preparar adequadamente o aplicativo (pare o aplicativo, congele o sistema de arquivos etc.) antes de removê-lo.

Para VolumeSnapshot o objeto VolumeSnapshot criado e associado ao VolumeSnapshotContent , você pode usar o kubectl describe volumesnapshot :

  • Ready deve ser true em Status , o que indicará que o instantâneo do volume está pronto para uso.
  • O campo Creation Time mostra quando o instantâneo foi realmente tirado.
  • O campo Restore Size é o tamanho mínimo do volume para restaurar uma captura instantânea.
  • O campo Snapshot Content Name da VolumeSnapshotContent Snapshot Content Name na especificação aponta para o objeto VolumeSnapshotContent criado para esta captura instantânea.

Importar um instantâneo existente para o Kubernetes


Um instantâneo existente pode ser importado para o Kubernetes criando manualmente um objeto VolumeSnapshotContent que representará esse instantâneo. Como VolumeSnapshotContent é um objeto de API que não está vinculado a um espaço para nome, apenas o administrador do sistema tem o direito de criá-lo.

Quando o objeto VolumeSnapshotContent criado, o usuário pode criar outro objeto - VolumeSnapshot - que apontará para ele. O controlador external-snapshotter marcará o snapshot como pronto após verificar a existência e a conexão correta entre os VolumeSnapshotContent e VolumeSnapshotContent . Um instantâneo está pronto para uso no Kubernetes quando essa conexão é estabelecida.

O objeto VolumeSnapshotContent deve ser criado com os seguintes campos que representam a captura instantânea pré-provisionada :

  • csiVolumeSnapshotSource - informações que identificam um instantâneo:
    • snapshotHandle - nome / identificador para o instantâneo. Campo obrigatório;
    • driver - O driver CSI costumava trabalhar com este volume. Campo obrigatório. Deve corresponder ao nome do snapshotter no controlador (controlador de snapshot);
    • creationTime e restoreSize - para volumes pré-provisionados, esses campos são opcionais. O controlador de snapshotter externo os atualizará automaticamente após a criação de um snapshot.
  • volumeSnapshotRef - ponteiro para o objeto VolumeSnapshot ao qual esse objeto (ou seja, VolumeSnapshotContent ) deve ser anexado:
    • name e namespace - o nome e o espaço para nome do objeto VolumeSnapshot cujo conteúdo está vinculado;
    • UID - campo opcional (para volumes pré-preparados). O controlador external-snapshotter atualizará automaticamente este campo após a ligação. Se o usuário definir esse campo, você precisará garantir que ele corresponda ao UID da captura instantânea para a qual a ligação ocorre. Se não houver essa correspondência, o conteúdo será considerado irrelevante (objeto órfão) e, portanto, o controlador excluirá ele e o instantâneo associado.
  • snapshotClassName é um campo opcional. O controlador de snapshotter externo o atualizará automaticamente após a ligação.

 apiVersion: snapshot.storage.k8s.io/v1alpha1 kind: VolumeSnapshotContent metadata: name: static-snapshot-content spec: csiVolumeSnapshotSource: driver: com.example.csi-driver snapshotHandle: snapshotcontent-example-id volumeSnapshotRef: kind: VolumeSnapshot name: static-snapshot-demo namespace: demo-namespace 

Um objeto VolumeSnapshot deve ser criado para que o usuário possa trabalhar com a captura instantânea. Nele:

  • snapshotClassName - nome da classe de captura instantânea do volume. Campo opcional. Se definido, o campo de snapshotter na classe de instantâneo deve corresponder ao nome do controlador de instantâneo. Se não definido, o controlador procurará a classe de instantâneo padrão;
  • snapshotContentName - o nome do conteúdo do volume da captura instantânea. Campo obrigatório para volumes pré-preparados.

 apiVersion: snapshot.storage.k8s.io/v1alpha1 kind: VolumeSnapshot metadata: name: static-snapshot-demo namespace: demo-namespace spec: snapshotClassName: csi-snapclass snapshotContentName: static-snapshot-content 

Quando esses objetos são criados, o controlador de captura instantânea os vincula, defina o campo Ready (em Status ) como True , indicando que a captura instantânea está pronta para uso.

Preparando um novo volume a partir da captura instantânea no Kubernetes


Para criar um novo volume pré-preenchido com dados do objeto de captura instantânea, use o novo campo dataSource em PersistentVolumeClaim . Possui três parâmetros:

  • name - nome do objeto VolumeSnapshot representa a origem da captura instantânea;
  • kind - deve ser definido como VolumeSnapshot ;
  • apiGroup - deve ser snapshot.storage.k8s.io .

Supõe-se que o espaço para nome da fonte - VolumeSnapshot - corresponda ao espaço para nome do PersistentVolumeClaim .

 apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-restore Namespace: demo-namespace spec: storageClassName: csi-storageclass dataSource: name: new-snapshot-demo kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 1Gi 

Quando o objeto PersistentVolumeClaim é criado, ele chama o provisionamento do novo volume, preenchido previamente com dados da captura instantânea especificada.

Como adicionar suporte a instantâneos ao meu driver CSI se eu sou um desenvolvedor de armazenamento?


Para fornecer suporte para capturas instantâneas, recursos adicionais do controlador devem ser adicionados ao driver CSI: CREATE_DELETE_SNAPSHOT e LIST_SNAPSHOTS , além de controladores RPC adicionais: CreateSnapshot , DeleteSnapshot , ListSnapshots . Veja a especificação CSI para detalhes.

Embora o Kubernetes forneça as diretrizes mais básicas para empacotar e implantar o CSI Volume Driver, existe um mecanismo recomendado para implantar um driver CSI em contêiner arbitrário no Kubernetes para simplificar esse processo.

Como parte do processo de implantação recomendado, a equipe do Kubernetes sugere o uso de uma variedade de contêineres secundários (ou seja, auxiliares), incluindo um contêiner lateral com um snapshotter externo .

O external-snapshotter mencionado monitora os objetos VolumeSnapshotContent e VolumeSnapshotContent no API Server, chamando as DeleteSnapshot e DeleteSnapshot para o terminal CSI. O contêiner lateral com o provedor externo CSI também foi atualizado para oferecer suporte à recuperação de volume de capturas instantâneas usando o novo campo PVC dataSource .

Para oferecer suporte aos recursos de captura instantânea, recomenda-se aos fabricantes de armazenamento implantar contêineres laterais com um instantâneo externo, além de um provisionador externo, e colocar o driver CSI em um StatefulSet , como mostra o diagrama abaixo:



Neste exemplo de implantação, existem dois contêineres laterais, um provisionador externo e um snapshotter externo, e os drivers CSI são implantados com o plug-in do caminho do host CSI no pod StatefulSet. O caminho do host CSI é um plug-in de exemplo que não se destina ao uso em produção.

Quais são as limitações da versão alfa?


A versão alfa da implementação de instantâneo no Kubernetes tem as seguintes limitações:

  • A reversão de um volume existente para um estado anterior representado por uma captura instantânea não é suportada (apenas o provisionamento de um novo volume a partir de uma captura instantânea é suportado).
  • A restauração no local não é suportada para PersistentVolumeClaim existente a partir da captura instantânea: o provisionamento de um novo volume a partir do snapshot funciona, mas não atualiza o PersistentVolumeClaim existente para que aponte para um novo volume e o PVC volte para um estado anterior (apenas é suportado um novo volume criado a partir de um snapshot através de um novo PV / PVC).
  • As garantias para a consistência das capturas instantâneas não vão além das garantias fornecidas pelo sistema de armazenamento (por exemplo, integridade quando descartada).

O que vem a seguir?


A equipe do Kubernetes planeja levar a implementação de snapshots para CSI para a versão beta nas versões 1.13 ou 1.14, dependendo do feedback recebido e da adaptação da tecnologia.

Como descobrir mais detalhes?


Consulte a documentação adicional da captura instantânea em k8s.io/docs/concepts/storage/volume-snapshots e kubernetes-csi.imtqy.com/docs .

PS do tradutor


Leia também em nosso blog:

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


All Articles