Conteúdo


Deploy de uma aplicação Web com .NET Core em Kubernetes

Comments

A adoção em maior escala do docker, a popularização Kubernetes em provedores de nuvem como o IBM Cloud Kubernetes Services, e a evolução do .NET Core tem atraído cada vez mais desenvolvedores do universo .NET para o ambiente de containers. Há muito material disponível na Internet sobre todos esses assuntos, mas de forma desconectada. Nesse tutorial de duas partes, será apresentado como fazer o deploy de uma aplicação Web (parte 1) e uma outra console (parte 2), ambas desenvolvidas com .NET Code 2.0 e usando o IBM Cloud Kubernetes Services.
O objetivo desse tutorial é fazer com que seja possível entender como essas tecnologias podem ser utilizadas em conjunto, entretanto não iremos aqui nos aprofundar em cada uma delas.
Ao longo do texto, indicarei outras referencias para expandir e aprofundar o seu conhecimento.

O que será necessário para desenvolver o aplicativo

Para conseguir executar esse tutorial você deverá ter um conjunto de ferramentas instalado na sua estação de trabalho.

São elas:

Obs.: Alguns screenshots foram feitos com a CLI de IBM Cloud chamado bx, entretanto o funcionamento com a nova versão da CLI com o CLI ibmcloud tem o mesmo funcionamento e sintaxe.

Criando uma aplicação Web com ASP.NET Core de exemplo e testando localmente

A aplicação Web será um exemplo que você pode baixar do seguinte repositório no github: https://github.com/dotnet/dotnet-docker-samples/

pic 1

pic 1

Uma vez concluído o download da aplicação de exemplo. Vamos construir e executa-la através do comando dotnet run, dentro do diretório aspnetapp.

pic 2

pic 2

Nesse momento a aplicação .NET Core esta no ar na sua estação de trabalho e ouvindo na porta 5000. Abra seu navegador e certifique-se de que a aplicação Web está acessível.

pic 3

pic 3

Interrompa a execução da aplicação com o Ctrl+C para a sequencia desse tutorial.

Empacotando sua aplicação .NET Core Web em um docker container

Agora que você garantiu que a aplicação foi construída e está funcionando adequadamente no seu ambiente, o próximo passo será encapsular essa aplicação em uma imagem docker com o a camada do .NET Core, já nos preparando para no futuro estar mais preparado para rodar essa aplicação no Kubernetes.

Para ficar mais fácil de entender o que estamos fazendo, decidi mudar uma mensagem da página principal da aplicação de exemplo de baixamos do github. Eu usei o Visual Studio Code como o IDE para essa alteração no HTML, mas você poderá usar qualquer editor de sua preferencia.

picture 4

picture 4

No arquivo index.cshtml, na linha 17 alterei a frase Learn how to build ASP.NET apps that can run anywhere para I am running on a docker container now !!!

pic 5

pic 5

Na sequencia devemos criar o arquivo Dockerfile dentro do diretório raiz do projeto. Esse é o arquivo essencial para a criação da imagem com o docker build.

Código:

FROM microsoft/aspnetcore-build:2.0 AS build-env
WORKDIR /app

# copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

# copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out

# build runtime image
FROM microsoft/aspnetcore:2.0
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "aspnetapp.dll"]

pic 6

pic 6

