Tutorial: Disponibilizando uma aplicação Quarkus no Kubernetes utilizando o Minikube e/ou DockerHub
Tags: quarkus, kubernetes, docker, minikube
Published: 2021-04-09 14:28:27



### 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](https://hub.docker.com/).

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/](https://www.docker.com/)

Site oficial do Kubernetes: [https://kubernetes.io/pt/](https://kubernetes.io/pt/)

Site oficial do Minikube: [https://minikube.sigs.k8s.io/docs/start/](https://minikube.sigs.k8s.io/docs/start/)

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

Site oficial do Quarkus: [https://quarkus.io/](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](https://www.linkedin.com/pulse/tutorial-criando-um-crud-utilizando-quarkus-java-rest-da-silva-melo/) | [Medium](https://medium.com/@marcus.paulo/tutorial-quarkus-do-zero-at%C3%A9-o-deploy-no-heroku-utilizando-quarkus-java-rest-cdi-panache-8d702caf451f)

**Tutorial: Criando um CRUD utilizando Quarkus Java + REST + CDI + Panache, Hibernate com Postgres (Docker) + Postman — **[LinkedIn](https://www.linkedin.com/pulse/tutorial-criando-um-crud-utilizando-quarkus-java-rest-da-silva-melo/) | [Medium](https://medium.com/@marcus.paulo/tutorial-criando-um-crud-utilizando-quarkus-java-rest-cdi-panache-hibernate-com-postgres-59793e0d7162)

**- Tutorial: Quarkus — Simplificando o Hibernate utilizando Panache — criando uma aplicação simples utilizando Quarkus Java + REST + CDI + Panache — **[Linkedin](https://www.linkedin.com/pulse/tutorial-quarkus-simplificando-o-hibernate-panache-da-silva-melo/) | [Medium](https://medium.com/@marcus.paulo/tutorial-quarkus-simplificando-o-hibernate-utilizando-panache-criando-uma-aplica%C3%A7%C3%A3o-simples-393134a58073)

> **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/](https://docs.docker.com/engine/install/)
-   Instalar o Kubernetes: [https://kubernetes.io/pt/docs/setup/](https://kubernetes.io/pt/docs/setup/)
-   Instalar o Kubeclt: [https://kubernetes.io/docs/tasks/tools/](https://kubernetes.io/docs/tasks/tools/)
-   Instalação do Minikube: [https://minikube.sigs.k8s.io/docs/start/](https://minikube.sigs.k8s.io/docs/start/)
-   Open JDK 11+: [https://openjdk.java.net/install/](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

![](https://cdn-images-1.medium.com/max/800/1*1YJUq5GO23ngM3RHTQanpQ.png)

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>
```

> 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:

![](https://cdn-images-1.medium.com/max/800/1*4sKtcmd1jXa3qd4Kf1B5aw.png)

### Consultando a imagem gerada

Utilizando o docker para consultar a imagem que foi gerada

```
docker image ls
```

```
**[Resultado]**REPOSITORY                        TAG              IMAGE ID       CREATED         SIZEmarcus/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 createddeployment.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   AGEkubernetes-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 -> 8080Forwarding from [::1]:8080 -> 8080Handling 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/](http://localhost:8080/)`

![](https://cdn-images-1.medium.com/max/800/1*7Stxh1OQC1cC2YdXiDMIoQ.png)

### 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](https://hub.docker.com/repositories)

![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a9ms65fbmifrtf0bverg.png)
 

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/container-image#quarkus-container-image_quarkus.container-image.registry)

[https://quarkus.io/guides/deploying-to-kubernetes](https://quarkus.io/guides/deploying-to-kubernetes)

[https://quarkus.io/guides/kubernetes-client](https://quarkus.io/guides/kubernetes-client)

[https://minikube.sigs.k8s.io/docs/handbook/registry/](https://minikube.sigs.k8s.io/docs/handbook/registry/)

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