Este blog mostrará como criar contêineres com estado no Kubernetes usando o Amazon EBS. O Couchbase Server é um contêiner com estado. Isso significa que o estado do contêiner precisa ser carregado com ele. No Kubernetes, a menor unidade atômica de execução
um contêiner é um pod. Portanto, um contêiner do Couchbase Server será executado como um pod. E, por padrão, todos os dados armazenados no Couchbase Server são armazenados no mesmo host.
stateful containers

Esse número é explicado originalmente em Cluster do Kubernetes na Amazon e exposição do serviço Couchbase. Além disso, essa figura mostra o armazenamento local do host.
Os pods são efêmeros e podem ser reiniciados em um host diferente. A Volume do Kubernetes sobrevive a todos os contêineres que são executados no pod, e os dados são preservados durante as reinicializações do contêiner. No entanto
o volume deixará de existir quando um pod deixar de existir. Isso é resolvido pelos Volumes Persistentes, que fornecem armazenamento persistente e com escopo de cluster para aplicativos que exigem dados de longa duração.

Criar e usar um volume persistente é um processo de três etapas:
  1. Provisão: O administrador provisiona um armazenamento em rede no cluster, como volumes do AWS ElasticBlockStore. Isso é chamado de PersistentVolume.
  2. Solicitar armazenamento: O usuário solicita armazenamento para pods usando reivindicações. As reivindicações podem especificar níveis de recursos (CPU e memória), tamanhos específicos e modos de acesso (por exemplo, pode ser montado uma vez para leitura/gravação ou várias vezes somente para gravação).
    Isso é chamado de PersistentVolumeClaim.
  3. Usar reivindicação: As reivindicações são montadas como volumes e usadas em pods para armazenamento.

Especificamente, este blog mostrará como usar um AWS ElasticBlockStore como PersistentVolume, crie um PersistentVolumeClaime, em seguida, reivindicá-lo em uma cápsula.

stateful containers

O código-fonte completo deste blog está em: github.com/arun-gupta/couchbase-kubernetes.

Provisionamento do AWS Elastic Block Storage

Seguindo restrições precisam ser atendidas se o Amazon ElasticBlockStorage for usado como um PersistentVolume com o Kubernetes:

  • os nós nos quais os pods estão sendo executados devem ser instâncias do AWS EC2
  • essas instâncias precisam estar na mesma região e zona de disponibilidade que o volume EBS
  • O EBS suporta apenas uma única instância do EC2 montando um volume

Crie um AWS Elastic Block Storage:

A região us-west-2 região e us-west-2a é usada aqui. Portanto, o cluster do Kubernetes precisa ser iniciado
na mesma região e zona de disponibilidade também. Isso mostra a saída como:

Verifique se o volume está disponível como:

Ele mostra a saída como:

Observe o identificador exclusivo do volume em VolumeId atributo. Você também pode verificar o bloco EBS no Console do AWS:

kubernetes-pv-couchbase-amazon-ebs

Iniciar o cluster do Kubernetes

Baixar Kubernetes 1.3.3, descompacte-o e inicie o cluster na Amazon:

Três pontos a serem observados aqui:

  • A zona na qual o cluster é iniciado é explicitamente definida como us-west-1a. Isso corresponde à zona em que o volume de armazenamento do EBS foi criado.
  • Por padrão, o tamanho de cada nó é m3.medium. Aqui ele está definido como m3.large.
  • Por padrão, são criados 1 nó mestre e 4 nós de trabalho. Aqui, apenas 3 nós de trabalho são criados.

Isso mostrará a saída como:

Leia mais detalhes sobre como iniciar um Cluster Kubernetes na Amazon.

Pod do servidor Couchbase sem armazenamento persistente

Vamos criar um pod do Couchbase Server sem armazenamento persistente. Isso significa que, se o pod for reprogramado em um host diferente, ele não terá acesso aos dados criados nele. Aqui estão as etapas rápidas para executar um pod do Couchbase Server e
expô-lo fora do cluster:

Leia mais detalhes em Cluster Kubernetes na Amazon. O último comando mostra o endereço do balanceador de carga de entrada. Acesse o Console da Web do Couchbase Server em :8091.

kubernetes-pv-couchbase-amazon-elb

Faça login no console usando Administrador login e senha senha. A página principal do Console da Web do Couchbase Server é exibida:

 kubernetes-pv-couchbase-amazon-web-console-

Um padrão amostra de viagem já foi criado pelo arungupta/couchbase imagem. Esse balde é mostrado no Compartimentos de dados guia:

kubernetes-pv-couchbase-amazon-databucket

Clique em Criar novo bucket de dados para criar um novo bucket de dados. Dê um nome a ele k8s, assuma todos os padrões e clique em Criar para criar o bucket:

kubernetes-pv-couchbase-amazon-k8s-bucket

O bucket criado é mostrado no Compartimentos de dados guia:

kubernetes-pv-couchbase-amazon-k8s-bucket-created

Verificar o status do pod:

Excluir o pod:

Veja o novo pod sendo criado:

Acesse o Console da Web novamente e veja que o bucket não existe:

kubernetes-pv-couchbase-amazon-k8s-bucket-gone

Vamos limpar os recursos criados:

Pod do Couchbase Server com armazenamento persistente

Agora, vamos expor um pod do Couchbase Server com armazenamento persistente. Conforme discutido acima, vamos criar um pod PersistentVolume e reivindicar o volume.

Solicitar armazenamento

Como qualquer outro recurso do Kubernetes, um volume persistente é criado usando um arquivo de descrição de recurso:

As informações importantes aqui são:

  • Criação de um armazenamento de 5 GB
  • O armazenamento pode ser montado por apenas um nó para leitura/gravação
  • especifica o ID do volume criado anteriormente

