Tutorial: Disponibilizando uma aplicação Quarkus no Kubernetes utilizando o Minikube e/ou DockerHub
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
Atenção: O Minikube não deve ser utilizado em ambiente de produção.
Pré-Requisitos para esse tutorial
- Instalar o Docker: https://docs.docker.com/engine/install/
- Instalar o Kubernetes: https://kubernetes.io/pt/docs/setup/
- Instalar o Kubeclt: https://kubernetes.io/docs/tasks/tools/
- Instalação do Minikube: https://minikube.sigs.k8s.io/docs/start/
- Open JDK 11+: https://openjdk.java.net/install/
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
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>
A extensão do
quarkus-minikube
poderia ter sido adicionada na linha de comando da criação da aplicação.
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.
Pod é a menor elemento do Kubernetes
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
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