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 |
curl -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 |
curl -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 start Starting local Kubernetes cluster... Starting VM... Downloading Minikube ISO 88.71 MB / 88.71 MB [==============================================] 100.00% 0s SSH-ing files into VM... Setting up certs... Starting cluster components... Connecting to cluster... Setting up kubeconfig... Kubectl is now configured to use the cluster. |
En Versión de kubectl muestra más detalles sobre la versión del cliente kubectl y del servidor minikube:
|
1 2 3 |
kubectl version Client Version: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.4", GitCommit:"7243c69eb523aa4377bce883e7c0dd76b84709a1", GitTreeState:"clean", BuildDate:"2017-03-07T23:53:09Z", GoVersion:"go1.7.4", Compiler:"gc", Platform:"darwin/amd64"} Server Version: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.3", GitCommit:"029c3a408176b55c30846f0faedf56aae5992e9b", GitTreeState:"clean", BuildDate:"1970-01-01T00:00:00Z", GoVersion:"go1.7.3", Compiler:"gc", Platform:"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 master is running at https://192.168.99.100:8443 KubeDNS is running at https://192.168.99.100:8443/api/v1/proxy/namespaces/kube-system/services/kube-dns kubernetes-dashboard is running at https://192.168.99.100:8443/api/v1/proxy/namespaces/kube-system/services/kubernetes-dashboard To further debug and diagnose cluster problems, use '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 kind: Service metadata: name: couchbase-service spec: selector: app: couchbase-rs-pod ports: - name: admin port: 8091 - name: views port: 8092 - name: query port: 8093 - name: memcached port: 11210 --- apiVersion: extensions/v1beta1 kind: ReplicaSet metadata: name: couchbase-rs spec: replicas: 1 template: metadata: labels: app: couchbase-rs-pod spec: containers: - name: couchbase image: arungupta/couchbase:travel ports: - containerPort: 8091 - containerPort: 8092 - containerPort: 8093 - containerPort: 11210 --- apiVersion: extensions/v1beta1 kind: ReplicaSet metadata: name: wildfly-rs labels: name: wildfly spec: replicas: 1 template: metadata: labels: name: wildfly spec: containers: - name: wildfly-rs-pod image: arungupta/wildfly-couchbase-javaee:travel env: - name: COUCHBASE_URI value: couchbase-service ports: - 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 create -f ~/workspaces/kubernetes-java-sample/service-discovery.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 |
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE svc/couchbase-service 10.0.0.97 <none> 8091/TCP,8092/TCP,8093/TCP,11210/TCP 27m svc/kubernetes 10.0.0.1 <none> 443/TCP 1h svc/wildfly-rs 10.0.0.252 <none> 8080/TCP 21m NAME DESIRED CURRENT READY AGE rs/couchbase-rs 1 1 1 27m rs/wildfly-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 |
++ set -m ++ sleep 25 ++ /entrypoint.sh couchbase-server Starting Couchbase Server -- Web UI available at https://<ip>:8091 and logs available in /opt/couchbase/var/lib/couchbase/logs ++ curl -v -X POST https://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"}[]Type: ++ echo 'Type: ' ++ '[' '' = WORKER ']' ++ fg 1 /entrypoint.sh couchbase-server |
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 Environment JBOSS_HOME: /opt/jboss/wildfly . . . 06:32:08,537 INFO [com.couchbase.client.core.node.Node] (cb-io-1-1) Connected to Node couchbase-service 06:32:09,262 INFO [com.couchbase.client.core.config.ConfigurationProvider] (cb-computations-3) Opened bucket travel-sample 06:32:09,366 INFO [stdout] (ServerService Thread Pool -- 65) Sleeping for 3 secs ... 06:32:12,369 INFO [stdout] (ServerService Thread Pool -- 65) Bucket found! 06:32:14,194 INFO [org.jboss.resteasy.resteasy_jaxrs.i18n] (ServerService Thread Pool -- 65) RESTEASY002225: Deploying javax.ws.rs.core.Application: class org.couchbase.sample.javaee.MyApplication 06:32:14,195 INFO [org.jboss.resteasy.resteasy_jaxrs.i18n] (ServerService Thread Pool -- 65) RESTEASY002200: Adding class resource org.couchbase.sample.javaee.AirlineResource from Application class org.couchbase.sample.javaee.MyApplication 06:32:14,310 INFO [org.wildfly.extension.undertow] (ServerService Thread Pool -- 65) WFLYUT0021: Registered web context: /airlines 06:32:14,376 INFO [org.jboss.as.server] (ServerService Thread Pool -- 34) WFLYSRV0010: Deployed "airlines.war" (runtime-name : "airlines.war") 06:32:14,704 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0060: Http management interface listening on https://127.0.0.1:9990/management 06:32:14,704 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0051: Admin console listening on https://127.0.0.1:9990 06:32:14,705 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0025: WildFly Full 10.1.0.Final (WildFly Core 2.2.0.Final) started in 29470ms - Started 443 of 691 services (404 services are lazy, passive or on-demand) |
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 Starting to serve on 127.0.0.1:8001 |
Exponga el conjunto de réplicas de WildFly como un servicio mediante:
|
1 |
kubectl expose --name=wildfly-service rs/wildfly-rs |
La lista de servicios puede verse de nuevo utilizando kubectl get svc mando:
|
1 2 3 4 5 |
kubectl get svc NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE couchbase-service 10.0.0.97 <none> 8091/TCP,8092/TCP,8093/TCP,11210/TCP 41m kubernetes 10.0.0.1 <none> 443/TCP 1h wildfly-service 10.0.0.169 <none> 8080/TCP 5s |
Ahora, la aplicación es accesible en:
|
1 |
curl https://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 |
[ { "travel-sample": { "country": "United States", "iata": "Q5", "callsign": "MILE-AIR", "name": "40-Mile Air", "icao": "MLA", "id": 10, "type": "airline" } }, { "travel-sample": { "country": "United States", "iata": "TQ", . . . "name": "Airlinair", "icao": "RLA", "id": 1203, "type": "airline" } } ] |
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 [...]