Leia mais detalhes sobre a definição desse arquivo em kubernetes.io/docs/user-guide/persistent-volumes/. Esse arquivo está disponível em: github.com/arun-gupta/couchbase-kubernetes/blob/master/pv/couchbase-pv.yml.
O volume em si pode ser criado como:

e mostra a saída:

Usar reivindicação

A PersistentVolumeClaim pode ser criado usando esse arquivo de recurso:

Em nosso caso, tanto o PersistentVolume quanto o PersistentVolumeClaim têm 5 GB, mas não precisam ter. Leia mais detalhes sobre a definição desse arquivo em kubernetes.io/docs/user-guide/persistent-volumes/#persistentvolumeclaims.
Esse arquivo está em github.com/arun-gupta/couchbase-kubernetes/blob/master/pv/couchbase-pvc.yml. A reivindicação pode ser criada como:

e mostra a saída:

Criar RC com reivindicação de volume persistente

Crie um controlador de replicação do Couchbase usando esse arquivo de recurso:

As partes principais aqui são:

  • O recurso define um controlador de replicação usando arungupta/couchbase Imagem do Docker
  • volumeMounts definem quais volumes serão montados. /opt/couchbase/var é o diretório em que o Couchbase Server armazena todos os dados.
  • volumes definir diferentes volumes que podem ser usados nessa definição de RC

Crie o RC como:

e mostra a saída:

Verificar se há pod como kubectl.sh get -w po para ver:

Expor o RC como um serviço:

Obtenha todos os serviços:

Descreva o serviço como kubectl.sh describe svc couchbase para ver:

Aguarde cerca de 3 minutos para que o balanceador de carga se estabeleça. Acesse o console da Web do servidor Couchbase em :8091. Mais uma vez, apenas amostra de viagem existe. Ele é criado por arungupta/couchbase imagem usada na definição de RC.

Mostrar contêineres com estado

Vamos criar um novo bucket. Dê a ele um nome kubernetes-pv, assuma todos os padrões e clique no botão Create (Criar) para criar o bucket.

kubernetes-pv-couchbase-amazon-kubernetes-pv-bucket

O balde agora é exibido no console:

kubernetes-pv-couchbase-amazon-kubernetes-pv-bucket-created

Encerre o pod do Couchbase Server e veja o estado sendo restaurado. Obtenha os pods novamente:

Excluir o pod:

O pod é recriado:

E agora, quando você acessa o Console da Web do Couchbase, o bucket criado anteriormente ainda existe:

kubernetes-pv-couchbase-amazon-kubernetes-pv-bucket-still-there

Isso ocorre porque os dados foram armazenados no armazenamento de backup do EBS.

Limpar o cluster do Kubernetes

Desligar o cluster do Kubernetes:

E desconecte o volume:

O código-fonte completo deste blog está em: github.com/arun-gupta/couchbase-kubernetes.

Aproveite!

Autor

Postado por Arun Gupta, vice-presidente de defesa do desenvolvedor, Couchbase

Arun Gupta é o vice-presidente de defesa do desenvolvedor na Couchbase. Ele criou e liderou comunidades de desenvolvedores por mais de 10 anos na Sun, Oracle e Red Hat. Ele tem grande experiência na liderança de equipes multifuncionais para desenvolver e executar estratégias, planejamento e execução de conteúdo, campanhas de marketing e programas. Antes disso, liderou equipes de engenharia na Sun e é membro fundador da equipe Java EE. Gupta é autor de mais de 2.000 postagens em blogs sobre tecnologia. Ele tem uma vasta experiência em palestras em mais de 40 países sobre diversos tópicos e é um JavaOne Rock Star há três anos consecutivos. Gupta também fundou o capítulo Devoxx4Kids nos EUA e continua a promover a educação tecnológica entre as crianças. Autor de vários livros sobre tecnologia, corredor ávido, viajante do mundo inteiro, campeão de Java, líder de JUG, membro do NetBeans Dream Team e capitão do Docker, ele pode ser facilmente acessado em @arungupta.

2 Comentários

  1. Belo artigo. Obrigado por tê-lo elaborado.

    Uma suposição claramente declarada é que o exemplo foi para uma única AZ. No entanto, para uso real na produção, você deve implantar seu cluster k8s em várias AZs, o que é bastante fácil com kops. Isso dificulta muito a implantação de PVs. Não consegui encontrar nenhum bom exemplo de como fazer isso. Você sabe de algum? Ou talvez esteja disposto a atualizar este exemplo para dar suporte a vários AZs?

    Lendo os documentos do k8s, parece que precisaríamos usar um recurso StorageClass para cada AZ, marcar o PersistantVolume para a classe, mas não consigo descobrir como obter um Implantação (ou ReplicationController) para escolher o Classe de armazenamento com base na AZ em que está, que não é conhecida até que o local seja agendado em um nó.

    Além disso, o amostra de viagem não apareceu para mim em nenhuma das vezes, não que isso seja importante. E a segunda kubectl.sh expose rc couchbase --target-port=8091 --port=809--type=LoadBalancer deve ser kubectl expose rc couchbase --target-port=8091 --port=8091 --type=LoadBalancer

    Também pode ser interessante atualizá-lo para usar kops (ou consulte seu outro excelente artigo sobre como fazer isso) e substitua ReplicationController com Implantação.

    1. Você encontrou uma solução para isso? Estou tentando criar um cluster CB com PVs. Tudo parece funcionar na primeira vez em que eles são iniciados, mas quando eu elimino um pod cd, o novo pod não consegue mais entrar no cluster CB, seu ip parece estar bloqueado e o pod mestre CB não consegue se conectar de volta ao novo worker.

      Saúde

Deixar uma resposta