Este blog mostrará cómo una simple aplicación Java puede hablar con una base de datos utilizando el descubrimiento de servicios en Kubernetes.

Descubrimiento de servicios con Java y aplicación de base de datos en DC/OS explica por qué el descubrimiento de servicios es un aspecto importante para una aplicación multicontenedor. Ese blog también explicaba cómo se puede hacer esto para DC/OS.
Vamos a ver cómo se puede lograr esto en Kubernetes con una sola instancia de servidor de aplicaciones y servidor de base de datos. Este blog utilizará WildFly para el servidor de aplicaciones y Couchbase para la base de datos.
Este blog utilizará los siguientes pasos principales:
- Iniciar clúster Kubernetes de un nodo
- Definición de la aplicación Kubernetes
- Despliegue de la aplicación
- Acceder a la aplicación
Iniciar clúster Kubernetes
Minikube es la forma más sencilla de iniciar un clúster Kubernetes de un nodo en una máquina virtual en su ordenador portátil. Primero hay que descargar el binario y luego instalarlo.
Las instrucciones completas de instalación están disponibles en github.com/kubernetes/minikube.
En último lanzamiento se puede instalar en OSX como:
|
1 2 |
rizo -Lo minikube https://storage.googleapis.com/minikube/releases/v0.17.1/minikube-darwin-amd64 \ && chmod +x minikube |
También requiere kubectl a instalar. Instalación y configuración de kubectl proporcionan instrucciones detalladas sobre cómo configurar kubectl. En OSX, se puede instalar como:
|
1 2 |
rizo -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 |
Ahora, inicie el clúster como:
|
1 2 3 4 5 6 7 8 9 10 11 |
minikube iniciar Inicio local Kubernetes grupo... Inicio VM... Descargar Minikube ISO 88.71 MB / 88.71 MB [==============================================] 100.00% 0s SSH-ing archivos en VM... Configuración arriba certificados... Inicio grupo componentes... Conexión a grupo... Configuración arriba kubeconfig... Kubectl es ahora configurado a utilice el grupo. |
En Versión de kubectl muestra más detalles sobre la versión del cliente kubectl y del servidor minikube:
|
1 2 3 |
kubectl versión Cliente Versión: versión.Información{Mayor:"1", Menor:"5", GitVersion:"v1.5.4", GitCommit:"7243c69eb523aa4377bce883e7c0dd76b84709a1", GitTreeState:"limpio", Fecha de construcción:"2017-03-07T23:53:09Z", GoVersion:"go1.7.4", Compilador:"gc", Plataforma:"darwin/amd64"} Servidor Versión: versión.Información{Mayor:"1", Menor:"5", GitVersion:"v1.5.3", GitCommit:"029c3a408176b55c30846f0faedf56aae5992e9b", GitTreeState:"limpio", Fecha de construcción:"1970-01-01T00:00:00Z", GoVersion:"go1.7.3", Compilador:"gc", Plataforma:"linux/amd64"} |
Se pueden obtener más detalles sobre el clúster utilizando la función kubectl cluster-info mando:
|
1 2 3 4 5 |
Kubernetes maestro es corriendo en https://192.168.99.100:8443 KubeDNS es corriendo en https://192.168.99.100:8443/api/v1/proxy/namespaces/kube-system/services/kube-dns kubernetes-salpicadero es corriendo en https://192.168.99.100:8443/api/v1/proxy/namespaces/kube-system/services/kubernetes-dashboard A más depurar y diagnosticar grupo problemas, utilice 'kubectl cluster-info dump'. |
Definición de la aplicación Kubernetes
La definición de la aplicación se define en github.com/arun-gupta/kubernetes-java-sample/blob/master/service-discovery.yml. Consta de:
- Un servicio Couchbase
- Conjunto de réplicas Couchbase con un único pod
- Un juego de réplicas WildFly con una sola vaina
|
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 |
apiVersion: v1 amable: Servicio metadatos: nombre: couchbase-servicio spec: selector: aplicación: couchbase-rs-vaina puertos: - nombre: admin puerto: 8091 - nombre: vistas puerto: 8092 - nombre: consulta puerto: 8093 - nombre: memcached puerto: 11210 --- apiVersion: extensiones/v1beta1 amable: ReplicaSet metadatos: nombre: couchbase-rs spec: réplicas: 1 plantilla: metadatos: etiquetas: aplicación: couchbase-rs-vaina spec: contenedores: - nombre: couchbase imagen: arungupta/couchbase:viaje puertos: - containerPort: 8091 - containerPort: 8092 - containerPort: 8093 - containerPort: 11210 --- apiVersion: extensiones/v1beta1 amable: ReplicaSet metadatos: nombre: mosca salvaje-rs etiquetas: nombre: mosca salvaje spec: réplicas: 1 plantilla: metadatos: etiquetas: nombre: mosca salvaje spec: contenedores: - nombre: mosca salvaje-rs-vaina imagen: arungupta/mosca salvaje-couchbase-javaee:viaje env: - nombre: COUCHBASE_URI valor: couchbase-servicio puertos: - containerPort: 8080 |
La parte clave es donde el valor del COUCHBASE_URI es el nombre del servicio Couchbase. Esto permite que la aplicación desplegada en WildFly descubra dinámicamente el servicio y se comunique con la base de datos.
arungupta/couchbase:travel La imagen Docker se crea utilizando github.com/arun-gupta/couchbase-javaee/blob/master/couchbase/Dockerfile.
arungupta/wildfly-couchbase-javaee:travel La imagen Docker se crea utilizando github.com/arun-gupta/couchbase-javaee/blob/master/Dockerfile.
La aplicación Java EE espera a que se complete la inicialización de la base de datos antes de empezar a consultarla. Esto puede verse en github.com/arun-gupta/couchbase-javaee/blob/master/src/main/java/org/couchbase/sample/javaee/Database.java#L25.
Despliegue de la aplicación
Esta aplicación puede desplegarse como:
|
1 |
kubectl crear -f ~/espacios de trabajo/kubernetes-java-muestra/servicio-descubrimiento.yml |
La lista de servicios y conjuntos de réplicas puede mostrarse utilizando el comando kubectl get svc,rs:
|
1 2 3 4 5 6 7 8 |
NOMBRE CLÚSTER-IP EXTERNO-IP PUERTO(S) EDAD svc/couchbase-servicio 10.0.0.97 <ninguno> 8091/TCP,8092/TCP,8093/TCP,11210/TCP 27m svc/kubernetes 10.0.0.1 <ninguno> 443/TCP 1h svc/mosca salvaje-rs 10.0.0.252 <ninguno> 8080/TCP 21m NOMBRE DESEADO ACTUAL LISTO EDAD rs/couchbase-rs 1 1 1 27m rs/mosca salvaje-rs 1 1 1 27m |
Los registros de la réplica única de Couchbase pueden obtenerse utilizando el comando kubectl logs rs/couchbase-rs:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
++ configure -m ++ dormir 25 ++ /punto de entrada.sh couchbase-servidor Inicio Couchbase Servidor -- Web INTERFAZ DE USUARIO disponible en http://:8091 y registros disponibles en /opt/couchbase/var/lib/couchbase/logs ++ rizo -v -X POST http://127.0.0.1:8091/pools/default -d memoryQuota=300 -d indexMemoryQuota=300 . . . {"storageMode":"memoria_optimizada","indexerThreads":0,"memorySnapshotInterval":200,"stableSnapshotInterval":5000,"maxRollbackPoints":5,"logLevel":"info"}[]Tipo: ++ echo 'Tipo: ' ++ '[' '' = TRABAJADOR ']' ++ fg 1 /punto de entrada.sh couchbase-servidor |
Los registros del conjunto de réplicas de WildFly pueden verse utilizando el comando kubectl logs rs/wildfly-rs:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
========================================================================= JBoss Bootstrap Medio ambiente JBOSS_HOME: /op/jboss/mosca salvaje . . . 06:32:08,537 INFO [com.couchbase.cliente.núcleo.nodo.Nodo] (cb-io-1-1) Conectado a Nodo couchbase-servicio 06:32:09,262 INFO [com.couchbase.cliente.núcleo.config.ConfigurationProvider] (cb-cálculos-3) Abierto cubo viaje-muestra 06:32:09,366 INFO [stdout] (ServicioServidor Hilo Piscina -- 65) Para dormir para 3 segs ... 06:32:12,369 INFO [stdout] (ServicioServidor Hilo Piscina -- 65) Cubo encontrado! 06:32:14,194 INFO [org.jboss.descansa.resteasy_jaxrs.i18n] (ServicioServidor Hilo Piscina -- 65) RESTEASY002225: Despliegue de javax.ws.rs.núcleo.Aplicación: clase org.couchbase.muestra.javaee.MiAplicación 06:32:14,195 INFO [org.jboss.descansa.resteasy_jaxrs.i18n] (ServicioServidor Hilo Piscina -- 65) RESTEASY002200: Añadir clase recurso org.couchbase.muestra.javaee.AerolíneaRecurso de Aplicación clase org.couchbase.muestra.javaee.MiAplicación 06:32:14,310 INFO [org.mosca salvaje.extensión.resaca] (ServicioServidor Hilo Piscina -- 65) WFLYUT0021: Registrado web contexto: /líneas aéreas 06:32:14,376 INFO [org.jboss.como.servidor] (ServicioServidor Hilo Piscina -- 34) WFLYSRV0010: Desplegado "airlines.war" (tiempo de ejecución-nombre : "airlines.war") 06:32:14,704 INFO [org.jboss.como] (Controlador Bota Hilo) WFLYSRV0060: Http gestión interfaz escuchando en http://127.0.0.1:9990/management 06:32:14,704 INFO [org.jboss.como] (Controlador Bota Hilo) WFLYSRV0051: Admin consola escuchando en http://127.0.0.1:9990 06:32:14,705 INFO [org.jboss.como] (Controlador Bota Hilo) WFLYSRV0025: WildFly Completo 10.1.0.Final (WildFly Núcleo 2.2.0.Final) iniciado en 29470ms - Comenzó 443 de 691 servicios (404 servicios son perezoso, pasivo o en-demanda) |
Solicitud de acceso
En kubectl proxy inicia un proxy al servidor API de Kubernetes. Iniciemos un proxy de Kubernetes para acceder a nuestra aplicación:
|
1 2 |
kubectl proxy Inicio a servir en 127.0.0.1:8001 |
Exponga el conjunto de réplicas de WildFly como un servicio mediante:
|
1 |
kubectl exponer --nombre=mosca salvaje-servicio rs/mosca salvaje-rs |
La lista de servicios puede verse de nuevo utilizando kubectl get svc mando:
|
1 2 3 4 5 |
kubectl consiga svc NOMBRE CLÚSTER-IP EXTERNO-IP PUERTO(S) EDAD couchbase-servicio 10.0.0.97 <ninguno> 8091/TCP,8092/TCP,8093/TCP,11210/TCP 41m kubernetes 10.0.0.1 <ninguno> 443/TCP 1h mosca salvaje-servicio 10.0.0.169 <ninguno> 8080/TCP 5s |
Ahora, la aplicación es accesible en:
|
1 |
rizo http://localhost:8001/api/v1/proxy/namespaces/default/services/wildfly-service/airlines/resources/airline |
El formato de salida es el siguiente:
|
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 |
[ { "viaje-muestra": { "país": "Estados Unidos", "iata": "Q5", "Indicativo": "MILE-AIR", "nombre": "40-Mile Air", "icao": "MLA", "id": 10, "tipo": "aerolínea" } }, { "viaje-muestra": { "país": "Estados Unidos", "iata": "TQ", . . . "nombre": "Airlinair", "icao": "RLA", "id": 1203, "tipo": "aerolínea" } } ] |
Ahora, se pueden añadir nuevos pods como parte del servicio Couchbase escalando el conjunto de réplicas. Los pods existentes pueden ser terminados o reprogramados. Pero la aplicación Java EE seguirá accediendo al servicio de base de datos utilizando el nombre lógico.
Este blog mostró cómo una simple aplicación Java puede hablar con una base de datos utilizando el descubrimiento de servicios en Kubernetes.
Para más información, consulte:
- Documentación sobre Kubernetes
- Couchbase en contenedores
- Couchbase Portal para desarrolladores
- Haga preguntas sobre Foros de Couchbase o Stack Overflow
- Descargar Couchbase
[...] Descubrimiento de servicios con Java y aplicación de base de datos en Kubernetes [...]