Этот блог покажет, как простое 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 startStarting local Kubernetes cluster...Starting VM...Downloading Minikube ISO 88.71 MB / 88.71 MB [==============================================] 100.00% 0sSSH-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 versionClient 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:8443KubeDNS is running at https://192.168.99.100:8443/api/v1/proxy/namespaces/kube-system/services/kube-dnskubernetes-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: v1kind: Servicemetadata: name: couchbase-servicespec: selector: app: couchbase-rs-pod ports: - name: admin port: 8091 - name: views port: 8092 - name: query port: 8093 - name: memcached port: 11210---apiVersion: extensions/v1beta1kind: ReplicaSetmetadata: name: couchbase-rsspec: 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/v1beta1kind: ReplicaSetmetadata: name: wildfly-rs labels: name: wildflyspec: 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) AGEsvc/couchbase-service 10.0.0.97 <none> 8091/TCP,8092/TCP,8093/TCP,11210/TCP 27msvc/kubernetes 10.0.0.1 <none> 443/TCP 1hsvc/wildfly-rs 10.0.0.252 <none> 8080/TCP 21m NAME DESIRED CURRENT READY AGErs/couchbase-rs 1 1 1 27mrs/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-serverStarting 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-service06:32:09,262 INFO [com.couchbase.client.core.config.ConfigurationProvider] (cb-computations-3) Opened bucket travel-sample06: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.MyApplication06: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.MyApplication06:32:14,310 INFO [org.wildfly.extension.undertow] (ServerService Thread Pool -- 65) WFLYUT0021: Registered web context: /airlines06: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/management06:32:14,704 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0051: Admin console listening on http://127.0.0.1:999006: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 proxyStarting 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 svcNAME CLUSTER-IP EXTERNAL-IP PORT(S) AGEcouchbase-service 10.0.0.97 <none> 8091/TCP,8092/TCP,8093/TCP,11210/TCP 41mkubernetes 10.0.0.1 <none> 443/TCP 1hwildfly-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.
Для получения дополнительной информации проверьте:
- Kubernetes Docs
- Couchbase на контейнерах
- Портал разработчиков Couchbase
- Задавайте вопросы на форумах Couchbase или переполнении стека
- Скачать Couchbase
| Ссылка: | Обнаружение службы с помощью Java и приложения базы данных в Кубернетес от нашего партнера по JCG Аруна Гупта из блога Miles to go 3.0… . |