Este blog mostrará como um aplicativo Java simples pode se comunicar com um banco de dados usando a descoberta de serviços no Kubernetes.

Descoberta de serviço com aplicativo Java e banco de dados no DC/OS explica por que a descoberta de serviços é um aspecto importante para um aplicativo com vários contêineres. Esse blog também explicou como isso pode ser feito no DC/OS.
Vamos ver como isso pode ser feito no Kubernetes com uma única instância do servidor de aplicativos e do servidor de banco de dados. Este blog usará o WildFly como servidor de aplicativos e o Couchbase como banco de dados.
Este blog usará as seguintes etapas principais:
- Iniciar o cluster de um nó do Kubernetes
- Definição do aplicativo Kubernetes
- Implantar o aplicativo
- Acesse o aplicativo
Iniciar o cluster do Kubernetes
Minikube é a maneira mais fácil de iniciar um cluster Kubernetes de um nó em uma VM em seu laptop. O binário precisa ser baixado primeiro e depois instalado.
As instruções completas de instalação estão disponíveis em github.com/kubernetes/minikube.
O versão mais recente pode ser instalado no OSX da mesma forma:
|
1 2 |
enrolar -Lo minikube https://storage.googleapis.com/minikube/releases/v0.17.1/minikube-darwin-amd64 \ && chmod +x minikube |
Também requer kubectl a ser instalado. Instalação e configuração do kubectl fornecem instruções detalhadas sobre como configurar o kubectl. No OSX, ele pode ser instalado como:
|
1 2 |
enrolar -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/darwin/amd64/kubectl \ && chmod +x ./kubectl |
Agora, inicie o cluster como:
|
1 2 3 4 5 6 7 8 9 10 11 |
minikube iniciar Início local Kubernetes agrupamento... Início VM... Download Minikube ISO 88.71 MB / 88.71 MB [==============================================] 100.00% 0s SSH-ing arquivos em VM... Configuração para cima certificados... Início agrupamento componentes... Conexão para agrupamento... Configuração para cima kubeconfig... Kubectl é agora configurado para uso o agrupamento. |
O versão do kubectl mostra mais detalhes sobre o cliente kubectl e a versão do servidor minikube:
|
1 2 3 |
kubectl versão Cliente Versão: versão.Informações{Maior:"1", Menor:"5", GitVersion:"v1.5.4", GitCommit:"7243c69eb523aa4377bce883e7c0dd76b84709a1", Estado do GitTree:"limpo", BuildDate:"2017-03-07T23:53:09Z", GoVersion:"go1.7.4", Compilador:"gc", Plataforma:"darwin/amd64"} Servidor Versão: versão.Informações{Maior:"1", Menor:"5", GitVersion:"v1.5.3", GitCommit:"029c3a408176b55c30846f0faedf56aae5992e9b", Estado do GitTree:"limpo", BuildDate:"1970-01-01T00:00:00Z", GoVersion:"go1.7.3", Compilador:"gc", Plataforma:"linux/amd64"} |
Mais detalhes sobre o cluster podem ser obtidos usando o comando kubectl cluster-info comando:
|
1 2 3 4 5 |
Kubernetes mestre é em execução em https://192.168.99.100:8443 KubeDNS é em execução em https://192.168.99.100:8443/api/v1/proxy/namespaces/kube-system/services/kube-dns kubernetes-painel de controle é em execução em https://192.168.99.100:8443/api/v1/proxy/namespaces/kube-system/services/kubernetes-dashboard Para mais depurar e diagnosticar agrupamento problemas, uso 'kubectl cluster-info dump'. |
Definição do aplicativo Kubernetes
A definição do aplicativo é definida em github.com/arun-gupta/kubernetes-java-sample/blob/master/service-discovery.yml. Ele consiste em:
- Um serviço Couchbase
- Conjunto de réplicas do Couchbase com um único pod
- Um conjunto de réplicas do WildFly com um único pod
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
Versão da API: v1 gentil: Serviço metadados: nome: couchbase-serviço especificação: seletor: aplicativo: couchbase-rs-cápsula portos: - nome: administrador porto: 8091 - nome: visualizações porto: 8092 - nome: consulta porto: 8093 - nome: memcached porto: 11210 --- Versão da API: extensões/v1beta1 gentil: ReplicaSet metadados: nome: couchbase-rs especificação: réplicas: 1 modelo: metadados: rótulos: aplicativo: couchbase-rs-cápsula especificação: contêineres: - nome: couchbase imagem: arungupta/couchbase:viagens portos: - containerPort: 8091 - containerPort: 8092 - containerPort: 8093 - containerPort: 11210 --- Versão da API: extensões/v1beta1 gentil: ReplicaSet metadados: nome: mosca selvagem-rs rótulos: nome: mosca selvagem especificação: réplicas: 1 modelo: metadados: rótulos: nome: mosca selvagem especificação: contêineres: - nome: mosca selvagem-rs-cápsula imagem: arungupta/mosca selvagem-couchbase-javaee:viagens env: - nome: COUCHBASE_URI valor: couchbase-serviço portos: - containerPort: 8080 |
A parte principal é onde o valor do COUCHBASE_URI é o nome do serviço do Couchbase. Isso permite que o aplicativo implantado no WildFly descubra dinamicamente o serviço e se comunique com o banco de dados.
arungupta/couchbase:travel A imagem do Docker é criada usando github.com/arun-gupta/couchbase-javaee/blob/master/couchbase/Dockerfile.
arungupta/wildfly-couchbase-javaee:travel A imagem do Docker é criada usando github.com/arun-gupta/couchbase-javaee/blob/master/Dockerfile.
O aplicativo Java EE espera que a inicialização do banco de dados seja concluída antes de começar a consultar o banco de dados. Isso pode ser visto em github.com/arun-gupta/couchbase-javaee/blob/master/src/main/java/org/couchbase/sample/javaee/Database.java#L25.
Implantar aplicativo
Esse aplicativo pode ser implantado como:
|
1 |
kubectl criar -f ~/espaços de trabalho/kubernetes-java-amostra/serviço-descoberta.yml |
A lista de serviços e o conjunto de réplicas podem ser exibidos com o comando kubectl get svc,rs:
|
1 2 3 4 5 6 7 8 |
NOME CLUSTER-IP EXTERNO-IP PORTO(S) IDADE serviço/couchbase-serviço 10.0.0.97 <nenhum> 8091/TCP,8092/TCP,8093/TCP,11210/TCP 27m serviço/kubernetes 10.0.0.1 <nenhum> 443/TCP 1h serviço/mosca selvagem-rs 10.0.0.252 <nenhum> 8080/TCP 21m NOME DESEJADO ATUAL PRONTO IDADE rs/couchbase-rs 1 1 1 27m rs/mosca selvagem-rs 1 1 1 27m |
Os registros da réplica única do Couchbase podem ser obtidos com o comando kubectl registra rs/couchbase-rs:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
++ definir -m ++ dormir 25 ++ /ponto de entrada.sh couchbase-servidor Início Couchbase Servidor -- Web IU disponível em http://:8091 e registros disponíveis em /opt/couchbase/var/lib/couchbase/logs ++ enrolar -v -X POST http://127.0.0.1:8091/pools/default -d memoryQuota=300 -d indexMemoryQuota=300 . . . {"storageMode":"memory_optimized","indexerThreads":0,"memorySnapshotInterval":200,"stableSnapshotInterval":5000,"maxRollbackPoints":5,"logLevel":"info"}[]Tipo: ++ eco 'Type: ' ++ '[' '' = TRABALHADOR ']' ++ fg 1 /ponto de entrada.sh couchbase-servidor |
Os registros do conjunto de réplicas do WildFly podem ser vistos usando o comando Registros do kubectl rs/wildfly-rs:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
========================================================================= JBoss Bootstrap Meio ambiente JBOSS_HOME: /optar/jboss/mosca selvagem . . . 06:32:08,537 INFORMAÇÕES [com.couchbase.cliente.núcleo.nó.Nó] (cb-io-1-1) Conectado para Nó couchbase-serviço 06:32:09,262 INFORMAÇÕES [com.couchbase.cliente.núcleo.configuração.Provedor de configuração] (cb-cálculos-3) Aberto balde viagens-amostra 06:32:09,366 INFORMAÇÕES [saída] (Serviço de servidor Tópico Piscina -- 65) Dormir para 3 segundos ... 06:32:12,369 INFORMAÇÕES [saída] (Serviço de servidor Tópico Piscina -- 65) Balde encontrado! 06:32:14,194 INFORMAÇÕES [org.jboss.fácil.resteasy_jaxrs.i18n] (Serviço de servidor Tópico Piscina -- 65) RESTEASY002225: Implementação javax.ws.rs.núcleo.Aplicativo: classe org.couchbase.amostra.javaee.MyApplication 06:32:14,195 INFORMAÇÕES [org.jboss.fácil.resteasy_jaxrs.i18n] (Serviço de servidor Tópico Piscina -- 65) RESTEASY002200: Adição classe recurso org.couchbase.amostra.javaee.Recursos de companhias aéreas de Aplicativo classe org.couchbase.amostra.javaee.MyApplication 06:32:14,310 INFORMAÇÕES [org.mosca selvagem.extensão.submergir] (Serviço de servidor Tópico Piscina -- 65) WFLYUT0021: Registrado web contexto: /companhias aéreas 06:32:14,376 INFORMAÇÕES [org.jboss.como.servidor] (Serviço de servidor Tópico Piscina -- 34) WFLYSRV0010: Implementado "airlines.war" (tempo de execução-nome : "airlines.war") 06:32:14,704 INFORMAÇÕES [org.jboss.como] (Controlador Bota Tópico) WFLYSRV0060: Http gerenciamento interface audição em http://127.0.0.1:9990/management 06:32:14,704 INFORMAÇÕES [org.jboss.como] (Controlador Bota Tópico) WFLYSRV0051: Administrador console audição em http://127.0.0.1:9990 06:32:14,705 INFORMAÇÕES [org.jboss.como] (Controlador Bota Tópico) WFLYSRV0025: WildFly Completo 10.1.0.Final (WildFly Núcleo 2.2.0.Final) iniciado em 29470ms - Iniciado 443 de 691 serviços (404 serviços são preguiçoso, passivo ou em-demanda) |
Aplicativo de acesso
O proxy kubectl inicia um proxy para o servidor da API do Kubernetes. Vamos iniciar um proxy do Kubernetes para acessar nosso aplicativo:
|
1 2 |
kubectl proxy Início para servir em 127.0.0.1:8001 |
Exponha o conjunto de réplicas do WildFly como um serviço usando:
|
1 |
kubectl expor --nome=mosca selvagem-serviço rs/mosca selvagem-rs |
A lista de serviços pode ser vista novamente usando kubectl get svc comando:
|
1 2 3 4 5 |
kubectl obter serviço NOME CLUSTER-IP EXTERNO-IP PORTO(S) IDADE couchbase-serviço 10.0.0.97 <nenhum> 8091/TCP,8092/TCP,8093/TCP,11210/TCP 41m kubernetes 10.0.0.1 <nenhum> 443/TCP 1h mosca selvagem-serviço 10.0.0.169 <nenhum> 8080/TCP 5s |
Agora, o aplicativo pode ser acessado em:
|
1 |
enrolar http://localhost:8001/api/v1/proxy/namespaces/default/services/wildfly-service/airlines/resources/airline |
Uma saída formatada tem a seguinte aparência:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
[ { "amostra de viagem": { "país": "Estados Unidos", "iata": "Q5", "indicativo": "MILE-AIR", "name" (nome): "40 milhas aéreas", "icao": "MLA", "id": 10, "tipo": "companhia aérea" } }, { "amostra de viagem": { "país": "Estados Unidos", "iata": "TQ", . . . "name" (nome): "Airlinair", "icao": "RLA", "id": 1203, "tipo": "companhia aérea" } } ] |
Agora, novos pods podem ser adicionados como parte do serviço do Couchbase, dimensionando o conjunto de réplicas. Os pods existentes podem ser encerrados ou reprogramados. Mas o aplicativo Java EE continuará a acessar o serviço de banco de dados usando o nome lógico.
Este blog mostrou como um aplicativo Java simples pode se comunicar com um banco de dados usando a descoberta de serviços no Kubernetes.
Para obter mais informações, confira:
- Documentos do Kubernetes
- Couchbase em contêineres
- Couchbase Portal do desenvolvedor
- Faça perguntas sobre Fóruns do Couchbase ou Estouro de pilha
- Baixar Couchbase
[...] Descoberta de serviço com aplicativo Java e banco de dados no Kubernetes [...]