Tutorial: Disponibilizando uma aplicação Quarkus no Kubernetes utilizando o Minikube e/ou DockerHub

https://www.flickr.com/photos/marcus-paulo/4148555853/

Introdução

O objetivo deste artigo é criar uma aplicação simples no Quarkus e em seguida mostrar como disponibilizar esta aplicação no Minikube (Kubernetes para testes na máquina local) e em seguida, como podemos enviar a imagem gerada para o repositório de imagens do Docker, que é o Dockerhub.

Para saber mais sobre o Kubernetes (K8S), Docker, Minikube, Kubectl e do Quarkus, eu recomendo as seguintes leituras:

Leituras adicionais

Site oficial do Docker: https://www.docker.com/

Site oficial do Kubernetes: https://kubernetes.io/pt/

Site oficial do Minikube: https://minikube.sigs.k8s.io/docs/start/

Minikube (Kubernetes): https://kubernetes.io/pt/docs/tutorials/kubernetes-basics/create-cluster/cluster-intro/

Site oficial do Quarkus: https://quarkus.io/

Publicações:

Tutorial: Quarkus do Zero até o Deploy no Heroku, utilizando Quarkus Java + REST + CDI + Panache, Hibernate com Postgres + Postman LinkedIn | Medium

Tutorial: Criando um CRUD utilizando Quarkus Java + REST + CDI + Panache, Hibernate com Postgres (Docker) + Postman — LinkedIn | Medium

- Tutorial: Quarkus — Simplificando o Hibernate utilizando Panache — criando uma aplicação simples utilizando Quarkus Java + REST + CDI + Panache — Linkedin | Medium

Pré-Requisitos para esse tutorial

Para iniciar, vamos criar uma simples aplicação no Quarkus, seguindo os passos abaixo:

Criar o projeto no Quarkus

mvn io.quarkus:quarkus-maven-plugin:1.13.0.Final:create \\
-DprojectGroupId=br.com.mp \\
-DprojectArtifactId=kubernetes-quarkus \\
-DclassName="br.com.mp.kubernetes.quarkus.rest.GreetingResource" \\
-Dpath="/hello" \\
-Dextensions="resteasy,kubernetes,jib"

Entre na pasta do projeto

cd kubernetes-quarkus

Testando o projeto

mvn quarkus:dev

Resultado

Executando uma aplicação Quarkus pela linha de comando

Adicionando a dependência do Minikube

mvn quarkus:add-extension -Dextensions="quarkus-minikube"

Ou diretamente no Pom.xml

<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-minikube</artifactId>
</dependency>

Definindo o Minikube como Container Registry local

Para transformar o Minikube em um Container Registry local (um repositório de imagens), basta executar a linha abaixo no terminal.

eval $(minikube -p minikube docker-env)

Gerando a imagem do Docker

No próximo passo, será criada uma imagem Docker contendo a aplicação

mvn package -Dquarkus.container-image.build=true

Geração dos manifestos

Após a criação da imagem, será gerada os manifestos do Kubernetes e Minikube, na pasta “/target/kubernetes”, conforme a imagem abaixo:

Consultando a imagem gerada

Utilizando o docker para consultar a imagem que foi gerada

docker image ls**[Resultado]**
REPOSITORY TAG IMAGE ID CREATED SIZE
marcus/kubernetes-quarkus-teste 1.0.0-SNAPSHOT e574987218c4 3 minutes ago 199MB

Com a imagem já no Container Registry do Minikube, basta aplicar o manifesto do “minikube.yml”

Aplicando os manifestos do Minikube

kubectl apply -f target/kubernetes/minikube.yml                        [Resultado]
service/kubernetes-quarkus-teste created
deployment.apps/kubernetes-quarkus-teste created

Após alguns segundos, a aplicação estará disponível. No próximo comando, vamos listar os PODS.

Consultando os PODS

kubectl get po[Resultado]
NAME READY STATUS RESTARTS AGE
kubernetes-quarkus-teste-54db4f8df8-gf7nf 1/1 Running 0 6m52s

Port-Forward para acessar na máquina local

Para acessar a aplicação, é necessário redirecionar o endereço do Minikube para a máquina local, através do comando Port-forward, para isso, copie o nome exato do seu pod, conforme demonstrado abaixo:

kubectl port-forward pod/kubernetes-quarkus-teste-54db4f8df8-gf7nf 8080:8080                     [Resultado]
Forwarding from 127.0.0.1:8080 -> 8080
Forwarding from [::1]:8080 -> 8080
Handling connection for 8080

Acessando a aplicação que foi disponibilizada pelo Minikube

Para acessar a aplicação, basta acessar o endereço: http://localhost:8080/

Enviando a imagem para o Dockerhub

A partir de agora, enviaremos a imagem docker da Aplicação para o repositório de imagens do Dockerhub.

Enviando a imagem para o Dockerhub

mvn clean package -Dquarkus.container-image.push=true

Erro ao enviar a imagem para o Dockerhub

Erro:Caused by: com.google.cloud.tools.jib.api.RegistryUnauthorizedException: Unauthorized for registry-1.docker.io/marcus/kubernetes-quarkus-teste
[ERROR] at com.google.cloud.tools.jib.registry.RegistryEndpointCaller.call(RegistryEndpointCaller.java:164)
[ERROR]

Caso ocorra o problema acima, é necessário realizar alguns procedimentos:

1 — No terminal, faça o login na sua conta do Dockerhub

docker login

2 — A imagem do Docker é criada de acordo com o nome do seu usuário do seu computador, no meu caso, a imagem foi criada como marcus/kubernetes-quarkus, porém, o meu usuário no Dockerhub é marcuspaulo.

Caso este seja o seu problema, basta definir o nome do seu usuário dentro das configurações no arquivo de propriedades (application.properties) do Quarkus, conforme a linha abaixo:

quarkus.container-image.group=marcuspaulo

Enviando para o Dockerhub

mvn clean package -Dquarkus.container-image.push=true

Consultando a imagem no Dockerhub, através do endereço: https://hub.docker.com/repositories

Repositório do Dockerhub

Espero que vocês tenham gostado, fico muito agradecido com o seu like e com o compartilhamento deste post, muito obrigado e até a próxima.

Código-fonte

https://github.com/marcuspaulo/kubernetes-quarkus

Referências

https://quarkus.io/guides/container-image#quarkus-container-image_quarkus.container-image.registry

https://quarkus.io/guides/deploying-to-kubernetes

https://quarkus.io/guides/kubernetes-client

https://minikube.sigs.k8s.io/docs/handbook/registry/

https://haralduebele.blog/2020/04/03/deploy-your-quarkus-applications-on-kubernetes-almost-automatically/

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store