Obs.: Nesse exemplo, para fins de simplicidade foi utilizada a imagem base microsoft/aspnetcore-build:2.0, pois a mesma inclui o .NET core SDK e o runtime, porem em um ambiente de produção você poderá adotar outra estratégia utilizando uma imagem base mais enxuta, como destacado nesse artigo do Andrew Lock (https://andrewlock.net/exploring-the-net-core-docker-files-dotnet-vs-aspnetcore-vs-aspnetcore-build/#2microsoftdotnet203runtime).

Com o HTML alterado e o arquivo Dockerfile criado, está na hora de criarmos uma imagem com a aplicação web empacotada. Na sequencia o comando docker build e docker run serão executados para construir a imagem e já testar a aplicação sendo executada dentro de um container. Lembre-se que para esses passos voce deverá ter o docker instalado no seu ambiente de trabalho.

Dentro do terminal, mude para o diretório do seu projeto e onde esta o Dockerfile e execute o seguinte comando para construir a imagem e fazer o tag (etiqueta) como aspnetcontainerapp. Não esqueça do ponto no final do comando. Esse ponto indica que o Dockerfile esta no diretório corrente.

docker build -t aspnetcontainerapp.

Pic 7

Pic 7

As camadas (layers) da imagem base (FROM do Dockerfile) serão trazidas para sua estação de trabalho como parte do processo de build do docker.

Pic 8

Pic 8

Cada passo do Dockerfile é executado até o final, quando por fim a imagem é totalmente criada e marcada com a tag aspnetcontainerapp

Pic 9
Pic 9

Para verificar que a imagem foi devidamente criada, marcada e está disponível, execute o comando docker images, e veja a imagem aspnetcontainerapp listada entre as outras imagens disponíveis no seu repositório local.

Pic 10
Pic 10

Chegou o momento de executarmos essa aplicação dentro de um container docker. Execute o seguinte comando.

docker run -p 80:80 --name aspnet_minhaapp aspnetcontainerapp

Pic 11
Pic 11

Abra o navegador em localhost e veja a página web com a nova mensagem. Dessa vez a aplicação esta rodando dentro de um container docker que você acabou de criar.

Pic 12
Pic 12

Em uma outra janela de terminal você pode ver o processo desse container em execução através do comando docker ps

Pic 13
Pic 13

Na janela do terminal onde o docker run está executando, aperte Ctrl+C para interromper a execução do container, e depois remova completamente esse container com docker stop e docker rm. Lembre-se de usar o CONTAINER_ID apresentado para você, os quais são diferentes da imagem

Pic 14
Pic 14

Preparando o Kubernetes em IBM Cloud

Até aqui construímos uma aplicação Web com o .NET Core, a encapsulamos dentro de uma imagem docker, fizemos os devidos testes localmente, mas agora chegou o momento de encontrar uma nova casa para essa aplicação.

Vamos nos preparar para fazer o deploy dessa aplicação em um cluster Kubernetes dentro da IBM Cloud.
Nessa ultima etapa é necessário que você tenha uma conta na IBM Cloud. Caso ainda não tenha, esta na hora de fazer sua inscrição totalmente gratuita, onde você poderá aproveitar a camada Lite com diversos serviços e recursos disponíveis dentro da camada gratuita como Banco de Dados, Watson e Kubernetes e muito mais.

Faça sua inscrição aqui: https://console.bluemix.net/

Pic 15

Pic 15

Feita a inscrição, faça o login e clique no menu catálogo, para listar todos os serviços disponíveis dentro de IBM Cloud, incluindo serviços de infraestrutura e plataforma como máquinas virtuais, containers e Watson.
No menu do lado esquerdo, selecione a opção Containers, e na sequencia Containers in Kubernetes Clusters.

Pic 16
Pic 16

Vamos criar um cluster Kubernetes dentro da camada gratuita. Selecione o botão Create

Pic 17
Pic 17

Na tela seguinte devemos escolher o tipo de cluster que será criado, e devemos também escolher um nome para esse cluster Kubernetes.
Para fins de aprendizado e experimentação, nesse tutorial iremos escolher o cluster type gratuito (Free). No futuro, para um cluster Kubernetes além da experimentação, você deverá escolher um cluster do tipo Standard, onde há diferentes opções de worker nodes, além disso você também pode atender questões com HA (alta disponibilidade), inclusive podendo escolher o deploy desse cluster no data center de São Paulo da IBM Cloud Pic 18
Pic 18

Logo após clicar no botão Create Cluster, um cluster Kubernetes começará a ser preparado para você, e isso levará alguns minutos, como indicado pelo status Deploying.

Pic 19
Pic 19

Tome uma água ou um café, enquanto espera que o cluster esteja totalmente preparado e disponível para uso, quando indicado pelo State Ready.

Pic 20
Pic 20

Uma vez que o cluster esteja pronto para uso, uma recomendação é seguir as instruções da tela Access, onde você irá instalar e configurar sua estação de trabalho para usar os CLI de IBM Cloud e do Kubernetes

Pic 21
Pic 21

Pic 22
Pic 22

Seguindo as instruções da tela Access, caso você tente acessar o cluster enquanto ele ainda não esteja totalmente pronto, você poderá encontrar erros como indicado.

Pic 23
Pic 23

Espere mais alguns minutos e repita a operação. Como indicado prepare a variável de ambiente KUBECONFIG para dar acesso ao seu cluster para o comando kubectl

Pic 24
Pic 24

Um lugar para a sua imagem ficar – Image Registry

Agora que você esta com o cluster preparado, precisamos ainda enviar a imagem docker que criamos nos passos anteriores para um registro (repositório) de imagens. Utilizando IBM Cloud você tem acesso a um repositório onde pode manter suas imagens de forma privada. Temos mais uma etapa de preparação aqui, que é preparar o acesso a esse registro e enviar a imagem que criamos para lá.
Para acessar a página com mais detalhes sobre o registro, no menu Access da pagina de configuração do cluster Kubernetes, no final da página pode-se encontrar uma indicação com link para o repositório de imagens. Pic 25

Pic 25

Após escolher a opção de criar o seu registro, você será direcionado para a página com instruções para criar o repositório e subir a imagem. Siga os passos da página Quick Start

Pic 26
Pic 26

Pic 27
Pic 27

Nesse momento, temos que preparar o nosso container aspnetcontainerapp com um tag que indique que queremos uma copia dele dentro do seu repositório de imagens privado em IBM Cloud. Execute o comando abaixo para fazer essa marcação (tag). Perceba que parte do nome deve incluir o endereço do repositório de imagens em IBM Cloud, nesse caso registry.ng.bluemix.net

docker tag aspnetcontainerapp registry.ng.bluemix.net/giublog/aspnetcontainerapp:1.0

Através do comando docker images, verifique que a imagem foi marcada como previmos

Pic 28
Pic 28

O próximo passo é realmente enviar a imagem para o repositório em IBM Cloud, para isso você deve usar o comando docker push registry.ng.bluemix.net/giublog/aspnetcontainerapp:1.0

Obs.: Um exemplo do comando docker push incluindo o namespace que você criou durante a preparação do registro está disponível na página de Quick Start. Você deverá substituir o giublog desse exemplo pelo namespace que você criou.

Pic 29
Pic 29

Quando concluído o comando, e todas as camadas da imagem terem sido movidas para a o registro, execute o comando ibmcloud cr image-list (ou bx cr image-list) e certifique-se de que a imagem realmente é listada. Esse comando é análogo ao docker imagens, porém as imagens do registro em IBM Cloud são listadas aqui.

Pic 30
Pic 30

Você também pode conferir essa informação através da página web, visitando o menu Private Repositories

Pic 31
Pic 31

Estamos com quase tudo preparado ate aqui. Construímos a aplicação, a empacotamos em uma imagem docker, criamos um cluster Kubernetes e subimos para um repositório de imagem. Agora temos que colocar isso para funcionar dentro do no nosso cluster Kubernetes.

Chegou a hora de executar no Kubernetes

Como o objetivo desse tutorial não é explorar o Kubernetes profundamente, o caminho que escolhi foi fazer um deploy pelo caminho mais simples possível. Naturalmente poderíamos explorar outras formas de configurar nossas aplicações no Kuberntes (através arquivos YAML por exemplo), mas vamos seguir no caminho mais curto.

Execute o comando abaixo para criar um deployment apontando para a imagem que você subiu no registro.

kubectl run aspnetapp-deployment --image=registry.ng.bluemix.net/giublog/aspnetcontainerapp:1.0

E na sequencia execute o comando kubectl get pods

Pic 32

Pic 32

O resultado indica que temos 1 instancia do pod com a nossa aplicação funcionando, mas para poder acessá-la pela rede ainda precisamos criar um Service no Kubernetes. Execute o seguinte comando para expor essa aplicação pela rede.

kubectl expose deployment/aspnetapp-deployment --type=NodePort --port=80 --name=aspnetapp-service --target-port=80

Vamos descobrir mais detalhes de como essa aplicação foi exposta através do comando kubectl describe service aspnetapp-service

Pic 33
Pic 33

Na linha NodePort, tome nota da porta TCP que foi definida pelo Kubernetes para esse serviço, iremos precisar desse numero mais adiante.

Estamos quase lá, agora precisamos conhecer o IP público do worker node onde o pod da aplicação esta em execução. Execute bx cs workers meuclusterk8s, substitua o meuclusterk8s pelo nome que você utilizou na criação do cluster, caso seja outro.

Pic 34
Pic 34

Agora sim, basta combinarmos o IP publico + porta do service (NodePort), e testar isso no seu navegador.

Pic 35
Pic 35

Conclusão

É isso aí, chegamos ao fim, foi um longo caminho até aqui pois usamos diferentes tecnologias. Relembrando como você avançou nesse tutorial, primeiro construiu e testou uma aplicação Web .NET Core localmente, depois você criou uma imagem docker do .NET Core com a sua aplicação dentro, criou um cluster Kubernetes e um repositório de imagens dentro de IBM Cloud, e por fim fez um deployment Kubernetes por linha de comando até conseguir testar sua aplicação rodando completamente dentro do Kubernetes.
Na próxima e ultima parte desse tutorial, iremos percorrer um caminho parecido, mas dessa vez você criará uma aplicação console com .NET Core, e testará dentro do Kubernetes mais um vez

Referências


Recursos para download


Comentários

Acesse ou registre-se para adicionar e acompanhar os comentários.

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Cloud computing
ArticleID=1061982
ArticleTitle=Deploy de uma aplicação Web com .NET Core em Kubernetes
publish-date=06152018