Статьи

Обнаружение услуг с помощью Java и приложения базы данных в Kubernetes

Этот блог покажет, как простое Java-приложение может общаться с базой данных, используя обнаружение служб в Kubernetes.

Обнаружение служб с помощью приложения Java и базы данных в DC / OS объясняет, почему обнаружение служб является важным аспектом для мультиконтейнерного приложения. В этом блоге также объясняется, как это можно сделать для DC / OS.

Давайте посмотрим, как это можно сделать в Kubernetes с помощью одного экземпляра сервера приложений и сервера базы данных. Этот блог будет использовать WildFly для сервера приложений и Couchbase для базы данных.

Этот блог будет использовать следующие основные шаги:

  • Запустить одноузловой кластер Kubernetes
  • Определение приложения Kubernetes
  • Разверните приложение
  • Доступ к приложению

Начать Kubernetes Cluster

Minikube — это самый простой способ запустить одноузловой кластер Kubernetes в виртуальной машине на вашем ноутбуке. Двоичный файл должен быть сначала загружен, а затем установлен.

Полные инструкции по установке доступны на github.com/kubernetes/minikube .

Последний выпуск может быть установлен на OSX как:

1
2
curl -Lo minikube https://storage.googleapis.com/minikube/releases/v0.17.1/minikube-darwin-amd64 \
&& chmod +x minikube

Это также требует, чтобы kubectl был установлен. Установка и настройка kubectl содержат подробные инструкции по настройке kubectl. На OSX его можно установить как:

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

Теперь запустите кластер как:

01
02
03
04
05
06
07
08
09
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.

Команда kubectl version показывает более подробную информацию о клиенте kubectl и версии сервера 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"}

Более подробную информацию о кластере можно получить с помощью команды kubectl cluster-info :

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'.

Определение приложения Kubernetes

Определение приложения определяется по адресу github.com/arun-gupta/kubernetes-java-sample/blob/master/service-discovery.yml . Это состоит из:

  • Сервис Couchbase
  • Набор точных копий Couchbase с одним пакетом
  • Набор реплики WildFly с одним модулем
01
02
03
04
05
06
07
08
09
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

Ключевой частью является то, где значение
COUCHBASE_URI окружения COUCHBASE_URI — это имя службы Couchbase. Это позволяет приложению, развернутому в WildFly, динамически обнаруживать службу и обмениваться данными с базой данных.

arungupta / couchbase: образ Docker для путешествий создается с помощью github.com/arun-gupta/couchbase-javaee/blob/master/couchbase/Dockerfile .

arungupta / wildfly-couchbase-javaee: образ Docker для путешествий создается с помощью github.com/arun-gupta/couchbase-javaee/blob/master/Dockerfile .

Приложение Java EE ожидает завершения инициализации базы данных, прежде чем начнет запрашивать базу данных. Это можно увидеть по адресу github.com/arun-gupta/couchbase-javaee/blob/master/src/main/java/org/couchbase/sample/javaee/Database.java#L25 .

Развернуть приложение

Это приложение может быть развернуто как:

1
kubectl create -f ~/workspaces/kubernetes-java-sample/service-discovery.yml

Список сервисов и набор реплик можно kubectl get svc,rs с помощью команды 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

Журналы для единственной реплики Couchbase можно получить с помощью команды kubectl logs rs/couchbase-rs :

01
02
03
04
05
06
07
08
09
10
11
12
13
++ set -m
++ sleep 25
++ /entrypoint.sh couchbase-server
Starting Couchbase Server -- Web UI available at http://<ip>:8091 and logs available in /opt/couchbase/var/lib/couchbase/logs
++ curl -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"}[]Type:
++ echo 'Type: '
++ '[' '' = WORKER ']'
++ fg 1
/entrypoint.sh couchbase-server

Журналы для набора реплик WildFly можно просмотреть с помощью команды kubectl logs rs/wildfly-rs :

01
02
03
04
05
06
07
08
09
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 http://127.0.0.1:9990/management
06:32:14,704 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0051: Admin console listening on http://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)

Доступ к приложению

Команда kubectl proxy запускает прокси для сервера API Kubernetes. Давайте запустим прокси-сервер Kubernetes для доступа к нашему приложению:

1
2
kubectl proxy
Starting to serve on 127.0.0.1:8001

Выставьте реплику WildFly, установленную как сервис, используя:

1
kubectl expose --name=wildfly-service rs/wildfly-rs

Список сервисов можно увидеть снова с помощью команды kubectl get svc :

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

Теперь приложение доступно по адресу:

1
curl http://localhost:8001/api/v1/proxy/namespaces/default/services/wildfly-service/airlines/resources/airline

Форматированный вывод выглядит так:

01
02
03
04
05
06
07
08
09
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"
    }
  }
]

Теперь новые модули могут быть добавлены как часть службы Couchbase путем масштабирования набора реплик. Существующие модули могут быть отменены или перенесены. Но приложение Java EE продолжит обращаться к службе базы данных, используя логическое имя.

В этом блоге показано, как простое Java-приложение может общаться с базой данных с помощью службы обнаружения в Kubernetes.

Для получения дополнительной информации проверьте: