Há algumas semanas tive o prazer de participar de um hackaton (a convite do Senior Software Engineer Osvaldo Daibert – a quem publicamente quero agradecer pela oportunidade) promovido pela Microsoft Corp. para clientes, parceiros e alguns FTEs em Nova Iorque. O hackaton possuía basicamente dois temas: Kubernetes e Service Fabric. Para participar do hackaton, os participantes precisavam possuir conhecimentos básicos de Docker, da tecnologia escolhida e ainda, de Azure como um todo.
Fiz a opção por trabalhar com Service Fabric (sim, tivemos que tomar essa decisão previamente também), uma vez que eu estava disposto a expandir os conhecimentos que eu possuía sobre o serviço.
O hackaton era constituído por desafios, iniciando com algumas atividades mais simples e na medida em que fossem sendo superados, iam aumentando gradativamente de complexidade. A única obrigação, por assim dizer, era: você necessariamente precisava solucionar os problemas utilizando a tecnologia escolhida anteriormente. Bacana, não?
Este contexto é importante, uma vez que o resultado final do trabalho neste hackaton, é este post.
O container de Minecraft Server
Os desafios eram todos estruturados ao redor de um container docker já pronto de Minecraft Server. Todas os desafios implementavam atividades que exploravam vários aspectos de containers propriamente ditos e além disso, do serviço escolhido (no meu caso, Service Fabric).
O container que utilizei no hackaton (e continuarei utilizando aqui neste post) pode ser encontrado através deste link.
Testando o container localmente
A primeira atividade que irei realizar aqui é testar o container localmente (para verificar se a imagem está funcionando adequadamente). É importante observar que, para fazer o teste com o cliente na sua máquina, você precisará de uma licença de Minecraft. Se você não possui uma, poderá adquirir através deste link.
Com isso posto, podemos iniciar a “brincadeira”. Como primeira atividade, execute o comando apresentado pela Listagem 1. Ele será responsável por baixar a imagem para sua máquina.
Listagem 1. Fazendo o pulling do Minecraft Server
Para verificar se o processo de pulling foi realizado com sucesso, digite “docker images
“. O resultado desta operação deverá ser semelhante aquele apresentado pela Figura 1.
Figura 1. Minecraft Server corretamente baixado para o computador
Já temos a imagem em nossa máquina. Agora, para verificar se a mesma está funcionando da maneira apropriada, execute o comando parametrizado conforme a Listagem 2. Basicamente o que este comando faz é: 1) executar a imagem docker; 2) NAT da porta do host para a porta do container; 3) aceita os termos atachados a imagem.
Listagem 2. “Subindo” o Minecraft Server
Agora, se você quiser visualizar se a imagem está rodando corretamente, basta executar em sua linha de comandos o “docker ps -a
“. Se estiver, você deverá estar visualizando uma imagem semelhante aquela apresentada pela Figura 2.
Figura 2. Container ativo e rodando em minha máquina
Agora, para testar se tudo está funcionando corretamente, vou conectar a aplicação cliente do Minecraft ao respectivo servidor rodando em nosso container. Como já mencionei anteriormente, para realizar este teste, você precisará de uma licença de Minecraft e de baixar o cliente do jogo, disponível aqui. Como você pode ver através da tela de configuração de minha aplicação cliente, estou apontando a mesma para o servidor rodando em localhost (127.0.0.1) na porta 25565 (padrão do jogo).
Figura 3. Apontando o cliente do jogo para o container Docker local
Ao clicar em “Done”, você verá que o client irá mostrar o status da conexão com o servidor. A cor verde indica o sucesso da conexão (Figura 4) e indica que tudo está pronto para que jogador possa iniciar sua jornada pelo mundo Minecraft.
Figura 4. Conexão com o servidor Minecraft executada com sucesso
Finalmente, através da Figura 5, você pode ver que estou dentro do universo Minecraft como um jogador. Este universo está sendo gerado pelo nosso container Docker recém criado. O próximo passo? Criar esta mesma experiência sobre um cluster Service Fabric sobre Linux.
Minecraft Server sobre Service Fabric
Atualmente, quando pensamos em um ambiente produtivo, automaticamente precisamos pensar em duas características extremamente importantes para os sistemas modernos: alta disponibilidade (resiliência é a chave aqui) e escalabilidade. Isso porque, como você bem sabe, estas duas características irão combinadas irão evitar experiências negativas para os usuários finais e ainda, representarão lucratividade para as empresas provedoras das aplicações.
No mercado de games esta mesma verdade se aplica. Ao propor a implementação de um ambiente escalável para Minecraft, por exemplo, é preciso garantir que o ambiente estará sempre “de pé” e claro, que ele não irá gargalar na medida em que o número de usuários online (e portanto, concorrendo por recursos do servidor) aumente exponencialmente.
Nesse contexto, Service Fabric faz muito sentido. Service Fabric é o serviço do Microsoft Azure criado para prover comportamento de cluster para aplicações. Pela expressão “comportamento de cluster” quero dizer: prover resiliência e tolerância a falhas, escalabilidade, controle de estado (stateful ou stateless), master e replicas, controle e versionamento de binários de aplicações, etc. É importante mencionar também que Service Fabric é a solução ideal no Microsoft Azure para hospedar aplicações simples ou complexas baseadas em microserviços, dado este comportamento de cluster proporcionado pelo serviço. Você pode saber mais sobre o Service Fabric (e eu recomendo fortemente que o faça) seguindo este link.
Dessa forma, sentido de tornar nosso Minecraft Server escalável e resiliente, iremos utilizar o Service Fabric sobre Linux no Azure. A escolha por Linux é meramente por preferência. Com Windows a experiência seria rigorosamente a mesma. Como primeiro passo, iremos criar nosso cluster. Você pode fazer isso através do portal (veja como fazer através deste link), através da API (veja como fazer através deste link) ou ainda, através do CLI (veja como fazer através deste link). Ao final do processo, você deverá estar vendo uma tela no seu portal do Azure semelhante aquela apresentada pela Figura 5.
Figura 5. Cluster de Service Fabric criado
Como você pode observar, como criei o cluster apenas para titulo de demonstração, configurei o ambiente com apenas um nó no cluster, entretanto, idealmente, para ambientes produtivos, a Microsoft indica que este número inicie com ao menos 3 (nós). Um aspecto importante sobre clusters Service Fabric é que ele pode atuar como um orquestrador de containers, assim como o Kubernetes também o faz. A diferença aqui é que o Service Fabric possui arquivos próprios de configuração (chamados de “arquivos de manifesto”), que dão ao Service Fabric informações relevantes sobre como determinada aplicação/container deverá ser gerenciada pelo cluster.
Dessa forma, nosso próximo passo é preparar (leia-se configurar) nosso container/aplicação com os arquivos esperados pelo Service Fabric. Podemos fazer isso manualmente ou utilizar helpers já prontos para este fim. Estou preparando todo este ambiente no meu Mac e desta forma, utilizarei um gerador de templates do Yeoman (estou considerando que o Yoeman já se encontra instalado na sua máquina. Se você precisa instalar o Yeoman, por favor, siga este link). No Windows a melhor opção para realizar esta tarefa é, sem dúvida, o Visual Studio com Service Fabric SDK instalado.
Para instalar o helper “azuresfcontainer”, por favor, siga este link. Se a instalação foi bem sucedida, ao digitar “yo” você deverá visualizar uma imagem semelhante aquela apresentada pela Figura 6.
Figura 6. “Azuresfcontainer” instalado
Para fazer o package do container com o Minecraft Server, execute o comando “yo azuresfcontainer
“. Esse comando fará com que o helper do Service Fabric Container do Yoeman seja disparado. O helper irá solicitar algumas informações importantes para que ele consiga gerar o packaging do container para ser executado no cluster Service Fabric. A Listagem 3 apresenta as perguntas e respostas que forneci aqui no meu ambiente.
Listagem 3. Criado o pacote do container para o Service Fabric através do Yeoman
Linha a linha temos:
- Informamos o nome da aplicação que será empacotada. Você pode escolher qualquer nome que desejar.
- Nome do serviço da aplicação. Toda aplicação Service Fabric possui um ou mais serviços internos associados. Esta opção é para nomear estes serviços.
- Informamos o local onde se encontra a imagem Docker. Neste caso, apontamos direto para o Docker Hub.
- Não informamos nenhum comando específico (mas poderíamos).
- Informamos o número de nós inicial do cluster Service Fabric.
As linhas seguintes são emitidas pelo Yeoman para indicar a geração do pacote e a estrutura dos arquivos e diretórios. Na estrutura de arquivos e diretórios gerada você irá notar a presença de dois arquivos importantes para que seja possível ao container ser gerenciado pelo Service Fabric. O primeiro é o “ApplicationManifest.xml” e o segundo, “ServiceManifest.xml“. Como é possível inferir pela análise dos nomes, o primeiro agrupa configurações sobre a aplicação em si, enquanto o segundo, agrupa informações sobre o(s) serviço(s) associados a esta aplicação. Precisamos realizar algumas alterações nos arquivos originais para que tudo funcione adequadamente. Vamos iniciar pelo arquivo “ApplicationManifest”. Remova o conteúdo atual e substitua por aquele apresentado pela listagem 4.
Listagem 4. Arquivo “ApplicationManifest.xml”
Aspectos importantes nesse arquivo:
- Linhas 6 a 9: Adicionamos uma diretiva “ContainerHostPolicies” com o mapeamento das portas utilizadas pelo Minecraft (22575 e 22565). Nestas mesmas diretivas, adicionamos a referência para estes endpoints.
- Linha 15: Informamos que o serviço será stateless e ainda, informamos a quantidade de instâncias no cluster.
Agora, vamos fazer algumas alterações no arquivo “ServiceManifest.xml”. Da mesma maneira, remova o conteúdo atual do arquivo e, na sequência, adicione o conteúdo apresentado pela Listagem 5.
Listagem 5. Arquivo “ServiceManifest.xml”
Aspectos importantes nesse arquivo:
- Linhas 15 a 18: Adicionamos variáveis de ambiente relacionadas a aceitação dos termos do Minecraft e também quanto ao modelo de execução que o Service Fabric deverá considerar – neste caso, “creative”.
- Linhas 22 a 25: Fazemos a ligação (bind) dos serviços da aplicação com a aplicação em si através das referências criadas anteriormente no arquivo ApplicationManifest.
Pronto. Agora estamos prontos para colocar nossa aplicação para rodar em nosso cluster Service Fabric no Azure. Para isso, precisaremos o Azure Service Fabric SDK. Este componente nos entrega ferramentas de CLI para interagir com o cluster a partir de um host remoto. Para instalar o SDK e configurar seu ambiente, por favor, siga as instruções contidas neste link.
Com o CLI instalado e configurado, faremos o processo de publicação em duas etapas:
- Selecionaremos o cluster Service Fabric para o qual o container deverá ser despachado.
- Efetuaremos a instalação/publicação do container no cluster previamente configurado.
Para completar o passo 1, digite e execute em seu terminal a seguinte linha de comandos: “sfctl cluster select --endpoint http://<seu_cluster>.eastus2.cloudapp.azure.com:19080
“. Isso fará com que o CLI agent saiba onde a publicação deverá ocorrer.
Na sequência, navegue até o diretório onde o pacote foi gerado e execute o arquivo “install.sh
“. Isso fará com que as instâncias do Service Fabric sejam atualizadas com as informações dos arquivos “ServiceManifest” e “ApplicationManifest”. No final, você poderá ver a aplicação publicada no cluster Service Fabric, conforme ilustra a Figura 7.
Figura 7. Visão do cluster Service Fabric com a aplicação publicada
Agora que possuímos a aplicação já publicada, podemos testar a conexão de nosso client do Minecraft com o cluster remoto. A Figura 8 apresenta essa configuração.
Figura 8. Conectando o cliente do Minecraft com o cluster Service Fabric
Pronto. No momento seguinte, podemos ver que a aplicação cliente do Minecraft validou a conexão com nosso cluster (ver Figura 9).
Figura 9. Conexão realizada com sucesso
É isso. Agora é só iniciar o jogo selecionando o server remoto e tudo estará funcionando corretamente.
Por hoje é só. Espero que este texto possa lhe ajudar a entender um pouco melhor como podemos utilizar o Service Fabric para hospedar containers. Forte abraço e até a próxima!
Facebook
Twitter
Instagram
LinkedIn
RSS