Escolar Documentos
Profissional Documentos
Cultura Documentos
INSTITUTO DE TECNOLOGIA
FACULDADE DE ENGENHARIA DA COMPUTAÇÃO E
TELECOMUNICAÇÕES
BACHARELADO EM ENGENHARIA DA COMPUTAÇÃO
Belém
2019
AUGUSTO CÉSAR OLIVEIRA GONÇALVES
Belém
2019
OLIVEIRA GONÇALVES, Augusto César
Técnicas e Tecnologias de Computação em Nuvem Aplicadas á Montagem de
Genomas/ AUGUSTO CÉSAR OLIVEIRA GONÇALVES. – Belém, 2019.
57 p. : il. (algumas color.) ; 30 cm.
Banca Examinadora
Belém
2019
Este trabalho é dedicado áqueles que decifram os segredos da realidade
e aplicam o seu conhecimento na elevação da condição humana e na superação dos limites
AGRADECIMENTOS
Em primeiro lugar gostaria de agradecer minha mãe, Ana Paula, e meu pai, Paulo César,
que sempre deram todo suporte para permitir que eu chegasse até aqui. Sem vocês talvez eu não
estivesse aqui hoje.
Quero agradecer a todos os professores que conheci durante toda a minha caminhada,
desde o ensino fundamental até o ensino superior. Todos vocês me ajudaram a compreender
diversos tipos de matérias e conceitos relacionados á computação e engenharia. Agradeço
também á todos e todas que se dedicam á disponibilizar conhecimento nas bibliotecas virtuais
e fórums da vasta Internet, onde pude obter o conhecimento para firmar e verificar técnicas,
conceitos e opiniões, e, acima de tudo, conhecer as ferramentas para se compreender a realidade.
Um agradecimento especial ao Prof. Dr. Raimundo Viégas, que aceitou me orientar
no desenvolvimento deste trabalho, e desde a primeira concepção do projeto, mostrou grande
entusiasmo com as tecnologias envolvidas e conceituou várias aplicações para estas.
Também sou grato à UFPA, por conceder toda a estrutura necessária para a realização
deste curso na instituição, e também ao CTIC, onde tive oportunidade de fazer estágio e tive
minha primeira exposição ás tecnologias de infraestrutura de TI e ao DevOps, e onde adquiri os
conhecimentos para a realização deste trabalho.
Não poderia deixar de agradecer ao Pedro Rocha, por ter sido uma pessoa fundamental
para o desenvolvimento do projeto. Sua contribuição foi essencial para o entendimento dos
aspectos práticos da montagem de genomas. No mais, agradeço pelo apoio e pela disponibilidade
ao sanar minhas dúvidas.
Um agradecimento especial ao Carlos Nogueira, que me guiou na minha iniciação na
área de infraestrutura de TI, e foi o responsável pela ideia inicial para a realização deste trabalho.
Gostaria de agradecer a todas as pessoas que sempre torceram por mim e que me ajudaram
de maneira direta ou indireta com minha evolução acadêmica. Fico muito feliz de poder ter vocês
por perto.
E por fim, agradeço á Jaqueline, que sempre torceu pelo meu sucesso.
“Eu não creio que exista algo mais emocionante para o coração humano do que a emoção
sentida pelo inventor quando ele vê alguma criação da mente se tornando algo de sucesso.
Essas emoções fazem o homem esquecer comida, sono, amigos, amor, tudo.” (Nikola Tesla)
RESUMO
From the union of expanding telecommunications infrastructure, advances in the theory and
techniques of distributed systems, and computing as utility, the concept of cloud computing is
born, which abstracts applications from proper physical hardware, to concentrate or distribuite
computing resources in magnitudes once impracticable. A application for this concept is the
resolution of computationally costly problems, frequently found in scientific research, as genome
assembly. To prove experimentally the viability of the computing cloud in this role, a computing
cloud was created, following the concepts of cloud computing, microservices, paralellism and
container orchestration, whose role is the assembly of genomes. Applied to bioinformatics
research demands in the Federal University of Pará, the solution was shown to be reliable
and efficient, in comparison to sequential assembly of mutiple genome samples in individual
machines.
AG Algoritmo genético
BaaS Backend-as-a-service
FaaS Function-as-a-service
SaaS Software-as-a-service
k8s Kubernetes
APÊNDICES 49
APÊNDICE A – PROCEDIMENTOS DE INSTALAÇÃO E CONFIGU-
RAÇÃO DO CLUSTER . . . . . . . . . . . . . . . . . 50
APÊNDICE B – ARQUIVOS DE CONFIGURAÇÃO DE OBJETOS
DE TRABALHO DO KUBERNETES . . . . . . . . . 54
14
1 INTRODUÇÃO
1.1 Contexto
Com o crescente aumento da informação digital e a grande massa de dados associada á
estas informações, a computação se vê desafiada a processar e interpretar de forma hábil, volumes
cada vez maiores de dados. Esta realidade, antes manifestada primariamente em aplicações
científicas e burocráticas, após a crescente integração da tecnologia digital com múltiplos
aspectos da vida diária de bilhões de pessoas, vem ganhando mais visibilidade na opinião pública.
García (2015) argumenta que "a computação em nuvem transformou a forma como sistemas e
aplicações são criados, distribuídos e escalonados, e é considerada um dos desenvolvimentos
tecnológicos mais importantes da última década. Esta tecnologia permite que indivíduos e
organizações compartilhem um conjunto de recursos de computação, armazenamento e conexão
em rede, permitindo o controle do hardware utilizado para operar parte significativa da Internet,
enquanto reduz a complexidade e custos operacionais."
Capítulo 1. Introdução 15
1.2 Justificativa
Em vários projetos de pesquisa, um problema recorrente é a existência de problemas de
resolução computacional custosa, e a falta de recursos de hardware suficientes para atender á
demanda da resolução de problemas em tempo hábil, de forma confiável, principalmente pelo
alto custo de aquisição de hardware de alta performance, e o custo do conhecimento técnico
associado á manutenção e implementação deste.
Assim, é importante procurar alternativas á estruturas de computação tradicionais, e
encontrar novas formas de provisionar recursos computacionais para a pesquisa científica, em
particular para seus problemas mais custosos. A computação em nuvem se mostra uma alternativa
econômica, eficiente e ajustável ás particularidades e necessidades dos problemas em questão,
e ao mesmo tempo que oferta tais benefícios, aplicações científicas vindicam o paradigma de
computação em nuvem e solidificam sua contribuição para o melhoramento da condição humana
e a compreensão da realidade.
Por esse motivo, decidiu-se desenvolver uma nuvem de computação, para atender de
forma eficiente ás demandas computacionais de pesquisas em bioinformática. Com esta fer-
ramenta, busca-se fornecer uma ferramenta sólida e eficiente para montagem genômica, e ter
um campo de aprendizado e prática para técnicas de computação em nuvem. Além disso, as
Capítulo 1. Introdução 16
técnicas de processamento paralelo desenvolvidas neste trabalho podem ser expandidas para
outras aplicações que se sujeitem ao paralelismo em alto nível, não se mantendo restrita ao seu
propósito inicial aqui exposto.
1.3 Objetivos
Esta seção lista os objetivos gerais e específicos do presente trabalho.
1.6 Metodologia
A pesquisa bibliográfica foi feita por meio de buscas em repositórios de artigos online uti-
lizando palavras-chave como: computação em nuvem, virtualização, orquestração de contêiners,
montagem de genomas. Foi verificado quais artigos implementavam paralelização de processos
em nuvem aplicados á problemas computacionalmente custosos. Feito isso, procurou-se nas
referências bibliográficas dos trabalhos os autores mais citados para, então, obter a composição
do referencial teórico deste trabalho.
Capítulo 1. Introdução 18
2 REFERENCIAL TEÓRICO
Este capítulo apresenta o referencial teórico que fundamentou este trabalho, elucidando
os conceitos básicos para o entendimento do tema abordado.
Fonte: Autor
Fonte: Autor
segundo tal padrão é difícil e gera um overhead oneroso tanto em termos de tempo quanto
consumo de dados. Uma forma de contornar estas dificuldades é coordenar microserviços e seus
dados sem o uso de transações distribuídas, porém esta prática implica em perdas de consistência
eventuais entre os bancos de dados distribuídos. Lewis e Fowler (2014)
Todas estas técnicas de compartimentalização e decomposição de aplicações em mi-
croserviços, sejam estes efêmeros ou persistentes, levam a um processo de desenvolvimento e
implantação evolucionário, onde melhoramentos, reduções e atualizações mantém a aplicação
eficiente e alinhada com requerimentos de negócio frequentemente reformulados, enquanto que
a estrutura modular mitiga as dificuldades associadas ao constante versionamento e implantação
associado ao ciclo de desenvolvimento contínuo. Lewis e Fowler (2014)
Fonte: Autor
Logo, a arquitetura serverless não é a forma mais viável para implementação direta de
aplicações que exijam armazenamento de estado e/ou execução e monitoramento de estado
contínuos, exigindo a refatoração da arquitetura da aplicação. Outros desafios, tanto inerentes à
natureza da arquitetura quanto gerados pela falta de maturidade em tecnologia e organização de
serviços, incluem vulnerabilidades em segurança por conta de terceirização de responsabilidades
e o fato da concorrência e hospedagem de múltiplas aplicações e instâncias na mesma máquina
física, refatorações de aplicação impostas por mudanças no serviço hospedeiro, impossibilidade
de otimizações em servidores, latência no lançamento de instâncias e execução de funções, e
dificuldades de configuração, testes e monitoramento (este último principalmente por conta do
contêiner efêmero). Roberts (2018)
Por outro lado, instâncias de execução efêmeras e automatização de escalonamento
sob demanda permitem um ajuste fino e maior aproveitamento de recursos computacionais
no lado do serviço de hospedagem da aplicação, afirma Lewis e Fowler (2014), reduzindo
custos operacionais e danos ao meio ambiente por meio de ganhos em eficiência energética, e a
terceirização de backend e implantação reduz o custo, complexidade e tempo de desenvolvimento.
Capítulo 2. Referencial Teórico 26
Fonte: Autor
uso eficiente de recursos. Instâncias podem ser lançadas a partir de terminais, e o gerenciador
distribui estas entre as máquinas físicas alocadas para o cluster, com comunicação fornecida por
VPN autoconfigurável e DNS próprio, rodando sob rede definida por software(SDN), facilitando
a interação entre contêineres distribuídos em redes diferentes[11].
Farcic (2017) pontua que o Swarm fornece suporte nativo para importantes aspectos do
processo de conteinerização: 1. Gerenciamento de clusters 2. Orquestração de contêineres 3.
Descoberta de serviços e balanceamento de carga 4. Segurança avançada e gerenciamento de
segredos
Para definir corretamente o modelo de arquitetura Swarm, não se pode deixar de fa-
lar da arquitetura base da engine Docker. Segundo Farcic (2017), o Docker se compõe dos
seguintes elementos: Servidor (ou daemon dockerd): recebe toda chamada à API Docker, e
gerencia recursos: imagens-base, volumes de armazenamento ou segredos, comunicação entre
daemons e configurações de redes. runC e containerd: processos, respectivamente, de execução e
gerenciamento de contêineres API REST: interface de comunicação entre clientes e daemons,
acessível via linha de comando ou HTTP CLI: interface de linha de comando Tais processos são
a base da gerência de contêineres Docker, e importantes em contexto de baixo nível para um
cluster Swarm.
As funções de gerenciamento de clusters e orquestração são fornecidas pelo utilitário
Swarmkit: uma versão mais avançada do Swarm, caracterizada pelo uso do algoritmo raft
consensus e TLS em toda comunicação entre nós.
Um cluster (ou swarm) é definido a partir da necessidade de recursos de um serviço:
quantidade de réplicas de hospedeiro de nós(nodes), tanto trabalhadores (workers) executores de
tarefas (tasks), como administradores (managers), posicionamento em nós específicos, portas de
rede abertas, recursos de rede e armazenamento disponíveis, entre outros, e o swarm mantém
o estado do serviço, utilizando o algoritmo raft consensus, descrito em Hausenblas (2018).
Paralelamente ao swarm, podem ser executados contêineres Docker avulsos, exceto aqueles
contêineres para fins de administração, que devem ser executados dentro do swarm em questão a
ser administrado.
A função do algoritmo raft consensus é manter a integridade da replicação de configura-
ções e atividades entre os nós administradores, para garantir a continuidade da administração,
em particular a função de replicação de logs do swarm em caso de falha em um nó. O algoritmo
mantém o estado do cluster consistente por meio de consenso entre uma maioria [(N/2)+1],
sendo N o número de nós executando o algoritmo, de nós administradores em relação à variáveis
de configuração, e tolera eventos de falha até a perda de [(N-1)/2] de nós. Assim, o algoritmo
implementa as seguintes características de sistemas distribuídos no cluster: concordância de
valores de configuração, exclusão mútua (utilizada no processo de seleção do nó administrador
líder), sequenciamento consistente de objetos e tarefas e gerenciamento de membros no cluster.
Capítulo 3. Tecnologias de orquestração de contêineres: o estado da arte 33
3.2.2 Kubernetes
Kubernetes, termo do grego antigo que significa "timoneiro, governador ou capitão", é
um orquestrador de contêineres desenvolvido a partir do Borg, uma solução de orquestração de
uso interno do Google. Seu foco de operação é balanço de carga, isolação e posicionamento de
contêineres, e opera a partir do paradigma de serviços em contêineres Docker. Cada serviço deve
possuir um escopo bem limitado, preferencialmente ao ponto de haver apenas um processo, e o
mínimo de dependências necessárias, rodando em um contêiner, para facilitar a escalabilidade e
melhorar a estabilidade de um sistema dividido em contêineres. Linux Foundation (2019)
Em uma infraestrutura de nuvem, ou em termos reais, máquinas físicas concentradas ou
dispersas geograficamente, cada máquina pode hospedar um ou vários contêineres Docker, e
algumas outras executam o software orquestrador. Os hospedeiros de contêineres são chamados
nós(nodes) e os hospedeiros do orquestrador, mestres(másters). Conjuntos de nós e mestres são
chamados de clusters.
Capítulo 3. Tecnologias de orquestração de contêineres: o estado da arte 34
Fonte: Autor
por cada contêiner no pod, sendo tal modelo necessário para a correta execução do orquestrador:
o Kubernetes não administra diretamente os processos internos ao contêiner, apenas o contêiner
em si. Dependendo da demanda apresentada ao cluster e o seu estado geral de funcionamento, um
pod pode ser desmontado de um cluster, e reconstruído em outro, considerando que os clusters
em questão possuem um volume lógico compartilhado, acessível aos pods. Pods também podem
montar sistemas de arquivos NFS, para armazenar dados mais persistentes, como bancos de
dados, logs ou dados armazenados a longo prazo. Farcic (2017)
O deployment é o primeiro objeto a ser comandado por iniciativa do usuário. Um deploy-
ment é um conjunto de replication sets, que realizam em conjunto o processo de atualizações e
rollbacks, e repassam ordens de configurações para os replication sets. Para fins de gerenciamento
e documentação de infraestrutura, o Kubernetes fornece um sistema de consulta e roteamento
de comandos e dados baseado em labels (etiquetas) e annotations (anotações). O label segue
o formato par chave-valor, podendo receber qualquer nome e conteúdo, seguindo a norma de
etiquetas DNS, e fora dos nomes reservados pelo Kubernetes. Linux Foundation (2019)
O replication controller (controlador de replicação) é o responsável pela criação, a partir
de um modelo pré-definido de pods, e multiplicação e desativação de pods, com base na demanda
de serviços, saúde dos pods e sua infraestrutura, e a configuração do cluster. Também organiza o
processo de atualizações e rollbacks de forma a não prejudicar a disponibilidade dos serviços
hospedados na infraestrutura conteinerizada.
Um tipo especial de controlador é o stateful set, que possui as funções de um controlador
de replicação, em conjunto com rotinas adicionais voltadas á preservação do estado de dados no
contêiner
Replication sets (conjuntos de replicação) são mais um tipo especial de controlador de
replicação que identifica de forma inteligente os pods a serem gerenciados, porém não possuem
a mesma habilidade de gerenciar atualizações e rollbacks, pelo fato de trabalharem em conjunto
com outros objetos de nível mais alto. Linux Foundation (2019)
Processos são distribuídos sequencialmente: Cliente > Agendador de tarefas > Nó mestre
> Nó agente > Executor E na ordem inversa fluem mensagens com informações atualizadas sobre
o estado da tarefa.
O DC/OS também fornece serviços de identidade e autenticação com LDAP, multitenân-
cia verdadeira de aplicações, isolamento de recursos, interfaces gráficas e linha-de-comando,
conexão segura entre clusters e componentes validados em testes de integração. Mesosphere
(2018b)
38
Fonte: Autor
de configuração para contêineres Docker, nos quais são distribuídas e executadas as etapas de
montagem: o nó-mestre fornece os arquivos com genomas a montar, e posta os nomes dos
arquivos, e mensagens de disparo para os nós-escravos em forma de mensagens na fila de
requisições do protocolo AMQP.
Os nós-escravos recolhem os dados no final da fila de requisições e recebem os indivíduos
fornecidos pelo nó-mestre, e executam as funções de tratamento de qualidade, montagem, binning
e análise de qualidade. Na conclusão da etapa de análise de qualidade, o nome de cada genoma
processado é postado na fila de retorno, e anunciado no nó-mestre.
Seguindo os postulados do modelo de arquitetura em microserviços, cada componente
é provisionado individualmente, em um container próprio, e com políticas de persistência e
replicação adequadas para cada aplicação componente do sistema, comandadas pelo orquestrador,
o qual também realiza a abstração entre contêineres e o hardware virtualizado a ser distribuido á
todos os habitantes do cluster.
4.1.1 RabbitMQ
RabbitMQ é um servidor de mensageria de código aberto, que implanta o protocolo
AMQP (advanced message queuing protocol, protocolo avançado de enfileiramento de mensa-
gens), compatível com outras plataformas de barramento de mensagens. A base do programa é o
mecanismo assíncrono de publicação e assinatura de mensagens: mensagens são publicadas em
uma fila de requisições, replicadas para o número de consumidores, e recebidas pelos assinantes
em sequência.
Mensagens podem ser definidas de várias formas, sem as limitações tradicionais impostas
por tamanhos de pacotes, e o mecanismo de mensagens possui vários utilitários: filtros, logs,
usuários e grupos, estados de transações e outras ferramentas de monitoramento. A ausência de
polling entre publicadores e assinantes diminui o overhead associado a mensagens síncronas.
Maatkamp (2015)
4.1.2 Prinseq
A aplicação Prinseq é definida por Schmieder e Edwards (2011) como "solução de
controle de qualidade e prepocessamento rápido e fácil de dados genômicos e conjuntos de
dados de metagenomas. Sumários de estatísticas, para arquivos FASTA, QUAL e FASTQ, são
gerados em forma gráfica e tabular, e sequências podem ser filtradas, reformatadas e aparadas
com várias opções para análise posterior. [...] o PRINSEQ permite ao cientista verificar e preparar
seus conjuntos de dados antes de processos de análise posteriores. Os resultados revelam se
o sequenciamento obteve êxito, se a amostra correta foi sequenciada, e se a amostra contém
contaminantes."
Capítulo 4. Proposta e experimento em Paralelização Escalonável de Montagem de Sequências Genômicas
utilizando RabbitMQ e Kubernetes 40
Figura 8 – Filas de mensagens do protocolo AMQP.
Fonte: Autor
4.1.3 Megahit
A aplicação Megahit é definida por Li et al. (2015) como "um montador de novo, de
sequenciamentos de nova geração, feito para montar dados metagenômicos grandes e complexos
de forma eficiente em tempo e custo. Finalizou a montagem de um conjunto de 252 GB de dados
metagenômicos de solos em 44,1 e 99,6 h, respectivamente, com e sem o uso de GPU. O Megahit
monta os dados por completo, sem a necessidade de pre-processamento como particionamento ou
normalização necessários. [...] O MEGAHIT utiliza grafos de De Brujin sucintos, representações
comprimidas deste tipo de grafo."
4.1.4 Metabat
A aplicação Metabat é definida por Kang et al. (2015) como "um software automatizado,
que integra distâncias probabilísticas empíricas de abundância de genomas e frequência de tetra-
nucleotídeos para realizar com precisão o binning metagenômico. [...] MetaBAT foi desenvolvido
como uma ferramenta de software eficiente, automatizada, capaz de performar o binning em
milhões de contigs de milhares de ferramentas."
4.1.5 Metaquast
Metaquast, segundo Mikheenko, Saveliev e Gurevich (2015), é "uma modificação da
ferramenta QUAST, o estado da arte para avaliação da montagem genômica a partir do alinha-
mento de contigs como referência. O MetaQUAST atende a características de conjuntos de
dados metagenômicos como (i) conteúdo de espécies desconhecidas por detecção e download de
sequências de referências, (ii) imensa diversidade por meio da produção de relatórios substanciais
para mútiplos genomas e (iii) presença de espécies fortemente relacionadas por detecção de
contigs quiméricas."
Capítulo 4. Proposta e experimento em Paralelização Escalonável de Montagem de Sequências Genômicas
utilizando RabbitMQ e Kubernetes 41
Fonte: Autor
Fonte: Autor
pela recepção de mensagem de confirmação emitida pelo processo anterior, de forma que cada
etapa é iniciada assim que o primeiro pod disponível consome a mensagem de confirmação da
fila. Desta forma, os processos são disparados apenas quando há arquivos disponíveis na fila para
trabalhar, e evita-se condições de corrida que poderiam levar a falhas catastróficas no processo
de montagem genômica.
Pods Qtd
RabbitMQ 2
Prinseq 2
Megahit 6
Metabat 2
Metaquast 4
Fonte: (Próprio autor)
44
5 TESTES E RESULTADOS
Fonte: Autor
Por inspeção do gráfico, pode-se concluir que o cluster executa o processamento de uma
amostra, em média, em 29% do tempo de execução em máquina individual, e 123% do tempo
deduzido teoricamente, assumindo distribuição de cargas perfeitas entre 4 máquinas individuais.
O acréscimo de tempo é explicado pelo tempo de processamento do servidor de mensagens, e o
próprio overhead induzido pelo orquestrador..
Capítulo 5. Testes e Resultados 45
6 CONCLUSÃO
REFERÊNCIAS
ANGEL, V. D. D. et al. Ten steps to get started in genome assembly and annotation. ELIXIR,
p. 148, feb 2018.
BERNSTEIN, D. Containers and cloud: From lxc to docker to kubernetes. IEEE Cloud
Computing, sep 2014.
DEBSKI, A. et al. A scalable, reactive architecture for cloud applications. IEEE Software,
v. 35, p. pp. 62–71, mar 2018.
FARCIC, V. The DevOps 2.1 Toolkit: Docker Swarm. first. [S.l.]: Packt Publishing, 2017.
GARCíA, A. L. The evolution of the Cloud : the work, progress and outlook of cloud
infrastructure. Dissertação (Mestrado) — Massachusetts Institute of Technology, 2015.
GIANI, A. M. et al. Long walk to genomics: History and current approaches to genome
sequencing and assembly. Computational and Structural Biotechnology Journal, v. 18, p.
pp. 9–19, nov 2019.
HINDMAN, B. et al. Mesos: A platform for fine-grained resource sharing in the data center. In:
8th USENIX Symposium on Networked Systems Design and Implementation. [S.l.: s.n.],
2011.
HUANG, D.; WU, H. Mobile Cloud Computing: Foundations and Service Models. first.
[S.l.]: Morgan Kaufmann, 2017. ISBN 9780128096444.
KANG, D. D. et al. Metabat, an efficient tool for accurately reconstructing single genomes from
complex microbial communities. PeerJ Life and Enviroment, 2015.
LI, D. et al. Megahit: an ultra-fast single-node solution for large and complex metagenomics
assembly via succinct de bruijn graph. Oxford Bioinformatics, 2015.
MOREANO, N.; MELO, A. C. M. A. de. Biological sequence analysis on gpu. In: . [S.l.]:
Morgan Kaufmann, 2017. cap. book chapter 6, H. Sarbazi-Azad. (Org.), Advances in GPU
Research and Practice.
NISBET, R.; ELDER, J.; MINER, G. Handbook of Statistical Analysis and Data Mining
Applications. [S.l.]: Academic Press, 2009. ISBN 9780123747655.
NISSEN, J. N. et al. Binning microbial genomes using deep learning. 2018. Preprint.
SALZA, P.; FERRUCI, F. Speed up genetic algorithms in the cloud using software containers.
Future Generation Computer Systems, oct 2018.
Após a instalação, desligar a VM, configurar a placa de rede para "modo bridge" e ligar a VM
novamente
3 - Abrir terminal e instalar utilitários básicos: sudo apt update && apt upgrade && apt install
curl ssh net-tools vim sudo apt-transport-https ca-certificates software-properties-common
Usar o comando "ip a" para obter o endereço IP da VM
Como root, colocar o nome de usuário criado na instalação do Linux no arquivo sudoers para dar
privilégios administrativos ao seu usuário comum.
4 - Instalar o docker:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
curl -fsSL https://get.docker.com | sh;
5 - Reinicializar a VM
{
"insecure-registries": ["master:5000"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
Estas modificações ativam o uso do systemd, e criam permissões para uso de um repositório
privado local, hospedado na máquina master, porta 5000
touch /etc/apt/sources.list.d/kubernetes.list
Manter na versão listada no tutorial por conta de problemas com a versão 1.16 do k8s
----200.129.137.XXX nome-master
----200.129.137.XXX nome-worker)
#!/bin/bash
firewall.service
[Unit]
After=docker.service
[Service]
ExecStart=/etc/init.d/firewall
[Install]
WantedBy=default.target
Os IP's da Pod Network e Service CIDR definidos são necessários para que o cluster funcione com
a rede interna Flannel.
Executar a imagem base e rodar terminal: docker run -it continuumio/miniconda bash
Sair do shell do container, e usar o comando sudo docker ps --all para localizar a imagem no
registro. Procurar a imagem com o menor tempo de saída ("exited x minutes ago") e copiar o nome
da imagem
Rodar o comando:
sudo docker commit "nome_imagem" master:5000/"aplicação"
Instalar no nó onde vai ser provisionado o servidor NFS: sudo apt install -y nfs-kernel-server
Dar permissões 777 para o diretório a ser provisionado em NFS: chmod -R 777 /mnt/data
/mnt/data *(rw,sync,fsid=0,crossmnt,no_subtree_check,no_root_squash)
16 - Criar seus pods, deployments e serviços a partir de arquivos .YAML descritos no Apêndice 2
Prinseq
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: prinseq
spec:
serviceName: "prinseq"
replicas: 2
selector:
matchLabels:
app: prinseq
template:
metadata:
labels:
app: prinseq
spec:
containers:
- name: prinseq
image: master:5000/prinseq
imagePullPolicy: IfNotPresent
env:
- name: PRINSEQCMD
value: "conda activate prinseq-env && python /opt/prinseq/worker-prinseq.py"
command: ["/bin/bash"]
args: ["-i", "-m", "-c", "$(PRINSEQCMD)"]
# command: [ "/bin/bash", "-c", "--" ]
# args: [ "while true; do sleep 30; done;" ]
ports:
- containerPort: 80
name: prinseq
volumeMounts:
- name: nfs-volume
mountPath: /opt/prinseq
volumes:
- name: nfs-volume
nfs:
# URL for the NFS server
server: 200.239.72.34 # Change this for your NFS server address
path: "/mnt/data/"
Megahit
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: megahit
spec:
serviceName: "megahit"
replicas: 6
selector:
matchLabels:
app: megahit
template:
metadata:
labels:
app: megahit
spec:
containers:
- name: megahit
image: master:5000/megahit
imagePullPolicy: IfNotPresent
env:
- name: MEGAHITCMD
value: "conda activate megahit-env && python /opt/megahit/worker-megahit.py"
command: ["/bin/bash"]
args: ["-i", "-m", "-c", "$(MEGAHITCMD)"]
# command: [ "/bin/bash", "-c", "--" ]
# args: [ "while true; do sleep 30; done;" ]
ports:
- containerPort: 80
name: megahit
volumeMounts:
- name: nfs-volume
mountPath: /opt/megahit
volumes:
- name: nfs-volume
nfs:
# URL for the NFS server
server: 200.239.72.34 # Change this for your NFS server address
path: "/mnt/data/"
Metabat
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: metabat
spec:
serviceName: "metabat"
replicas: 2
selector:
matchLabels:
app: metabat
template:
metadata:
labels:
app: metabat
spec:
containers:
- name: metabat
image: master:5000/metabat
imagePullPolicy: IfNotPresent
env:
- name: METABATCMD
value: "conda activate metabat-env && python /opt/metabat/worker-metabat.py"
command: ["/bin/bash"]
args: ["-i", "-m", "-c", "$(METABATCMD)"]
# command: [ "/bin/bash", "-c", "--" ]
# args: [ "while true; do sleep 30; done;" ]
ports:
- containerPort: 80
name: metabat
volumeMounts:
- name: nfs-volume
mountPath: /opt/metabat
volumes:
- name: nfs-volume
nfs:
# URL for the NFS server
server: 200.239.72.34 # Change this for your NFS server address
path: "/mnt/data/"
MetaQUAST
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: metaquast
spec:
serviceName: "metaquast"
replicas: 4
selector:
matchLabels:
app: metaquast
template:
metadata:
labels:
app: metaquast
spec:
containers:
- name: metaquast
image: master:5000/metaquast
imagePullPolicy: IfNotPresent
env:
- name: METAQUASTCMD
value: "conda activate metaquast-env && python /opt/metaquast/worker-metaquast.py"
command: ["/bin/bash"]
args: ["-i", "-m", "-c", "$(METAQUASTCMD)"]
# command: [ "/bin/bash", "-c", "--" ]
# args: [ "while true; do sleep 30; done;" ]
ports:
- containerPort: 80
name: metaquast
volumeMounts:
- name: nfs-volume
mountPath: /opt/metaquast
volumes:
- name: nfs-volume
nfs:
# URL for the NFS server
server: 200.239.72.34 # Change this for your NFS server address
path: "/mnt/data/"
apiVersion: v1
kind: ReplicationController
metadata:
labels:
component: rabbitmq
name: rabbitmq-controller
spec:
replicas: 1
template:
metadata:
labels:
app: taskQueue
component: rabbitmq
spec:
containers:
- image: rabbitmq
name: rabbitmq
ports:
- containerPort: 5672
resources:
limits:
cpu: 100m
RabbitMQ Service
apiVersion: v1
kind: Service
metadata:
labels:
component: rabbitmq
name: rabbitmq-service
spec:
ports:
- port: 5672
selector:
app: taskQueue
component: rabbitmq
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
nfs:
server: 200.239.72.34 # trocar pelo endereço IP do seu servidor de NFS
path: "/mnt/data"