Этот блог покажет, как простое 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.
Для получения дополнительной информации проверьте:
- Kubernetes Docs
- Couchbase на контейнерах
- Портал разработчиков Couchbase
- Задавайте вопросы на форумах Couchbase или переполнении стека
- Скачать Couchbase
Ссылка: | Обнаружение службы с помощью Java и приложения базы данных в Кубернетес от нашего партнера по JCG Аруна Гупта из блога Miles to go 3.0… . |