Inicie o aplicativo no Openshift e compare as ferramentas existentes

Está bem


Quero contar uma história de como o aplicativo foi iniciado no Openshift. Também no decorrer da peça, consideramos utilitários para gerenciar o aplicativo dentro do Openshift. Esta é uma transcrição do desempenho no kubernetes SPB meetup # 3 .


Finalidade


Normalmente, os clientes são implantados em servidores separados, mas aqui veio a tarefa, para testar a oportunidade de executar no openshift e coletar o rake.


Primeiro você precisa falar sobre a nossa aplicação. Um projeto com uma história rica. Usado em grandes organizações e provavelmente cada um de vocês se cruza indiretamente. O aplicativo suporta muitos bancos de dados, integrações, etc., etc.


Pré-requisitos


Implantar


O aplicativo deve funcionar em ambientes completamente diferentes. Como resultado, nossa documentação de instalação é muito extensa. Mas se você olhar para baixo, não há nada complicado:


  • Aplique o esquema do banco de dados.
  • Configure o servidor de aplicativos.
  • Instale uma licença.
  • Personalize o aplicativo e a integração com sistemas externos.

Implantar


Mas o mundo é cruel, tivemos várias restrições:


  • O aplicativo só pode ser criado especificamente no Jenkins, que está envolvido na assinatura. E só lá.
  • Não há acesso do cliente Openshift ao ambiente de desenvolvimento.
  • Por várias razões ideológicas, não foi possível reutilizar as imagens existentes do Docker para desenvolvimento.
  • Temos playbooks ansible para instalar e configurar o aplicativo nos servidores.

Demonstração Ansible-Container


Recipiente Ansible


O Ansible Container é um software de código aberto que visa automatizar a montagem, implantação e controle de processos de contêineres. Como você pode imaginar pelo nome. Ansible é usado para construir contêineres. Já escrevemos funções Ansible para instalar e implantar aplicativos em cima de servidores, por isso decidimos não reinventar a roda e reutilizá-los. Não seria apenas a ferramenta perfeita, mas a rápida reutilização de funções existentes foi um fator decisivo para a demonstração.


Em geral, para fazer uma demonstração, pegamos as funções existentes que configuram tudo e tudo e fizemos um "contêiner monolítico". Não houve problemas em particular na coleta do contêiner, pois O Openshift tem ótimas recomendações , mas mencionarei separadamente:


  • Os papéis precisavam ser finalizados. nós usamos systemd.
  • Por padrão, por razões de segurança, é proibido usar algum syscall no openshift. Como resultado, haverá nuances com chroot, sudo. Olá CVE-2019-5736 .
  • Da mesma forma, por motivos de segurança, o contêiner é iniciado sob um usuário com um ID aleatório, esse também é um comportamento personalizado.

A principal idéia neste momento é que fizemos uma demonstração muito rápido.


Demonstração de vários contêineres


Vários recipientes


O contêiner de demonstração cumpriu seu papel e o dividimos em componentes separados:


  1. Nossa aplicação.
  2. O banco de dados
  3. Serviços externos, etc ...

Vários recipientes


A primeira coisa que você encontrou, como inicializar o banco de dados? É claro que usamos migrações, mas quando e como aplicá-las? Aqui vale a pena fornecer um link para um artigo maravilhoso que descreve a vida do dispositivo POD: PODs . De um modo geral, existem várias abordagens:


  • Use init-container
  • Use sistemas de orquestração que determinarão a ordem de implantação dos serviços e rolarão a migração quando necessário.

Decidimos seguir o caminho do contêiner Init. I.e. no POD do nosso aplicativo, antes do início do nosso aplicativo, um contêiner é iniciado que faz migrações. Mas como configurar o próprio aplicativo e integrações externas?


Inicialize o aplicativo


Vários recipientes


Como já mencionei, nosso aplicativo pode e deve funcionar em ambientes completamente diferentes, com diferentes bancos de dados e integrações. Novamente, a questão é como configurar tudo isso?


  • Use sistemas de orquestração que determinam a ordem na qual os serviços são implantados e aplicam a configuração após o início do aplicativo.
  • Passe pelas variáveis ​​de ambiente para o contêiner como configurar.
  • Use o gancho de partida.
  • Faça um contêiner separado que contenha a configuração e aplique-o ao aplicativo. Migração aproximadamente analógica para o banco de dados.

Escolhemos a última abordagem, porque permite que você torne a configuração reproduzível e auto-suficiente. Mas, por alguma razão, inicialmente fizemos esse contêiner em um controlador de replicação separado com um fator 1.


Vários recipientes


Ok, leia a documentação novamente.


Um pod (como em um pod de baleias ou de ervilha) é um grupo de um ou mais contêineres (como contêineres do Docker), com armazenamento / rede compartilhada e uma especificação de como executá-los.

POD é um grupo de contêineres. Como resultado, nosso sub consistiu em 3 contêineres


  1. Container inicial para inicializar um PostgreSQL.
  2. Recipiente com app.
  3. Contêiner com configuração de aplicativo.

Toolkit


Temos um diagrama de como o aplicativo implantado se parece. Agora é hora de discutir as ferramentas da natureza, já há muita coisa pronta, vou considerar algumas da lista abaixo e tirar conclusões subjetivas.



Modelos Openshift


Modelos Openshift


Modelos Openshift


Prós:


  • Nativo e eles têm excelente documentação.

Contras:


  • Outro mecanismo de modelo.
  • Arquivos YAML longos e terríveis.
  • Se você tiver dependências entre os serviços e sua ordem de início, será difícil.

Scripts e modelo


Scripts personalizados


Prós:


  • Você pode usar ótimas ferramentas e todo o poder do OOP.

Contras:


  • Muletas que suportam. E não apenas para você.

Terraform k8s provider


Terraform k8s provider


Terraform k8s provider


Prós:


  • Você não se preocupa com a prioridade de criar elementos de infraestrutura.
  • Você pode reutilizar o código de infraestrutura como módulos.
  • Você pode adicionar lógica de inicialização do aplicativo.

Contras:


  • Não há suporte para Openshift, apenas k8s.
  • Doca e módulos às vezes desatualizados.
  • Outra tula em sua equipe.

Recipiente Ansible


Recipiente Ansible


Recipiente Ansible


Prós:



Contras:


  • Imagens enormes, porque vá em uma camada.
  • Parece abandonado e sem suporte. Foi substituído pelo dobrador Ansible .

Módulo k8s Ansible


Módulo k8s Ansible


Módulo Ansible + k8s


Prós:


  • Um manual para descrever todas as infra-estruturas do projeto no Openshift.
  • Reutilizando código na forma de funções.
  • Você pode adicionar lógica de inicialização do aplicativo.

Contras:


  • Sem suporte a proxy.
  • Você cuida da remoção. Se o objeto não for mais necessário, descreva sua remoção.
  • Você mesmo descreve a sequência de criação de elementos de infraestrutura.

Pacote de playbook Ansible


Pacote de playbook Ansible


O utilitário Ansible Playbook Bundle (APB) oferece uma abordagem: vamos agrupar funções possíveis para implantar um aplicativo dentro do k8s / openshift em um contêiner e executar dentro do k8s / openshift.


Prós:


  • Eu carrego tudo comigo.
  • Testável e reproduzível.
  • Integração com o catálogo de serviços (interface da web fácil de usar para iniciar aplicativos).

Contras:


  • Você precisa de privilégios de nível de administrador.
  • Às vezes, a documentação deixa muito a desejar.

Resultado


Resultado


Não quero ser o último recurso, mas vou compartilhar minhas conclusões:



PS


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


All Articles