Этот совет покажет, как запустить приложение Java EE 7, развернутое в WildFly и размещенное с использованием Kubernetes и Docker. Если вы хотите узнать больше об основах, то в этом блоге уже опубликовано немало контента по этой теме. Пример некоторых из содержания приведен ниже:
- Начните с Docker
- Как создать свой собственный образ Docker
- Перенос ваших изображений Docker в реестр
- Java EE 7 Практическое занятие по WildFly и Docker
- WildFly / JavaEE7 и MySQL связаны в двух контейнерах Docker
- Docker-контейнер, соединяющий несколько хостов
- Ключевые понятия Кубернетеса
- Сборка Kubernetes на Mac OS X
- Vagrant с провайдером Docker, используя образ WildFly и Java EE 7
Давайте начнем!
Старт Кубернетского кластера
Кластер Kubernetes можно легко запустить на компьютере с Linux, используя обычные сценарии. Существуют руководства по началу работы для различных платформ, таких как Fedora, CoreOS, Amazon Web Services и другие. Для работы кластера Kubernetes в Mac OS X необходимо использовать образ Vagrant, что также объясняется в разделе Начало работы с Vagrant . Этот блог будет использовать Vagrant box.
- По умолчанию сценарии управления кластером Kubernetes предполагают, что вы работаете в Google Compute Engine. Kubernetes можно настроить для работы с различными провайдерами :
gce,gke,aws,azure,vsphere,local,vsphere. Итак, давайте установим для нашего провайдера vagrant как:1exportKUBERNETES_PROVIDER=vagrantЭто означает, что ваш кластер Kubernetes работает внутри виртуальной машины Fedora, созданной Vagrant.
- Запустите кластер как:
010203040506070809101112131415
kubernetes> ./cluster/kube-up.shStarting cluster using provider: vagrant... calling verify-prereqs... calling kube-upUsing credentials: vagrant:vagrantBringing machine'master'up with'virtualbox'provider...Bringing machine'minion-1'up with'virtualbox'provider.... . .Running: ./cluster/../cluster/vagrant/../../cluster/../cluster/vagrant/../../_output/dockerized/bin/darwin/amd64/kubectl--auth-path=/Users/arungupta/.kubernetes_vagrant_auth create -f -skydns... calling setup-loggingTODO: setup loggingDoneОбратите внимание, что эта команда дается из каталога kubernetes, где она уже скомпилирована, как описано в разделе Сборка Kubernetes в Mac OS X.
По умолчанию установка Vagrant создаст одного kubernetes-master и 1 kubernetes-minion. Это включает в себя создание виртуальной машины Fedora, установку зависимостей, создание master и minion, настройку связи между ними и многое другое. В результате этот шаг может занять несколько минут (~ 10 минут на моей машине).
Проверить кластер Kubernetes
Теперь, когда кластер запущен, давайте удостоверимся, что мы проверяем, что он делает все, что должен.
- Убедитесь, что ваши изображения Vagrant правильно, как:
123456789
kubernetes> vagrant statusCurrent machine states:master running (virtualbox)minion-1 running (virtualbox)This environment represents multiple VMs. The VMs are all listedabove with their current state. Formoreinformation about a specificVM, run `vagrant status NAME`.Это также можно проверить, проверив состояние в консоли Virtual Box, как показано ниже:
boot2docker-vm — это виртуальная машина Boot2Docker. Тогда есть мастер Kubernetes и миньон В.М. Здесь показаны две дополнительные виртуальные машины, но они не относятся к примеру.
- Войдите в мастер как:
123
kubernetes> vagrantsshmasterLast login: Fri Jan 30 21:35:34 2015 from 10.0.2.2[vagrant@kubernetes-master ~]$Убедитесь, что различные компоненты Kubernetes запущены правильно. Начать с сервера Kubernetes API:
01020304050607080910[vagrant@kubernetes-master ~]$sudosystemctl status kube-apiserverkube-apiserver.service - Kubernetes API ServerLoaded: loaded (/usr/lib/systemd/system/kube-apiserver.service; enabled)Active: active (running) since Fri 2015-01-30 21:34:25 UTC; 7min agoDocs: https://github.com/GoogleCloudPlatform/kubernetesMain PID: 3506 (kube-apiserver)CGroup:/system.slice/kube-apiserver.service└─3506/usr/local/bin/kube-apiserver--address=127.0.0.1 --etcd_servers=http://10.245.1.2:4001 --cloud_provider=vagrant --admission_c.... . .Затем Kube Controller Manager:
01020304050607080910[vagrant@kubernetes-master ~]$sudosystemctl status kube-controller-managerkube-controller-manager.service - Kubernetes Controller ManagerLoaded: loaded (/usr/lib/systemd/system/kube-controller-manager.service; enabled)Active: active (running) since Fri 2015-01-30 21:34:27 UTC; 8min agoDocs: https://github.com/GoogleCloudPlatform/kubernetesMain PID: 3566 (kube-controller)CGroup:/system.slice/kube-controller-manager.service└─3566/usr/local/bin/kube-controller-manager--master=127.0.0.1:8080 --minion_regexp=.* --cloud_provider=vagrant --v=2. . .Точно так же вы можете проверить
etcdиnginx.Docker и Kubelet работают в миньоне и могут быть проверены, войдя в миньон и используя сценарии
systemctlкак:0102030405060708091011121314151617181920212223kubernetes> vagrantsshminion-1Last login: Fri Jan 30 21:37:05 2015 from 10.0.2.2[vagrant@kubernetes-minion-1 ~]$sudosystemctl status dockerdocker.service - Docker Application Container EngineLoaded: loaded (/usr/lib/systemd/system/docker.service; enabled)Active: active (running) since Fri 2015-01-30 21:39:05 UTC; 8min agoDocs: http://docs.docker.comMain PID: 13056 (docker)CGroup:/system.slice/docker.service├─13056/usr/bin/docker-d -b=kbr0 --iptables=false--selinux-enabled└─13192 docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 4194 -container-ip 10.246.0.3 -container-port 8080. . .[vagrant@kubernetes-minion-1 ~]$sudosystemctl status kubeletkubelet.service - Kubernetes Kubelet ServerLoaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled)Active: active (running) since Fri 2015-01-30 21:36:57 UTC; 10min agoDocs: https://github.com/GoogleCloudPlatform/kubernetesMain PID: 3118 (kubelet)CGroup:/system.slice/kubelet.service└─3118/usr/local/bin/kubelet--etcd_servers=http://10.245.1.2:4001 --api_servers=https://10.245.1.2:6443 --auth_path=/var/lib/kubele.... . . - Проверьте миньонов как:
1234
kubernetes> ./cluster/kubectl.sh get minionsRunning: ./cluster/../cluster/vagrant/../../_output/dockerized/bin/darwin/amd64/kubectl--auth-path=/Users/arungupta/.kubernetes_vagrant_auth get minionsNAME LABELS STATUS10.245.1.3 <none> ReadyТолько один миньон создан. Это можно
NUM_MINIONSустановив переменную окруженияNUM_MINIONSв целое число передkube-up.shсценарияkube-up.sh.Наконец проверьте стручки как:
123456kubernetes> ./cluster/kubectl.sh get podsRunning: ./cluster/../cluster/vagrant/../../_output/dockerized/bin/darwin/amd64/kubectl--auth-path=/Users/arungupta/.kubernetes_vagrant_auth get podsPOD IP CONTAINER(S) IMAGE(S) HOST LABELS STATUS22d4a478-a8c8-11e4-a61e-0800279696e1 10.246.0.2 etcd quay.io/coreos/etcd:latest 10.245.1.3/10.245.1.3 k8s-app=skydns Runningkube2sky kubernetes/kube2sky:1.0skydns kubernetes/skydns:2014-12-23-001Это показывает, что один модуль создан по умолчанию и имеет три работающих контейнера:
- skydns : SkyDNS — это распределенный сервис для объявления и обнаружения сервисов, созданный на основе etcd . Он использует DNS-запросы для обнаружения доступных услуг.
- etcd : распределенное, согласованное хранилище значений ключей для общей конфигурации и обнаружения служб с акцентом на простоту, безопасность, скорость и надежность. Это используется для хранения информации о состоянии Kubernetes.
- kube2sky : мост между Kubernetes и SkyDNS. Это будет следить за изменениями в Сервисах API kubernetes, а затем публиковать эти изменения в SkyDNS через etcd.
- В нашем приложении пока не было создано никаких модулей, давайте сделаем это дальше.
Запустите приложение WildFly и Java EE 7
Pod создается с использованием сценария kubectl и предоставлением подробностей в файле конфигурации JSON. Исходный код нашего файла конфигурации доступен по адресу github.com/arun-gupta/kubernetes-java-sample и выглядит следующим образом:
|
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
|
{ "id": "wildfly", "kind": "Pod", "apiVersion": "v1beta1", "desiredState": { "manifest": { "version": "v1beta1", "id": "wildfly", "containers": [{ "name": "wildfly", "image": "arungupta/javaee7-hol", "cpu": 100, "ports": [{ "containerPort": 8080, "hostPort": 8080 }, { "containerPort": 9090, "hostPort": 9090 }] }] } }, "labels": { "name": "wildfly" }} |
Точная полезная нагрузка и атрибуты этого файла конфигурации задокументированы в kubernetes.io/third_party/swagger-ui/#!/v1beta1/createPod_0 . Полные документы всех возможных API находятся на kubernetes.io/third_party/swagger-ui/ . Ключевые атрибуты в этом файле, в частности:
- Стручок создан. API позволяет создавать другие типы, такие как «service», «replicationController» и т. Д.
- Версия API — «v1beta1».
- Изображение Docker arungupta / javaee7-hol используется для запуска контейнера.
- Выставляет порты 8080 и 9090, так как они изначально выставлены в базовом образе Dockerfile. Это требует дальнейшей отладки того, как можно очистить список портов.
- Стручку дается ярлык «дикая бабочка». В этом случае он не используется много, но будет более значимым, когда службы создаются в последующем блоге.
Как упоминалось ранее, этот технический совет будет раскручивать один контейнер с одним контейнером. Наш контейнер будет использовать предварительно созданный образ ( arungupta / javaee7-hol ), который развертывает типичное 3-уровневое приложение Java EE 7 в WildFly.
Запустите модуль WildFly как:
|
1
|
kubernetes/>./cluster/kubectl create -f ../kubernetes-java-sample/javaee7-hol.json |
Проверьте статус созданного модуля как:
|
1
2
3
4
5
6
7
|
kubernetes> ./cluster/kubectl.sh get podsRunning: ./cluster/../cluster/vagrant/../../_output/dockerized/bin/darwin/amd64/kubectl --auth-path=/Users/arungupta/.kubernetes_vagrant_auth get podsPOD IP CONTAINER(S) IMAGE(S) HOST LABELS STATUS4c283aa1-ab47-11e4-b139-0800279696e1 10.246.0.2 etcd quay.io/coreos/etcd:latest 10.245.1.3/10.245.1.3 k8s-app=skydns Running kube2sky kubernetes/kube2sky:1.0 skydns kubernetes/skydns:2014-12-23-001 wildfly 10.246.0.5 wildfly arungupta/javaee7-hol 10.245.1.3/10.245.1.3 name=wildfly Running |
Модуль WildFly теперь создан и показан в списке. В столбце HOST отображается IP-адрес, на котором доступно приложение.
На рисунке ниже показано, как все компоненты соответствуют друг другу:
Поскольку по умолчанию создается только один миньон, этот пакет будет создан на этом миньоне. Блог покажет, как можно создать несколько миньонов. Kubernetes конечно выбирает миньона, где созданы стручки.
Запуск модуля гарантирует, что приложение Java EE 7 развернуто в WildFly.
Доступ к приложению Java EE 7
Из kubectl.sh get pods столбце HOST отображается IP-адрес, с которого приложение доступно извне. В нашем случае IP-адрес 10.245.1.3 . Итак, откройте приложение в браузере, чтобы увидеть результат как:
Это подтверждает, что ваше приложение Java EE 7 теперь доступно.
Kubernetes Советы по отладке
Как только кластер Kubernetes создан, вам нужно отладить его и посмотреть, что происходит под капотом.
Прежде всего, давайте войдем в миньон:
|
1
2
|
kubernetes> vagrant ssh minion-1Last login: Tue Feb 3 01:52:22 2015 from 10.0.2.2 |
Список Docker контейнеров на Миньоне
Давайте рассмотрим все контейнеры Docker, работающие на minion-1:
|
01
02
03
04
05
06
07
08
09
10
11
12
|
[vagrant@kubernetes-minion-1 ~]$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES3f7e174b82b1 arungupta/javaee7-hol:latest "/opt/jboss/wildfly/ 16 minutes ago Up 16 minutes k8s_wildfly.a78dc60_wildfly.default.api_59be80fa-ab48-11e4-b139-0800279696e1_75a4a7cb 1c464e71fb69 kubernetes/pause:go "/pause" 20 minutes ago Up 20 minutes 0.0.0.0:8080->8080/tcp, 0.0.0.0:9090->9090/tcp k8s_net.7946daa4_wildfly.default.api_59be80fa-ab48-11e4-b139-0800279696e1_e74d3d1d 7bdd763df691 kubernetes/skydns:2014-12-23-001 "/skydns -machines=h 21 minutes ago Up 21 minutes k8s_skydns.394cd23c_4c283aa1-ab47-11e4-b139-0800279696e1.default.api_4c283aa1-ab47-11e4-b139-0800279696e1_3352f6bd 17a140aaabbe google/cadvisor:0.7.1 "/usr/bin/cadvisor" 22 minutes ago Up 22 minutes k8s_cadvisor.68f5108e_cadvisor-agent.file-6bb810db-kubernetes-minion-1.file_65235067df34faf012fd8bb088de6b73_86e59309 a5f8cf6463e9 kubernetes/kube2sky:1.0 "/kube2sky -domain=k 22 minutes ago Up 22 minutes k8s_kube2sky.1cbba018_4c283aa1-ab47-11e4-b139-0800279696e1.default.api_4c283aa1-ab47-11e4-b139-0800279696e1_126d4d7a 28e6d2e67a92 kubernetes/fluentd-elasticsearch:1.0 "/bin/sh -c '/usr/sb 23 minutes ago Up 23 minutes k8s_fluentd-es.6361e00b_fluentd-to-elasticsearch.file-8cd71177-kubernetes-minion-1.file_a190cc221f7c0766163ed2a4ad6e32aa_a9a369d3 5623edf7decc quay.io/coreos/etcd:latest "/etcd /etcd -bind-a 25 minutes ago Up 25 minutes k8s_etcd.372da5db_4c283aa1-ab47-11e4-b139-0800279696e1.default.api_4c283aa1-ab47-11e4-b139-0800279696e1_8b658811 3575b562f23e kubernetes/pause:go "/pause" 25 minutes ago Up 25 minutes 0.0.0.0:4194->8080/tcp k8s_net.beddb979_cadvisor-agent.file-6bb810db-kubernetes-minion-1.file_65235067df34faf012fd8bb088de6b73_8376ce8e 094d76c83068 kubernetes/pause:go "/pause" 25 minutes ago Up 25 minutes k8s_net.3e0f95f3_fluentd-to-elasticsearch.file-8cd71177-kubernetes-minion-1.file_a190cc221f7c0766163ed2a4ad6e32aa_6931ca22 f8b9cd5af169 kubernetes/pause:go "/pause" 25 minutes ago Up 25 minutes k8s_net.3d64b7f6_4c283aa1-ab47-11e4-b139-0800279696e1.default.api_4c283aa1-ab47-11e4-b139-0800279696e1_b0ebce5a |
Первый контейнер специфичен для нашего приложения, все остальное запускается Kubernetes.
Подробности о каждом контейнере Docker
Более подробную информацию о каждом контейнере можно найти, используя их идентификатор контейнера:
|
1
|
docker inspect <CONTAINER_ID> |
В нашем случае вывод отображается как:
|
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
|
[vagrant@kubernetes-minion-1 ~]$ docker inspect 3f7e174b82b1[{ "AppArmorProfile": "", "Args": [ "-c", "standalone-full.xml", "-b", "0.0.0.0" ], "Config": { "AttachStderr": false, "AttachStdin": false, "AttachStdout": false, "Cmd": [ "/opt/jboss/wildfly/bin/standalone.sh", "-c", "standalone-full.xml", "-b", "0.0.0.0" ], "CpuShares": 102, "Cpuset": "", "Domainname": "", "Entrypoint": null, "Env": [ "KUBERNETES_PORT_443_TCP_PROTO=tcp", "KUBERNETES_RO_PORT_80_TCP=tcp://10.247.82.143:80", "SKYDNS_PORT_53_UDP=udp://10.247.0.10:53", "KUBERNETES_PORT_443_TCP=tcp://10.247.92.82:443", "KUBERNETES_PORT_443_TCP_PORT=443", "KUBERNETES_PORT_443_TCP_ADDR=10.247.92.82", "KUBERNETES_RO_PORT_80_TCP_PROTO=tcp", "SKYDNS_PORT_53_UDP_PROTO=udp", "KUBERNETES_RO_PORT_80_TCP_ADDR=10.247.82.143", "SKYDNS_SERVICE_HOST=10.247.0.10", "SKYDNS_PORT_53_UDP_PORT=53", "SKYDNS_PORT_53_UDP_ADDR=10.247.0.10", "KUBERNETES_SERVICE_HOST=10.247.92.82", "KUBERNETES_RO_SERVICE_HOST=10.247.82.143", "KUBERNETES_RO_PORT_80_TCP_PORT=80", "SKYDNS_SERVICE_PORT=53", "SKYDNS_PORT=udp://10.247.0.10:53", "KUBERNETES_SERVICE_PORT=443", "KUBERNETES_PORT=tcp://10.247.92.82:443", "KUBERNETES_RO_SERVICE_PORT=80", "KUBERNETES_RO_PORT=tcp://10.247.82.143:80", "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "JAVA_HOME=/usr/lib/jvm/java", "WILDFLY_VERSION=8.2.0.Final", "JBOSS_HOME=/opt/jboss/wildfly" ], "ExposedPorts": { "8080/tcp": {}, "9090/tcp": {}, "9990/tcp": {} }, "Hostname": "wildfly", "Image": "arungupta/javaee7-hol", "MacAddress": "", "Memory": 0, "MemorySwap": 0, "NetworkDisabled": false, "OnBuild": null, "OpenStdin": false, "PortSpecs": null, "StdinOnce": false, "Tty": false, "User": "jboss", "Volumes": null, "WorkingDir": "/opt/jboss" }, "Created": "2015-02-03T02:03:54.882111127Z", "Driver": "devicemapper", "ExecDriver": "native-0.2", "HostConfig": { "Binds": null, "CapAdd": null, "CapDrop": null, "ContainerIDFile": "", "Devices": null, "Dns": [ "10.247.0.10", "10.0.2.3" ], "DnsSearch": [ "default.kubernetes.local", "kubernetes.local", "c.hospitality.swisscom.com" ], "ExtraHosts": null, "IpcMode": "", "Links": null, "LxcConf": null, "NetworkMode": "container:1c464e71fb69adfb2a407217d0c84600a18f755721628ea3f329f48a2cdaa64f", "PortBindings": { "8080/tcp": [ { "HostIp": "", "HostPort": "8080" } ], "9090/tcp": [ { "HostIp": "", "HostPort": "9090" } ] }, "Privileged": false, "PublishAllPorts": false, "RestartPolicy": { "MaximumRetryCount": 0, "Name": "" }, "SecurityOpt": null, "VolumesFrom": null }, "HostnamePath": "", "HostsPath": "/var/lib/docker/containers/1c464e71fb69adfb2a407217d0c84600a18f755721628ea3f329f48a2cdaa64f/hosts", "Id": "3f7e174b82b1520abdc7f39f34ad4e4a9cb4d312466143b54935c43d4c258e3f", "Image": "a068decaf8928737340f8f08fbddf97d9b4f7838d154e88ed77fbcf9898a83f2", "MountLabel": "", "Name": "/k8s_wildfly.a78dc60_wildfly.default.api_59be80fa-ab48-11e4-b139-0800279696e1_75a4a7cb", "NetworkSettings": { "Bridge": "", "Gateway": "", "IPAddress": "", "IPPrefixLen": 0, "MacAddress": "", "PortMapping": null, "Ports": null }, "Path": "/opt/jboss/wildfly/bin/standalone.sh", "ProcessLabel": "", "ResolvConfPath": "/var/lib/docker/containers/1c464e71fb69adfb2a407217d0c84600a18f755721628ea3f329f48a2cdaa64f/resolv.conf", "State": { "Error": "", "ExitCode": 0, "FinishedAt": "0001-01-01T00:00:00Z", "OOMKilled": false, "Paused": false, "Pid": 17920, "Restarting": false, "Running": true, "StartedAt": "2015-02-03T02:03:55.471392394Z" }, "Volumes": {}, "VolumesRW": {}}] |
Логи из контейнера Docker
Журналы из контейнера можно увидеть с помощью команды:
|
1
|
docker logs <CONTAINER_ID> |
В нашем случае вывод отображается как:
|
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
[vagrant@kubernetes-minion-1 ~]$ docker logs 3f7e174b82b1========================================================================= JBoss Bootstrap Environment JBOSS_HOME: /opt/jboss/wildfly JAVA: /usr/lib/jvm/java/bin/java JAVA_OPTS: -server -Xms64m -Xmx512m -XX:MaxPermSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true=========================================================================. . .02:04:12,078 INFO [org.jboss.as.jpa] (ServerService Thread Pool -- 57) JBAS011409: Starting Persistence Unit (phase 1 of 2) Service 'movieplex7-1.0-SNAPSHOT.war#movieplex7PU'02:04:12,128 INFO [org.hibernate.jpa.internal.util.LogHelper] (ServerService Thread Pool -- 57) HHH000204: Processing PersistenceUnitInfo [ name: movieplex7PU ...]02:04:12,154 INFO [org.hornetq.core.server] (ServerService Thread Pool -- 56) HQ221007: Server is now live02:04:12,155 INFO [org.hornetq.core.server] (ServerService Thread Pool -- 56) HQ221001: HornetQ Server version 2.4.5.FINAL (Wild Hornet, 124) [f13dedbd-ab48-11e4-a924-615afe337134] 02:04:12,175 INFO [org.hornetq.core.server] (ServerService Thread Pool -- 56) HQ221003: trying to deploy queue jms.queue.ExpiryQueue02:04:12,735 INFO [org.jboss.as.messaging] (ServerService Thread Pool -- 56) JBAS011601: Bound messaging object to jndi name java:/jms/queue/ExpiryQueue02:04:12,736 INFO [org.hornetq.core.server] (ServerService Thread Pool -- 60) HQ221003: trying to deploy queue jms.queue.DLQ02:04:12,749 INFO [org.jboss.as.messaging] (ServerService Thread Pool -- 60) JBAS011601: Bound messaging object to jndi name java:/jms/queue/DLQ02:04:12,792 INFO [org.hibernate.Version] (ServerService Thread Pool -- 57) HHH000412: Hibernate Core {4.3.7.Final}02:04:12,795 INFO [org.hibernate.cfg.Environment] (ServerService Thread Pool -- 57) HHH000206: hibernate.properties not found02:04:12,801 INFO [org.hibernate.cfg.Environment] (ServerService Thread Pool -- 57) HHH000021: Bytecode provider name : javassist02:04:12,820 INFO [org.jboss.as.connector.deployment] (MSC service thread 1-1) JBAS010406: Registered connection factory java:/JmsXA02:04:12,997 INFO [org.hornetq.jms.server] (ServerService Thread Pool -- 59) HQ121005: Invalid "host" value "0.0.0.0" detected for "http-connector" connector. Switching to "wildfly". If this new address is incorrect please manually configure the connector to use the proper one.02:04:13,021 INFO [org.jboss.as.messaging] (ServerService Thread Pool -- 59) JBAS011601: Bound messaging object to jndi name java:jboss/exported/jms/RemoteConnectionFactory02:04:13,025 INFO [org.jboss.as.messaging] (ServerService Thread Pool -- 58) JBAS011601: Bound messaging object to jndi name java:/ConnectionFactory02:04:13,072 INFO [org.hornetq.ra] (MSC service thread 1-1) HornetQ resource adaptor started02:04:13,073 INFO [org.jboss.as.connector.services.resourceadapters.ResourceAdapterActivatorService$ResourceAdapterActivator] (MSC service thread 1-1) IJ020002: Deployed: file://RaActivatorhornetq-ra02:04:13,078 INFO [org.jboss.as.messaging] (MSC service thread 1-4) JBAS011601: Bound messaging object to jndi name java:jboss/DefaultJMSConnectionFactory02:04:13,076 INFO [org.jboss.as.connector.deployment] (MSC service thread 1-8) JBAS010401: Bound JCA ConnectionFactory 02:04:13,487 INFO [org.jboss.weld.deployer] (MSC service thread 1-2) JBAS016002: Processing weld deployment movieplex7-1.0-SNAPSHOT.war02:04:13,694 INFO [org.hibernate.validator.internal.util.Version] (MSC service thread 1-2) HV000001: Hibernate Validator 5.1.3.Final02:04:13,838 INFO [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (MSC service thread 1-2) JNDI bindings for session bean named ShowTimingFacadeREST in deployment unit deployment "movieplex7-1.0-SNAPSHOT.war" are as follows: java:global/movieplex7-1.0-SNAPSHOT/ShowTimingFacadeREST!org.javaee7.movieplex7.rest.ShowTimingFacadeREST java:app/movieplex7-1.0-SNAPSHOT/ShowTimingFacadeREST!org.javaee7.movieplex7.rest.ShowTimingFacadeREST java:module/ShowTimingFacadeREST!org.javaee7.movieplex7.rest.ShowTimingFacadeREST java:global/movieplex7-1.0-SNAPSHOT/ShowTimingFacadeREST java:app/movieplex7-1.0-SNAPSHOT/ShowTimingFacadeREST java:module/ShowTimingFacadeREST02:04:13,838 INFO [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (MSC service thread 1-2) JNDI bindings for session bean named TheaterFacadeREST in deployment unit deployment "movieplex7-1.0-SNAPSHOT.war" are as follows: java:global/movieplex7-1.0-SNAPSHOT/TheaterFacadeREST!org.javaee7.movieplex7.rest.TheaterFacadeREST java:app/movieplex7-1.0-SNAPSHOT/TheaterFacadeREST!org.javaee7.movieplex7.rest.TheaterFacadeREST java:module/TheaterFacadeREST!org.javaee7.movieplex7.rest.TheaterFacadeREST java:global/movieplex7-1.0-SNAPSHOT/TheaterFacadeREST java:app/movieplex7-1.0-SNAPSHOT/TheaterFacadeREST java:module/TheaterFacadeREST02:04:13,839 INFO [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (MSC service thread 1-2) JNDI bindings for session bean named MovieFacadeREST in deployment unit deployment "movieplex7-1.0-SNAPSHOT.war" are as follows: java:global/movieplex7-1.0-SNAPSHOT/MovieFacadeREST!org.javaee7.movieplex7.rest.MovieFacadeREST java:app/movieplex7-1.0-SNAPSHOT/MovieFacadeREST!org.javaee7.movieplex7.rest.MovieFacadeREST java:module/MovieFacadeREST!org.javaee7.movieplex7.rest.MovieFacadeREST java:global/movieplex7-1.0-SNAPSHOT/MovieFacadeREST java:app/movieplex7-1.0-SNAPSHOT/MovieFacadeREST java:module/MovieFacadeREST02:04:13,840 INFO [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (MSC service thread 1-2) JNDI bindings for session bean named SalesFacadeREST in deployment unit deployment "movieplex7-1.0-SNAPSHOT.war" are as follows: java:global/movieplex7-1.0-SNAPSHOT/SalesFacadeREST!org.javaee7.movieplex7.rest.SalesFacadeREST java:app/movieplex7-1.0-SNAPSHOT/SalesFacadeREST!org.javaee7.movieplex7.rest.SalesFacadeREST java:module/SalesFacadeREST!org.javaee7.movieplex7.rest.SalesFacadeREST java:global/movieplex7-1.0-SNAPSHOT/SalesFacadeREST java:app/movieplex7-1.0-SNAPSHOT/SalesFacadeREST java:module/SalesFacadeREST02:04:13,840 INFO [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (MSC service thread 1-2) JNDI bindings for session bean named TimeslotFacadeREST in deployment unit deployment "movieplex7-1.0-SNAPSHOT.war" are as follows: java:global/movieplex7-1.0-SNAPSHOT/TimeslotFacadeREST!org.javaee7.movieplex7.rest.TimeslotFacadeREST java:app/movieplex7-1.0-SNAPSHOT/TimeslotFacadeREST!org.javaee7.movieplex7.rest.TimeslotFacadeREST java:module/TimeslotFacadeREST!org.javaee7.movieplex7.rest.TimeslotFacadeREST java:global/movieplex7-1.0-SNAPSHOT/TimeslotFacadeREST java:app/movieplex7-1.0-SNAPSHOT/TimeslotFacadeREST java:module/TimeslotFacadeREST02:04:14,802 INFO [org.jboss.as.messaging] (MSC service thread 1-1) JBAS011601: Bound messaging object to jndi name java:global/jms/pointsQueue02:04:14,931 INFO [org.jboss.weld.deployer] (MSC service thread 1-2) JBAS016005: Starting Services for CDI deployment: movieplex7-1.0-SNAPSHOT.war02:04:15,018 INFO [org.jboss.weld.Version] (MSC service thread 1-2) WELD-000900: 2.2.6 (Final)02:04:15,109 INFO [org.hornetq.core.server] (ServerService Thread Pool -- 57) HQ221003: trying to deploy queue jms.queue.movieplex7-1.0-SNAPSHOT_movieplex7-1.0-SNAPSHOT_movieplex7-1.0-SNAPSHOT_java:global/jms/pointsQueue02:04:15,110 INFO [org.jboss.weld.deployer] (MSC service thread 1-6) JBAS016008: Starting weld service for deployment movieplex7-1.0-SNAPSHOT.war02:04:15,787 INFO [org.jboss.as.jpa] (ServerService Thread Pool -- 57) JBAS011409: Starting Persistence Unit (phase 2 of 2) Service 'movieplex7-1.0-SNAPSHOT.war#movieplex7PU'02:04:16,189 INFO [org.hibernate.annotations.common.Version] (ServerService Thread Pool -- 57) HCANN000001: Hibernate Commons Annotations {4.0.4.Final}02:04:17,174 INFO [org.hibernate.dialect.Dialect] (ServerService Thread Pool -- 57) HHH000400: Using dialect: org.hibernate.dialect.H2Dialect02:04:17,191 WARN [org.hibernate.dialect.H2Dialect] (ServerService Thread Pool -- 57) HHH000431: Unable to determine H2 database version, certain features may not work02:04:17,954 INFO [org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory] (ServerService Thread Pool -- 57) HHH000397: Using ASTQueryTranslatorFactory02:04:19,832 INFO [org.hibernate.dialect.Dialect] (ServerService Thread Pool -- 57) HHH000400: Using dialect: org.hibernate.dialect.H2Dialect02:04:19,833 WARN [org.hibernate.dialect.H2Dialect] (ServerService Thread Pool -- 57) HHH000431: Unable to determine H2 database version, certain features may not work02:04:19,854 WARN [org.hibernate.jpa.internal.schemagen.GenerationTargetToDatabase] (ServerService Thread Pool -- 57) Unable to execute JPA schema generation drop command [DROP TABLE SALES]02:04:19,855 WARN [org.hibernate.jpa.internal.schemagen.GenerationTargetToDatabase] (ServerService Thread Pool -- 57) Unable to execute JPA schema generation drop command [DROP TABLE POINTS]02:04:19,855 WARN [org.hibernate.jpa.internal.schemagen.GenerationTargetToDatabase] (ServerService Thread Pool -- 57) Unable to execute JPA schema generation drop command [DROP TABLE SHOW_TIMING]02:04:19,855 WARN [org.hibernate.jpa.internal.schemagen.GenerationTargetToDatabase] (ServerService Thread Pool -- 57) Unable to execute JPA schema generation drop command [DROP TABLE MOVIE]02:04:19,856 WARN [org.hibernate.jpa.internal.schemagen.GenerationTargetToDatabase] (ServerService Thread Pool -- 57) Unable to execute JPA schema generation drop command [DROP TABLE TIMESLOT]02:04:19,857 WARN [org.hibernate.jpa.internal.schemagen.GenerationTargetToDatabase] (ServerService Thread Pool -- 57) Unable to execute JPA schema generation drop command [DROP TABLE THEATER]02:04:23,942 INFO [io.undertow.websockets.jsr] (MSC service thread 1-5) UT026003: Adding annotated server endpoint class org.javaee7.movieplex7.chat.ChatServer for path /websocket02:04:24,975 INFO [javax.enterprise.resource.webcontainer.jsf.config] (MSC service thread 1-5) Initializing Mojarra 2.2.8-jbossorg-1 20140822-1131 for context '/movieplex7'02:04:26,377 INFO [javax.enterprise.resource.webcontainer.jsf.config] (MSC service thread 1-5) Monitoring file:/opt/jboss/wildfly/standalone/tmp/vfs/temp/temp1267e5586f39ea50/movieplex7-1.0-SNAPSHOT.war-ea3c92cddc1c81c/WEB-INF/faces-config.xml for modifications02:04:30,216 INFO [org.jboss.resteasy.spi.ResteasyDeployment] (MSC service thread 1-5) Deploying javax.ws.rs.core.Application: class org.javaee7.movieplex7.rest.ApplicationConfig02:04:30,247 INFO [org.jboss.resteasy.spi.ResteasyDeployment] (MSC service thread 1-5) Adding class resource org.javaee7.movieplex7.rest.TheaterFacadeREST from Application class org.javaee7.movieplex7.rest.ApplicationConfig02:04:30,248 INFO [org.jboss.resteasy.spi.ResteasyDeployment] (MSC service thread 1-5) Adding class resource org.javaee7.movieplex7.rest.ShowTimingFacadeREST from Application class org.javaee7.movieplex7.rest.ApplicationConfig02:04:30,248 INFO [org.jboss.resteasy.spi.ResteasyDeployment] (MSC service thread 1-5) Adding class resource org.javaee7.movieplex7.rest.MovieFacadeREST from Application class org.javaee7.movieplex7.rest.ApplicationConfig02:04:30,248 INFO [org.jboss.resteasy.spi.ResteasyDeployment] (MSC service thread 1-5) Adding provider class org.javaee7.movieplex7.json.MovieWriter from Application class org.javaee7.movieplex7.rest.ApplicationConfig02:04:30,249 INFO [org.jboss.resteasy.spi.ResteasyDeployment] (MSC service thread 1-5) Adding provider class org.javaee7.movieplex7.json.MovieReader from Application class org.javaee7.movieplex7.rest.ApplicationConfig02:04:30,267 INFO [org.jboss.resteasy.spi.ResteasyDeployment] (MSC service thread 1-5) Adding class resource org.javaee7.movieplex7.rest.SalesFacadeREST from Application class org.javaee7.movieplex7.rest.ApplicationConfig02:04:30,267 INFO [org.jboss.resteasy.spi.ResteasyDeployment] (MSC service thread 1-5) Adding class resource org.javaee7.movieplex7.rest.TimeslotFacadeREST from Application class org.javaee7.movieplex7.rest.ApplicationConfig02:04:31,544 INFO [org.wildfly.extension.undertow] (MSC service thread 1-5) JBAS017534: Registered web context: /movieplex702:04:32,187 INFO [org.jboss.as.server] (ServerService Thread Pool -- 31) JBAS018559: Deployed "movieplex7-1.0-SNAPSHOT.war" (runtime-name : "movieplex7-1.0-SNAPSHOT.war")02:04:34,800 INFO [org.jboss.as] (Controller Boot Thread) JBAS015961: Http management interface listening on http://127.0.0.1:9990/management02:04:34,859 INFO [org.jboss.as] (Controller Boot Thread) JBAS015951: Admin console listening on http://127.0.0.1:999002:04:34,859 INFO [org.jboss.as] (Controller Boot Thread) JBAS015874: WildFly 8.2.0.Final "Tweek" started in 38558ms - Started 400 of 452 services (104 services are lazy, passive or on-demand) |
Журнал запуска WildFly, включая развертывание приложения, показан здесь.
Войдите в контейнер Docker
Войдите в контейнер и покажите логи WildFly. Есть несколько способов сделать это.
Сначала нужно использовать имя и выполнить оболочку bash. Для этого получите имя контейнера как:
|
1
|
docker inspect <CONTAINER_ID> | grep Name |
В нашем случае на выходе получается:
|
1
2
3
|
[vagrant@kubernetes-minion-1 ~]$ docker inspect 3f7e174b82b1 | grep Name "Name": "" "Name": "/k8s_wildfly.a78dc60_wildfly.default.api_59be80fa-ab48-11e4-b139-0800279696e1_75a4a7cb", |
Войдите в контейнер как:
|
1
2
3
|
[vagrant@kubernetes-minion-1 ~]$ docker exec -it k8s_wildfly.a78dc60_wildfly.default.api_59be80fa-ab48-11e4-b139-0800279696e1_75a4a7cb bash[root@wildfly /]# pwd/ |
Другой, более классический способ — получить идентификатор процесса контейнера в виде:
|
1
|
docker inspect <CONTAINER_ID> | grep Pid |
В нашем случае на выходе получается:
|
1
2
|
[vagrant@kubernetes-minion-1 ~]$ docker inspect 3f7e174b82b1 | grep Pid "Pid": 17920, |
Войдите в контейнер как:
|
1
2
3
4
|
[vagrant@kubernetes-minion-1 ~]$ sudo nsenter -m -u -n -i -p -t 17920 /bin/bashdocker exec -it [root@wildfly /]# pwd/ |
И теперь полный дистрибутив WildFly доступен по адресу:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
[root@wildfly /]# cd /opt/jboss/wildfly[root@wildfly wildfly]# ls -latotal 424drwxr-xr-x 10 jboss jboss 4096 Dec 5 22:22 .drwx------ 4 jboss jboss 4096 Dec 5 22:22 ..drwxr-xr-x 3 jboss jboss 4096 Nov 20 22:43 appclientdrwxr-xr-x 5 jboss jboss 4096 Nov 20 22:43 bin-rw-r--r-- 1 jboss jboss 2451 Nov 20 22:43 copyright.txtdrwxr-xr-x 4 jboss jboss 4096 Nov 20 22:43 docsdrwxr-xr-x 5 jboss jboss 4096 Nov 20 22:43 domaindrwx------ 2 jboss jboss 4096 Nov 20 22:43 .installation-rw-r--r-- 1 jboss jboss 354682 Nov 20 22:43 jboss-modules.jar-rw-r--r-- 1 jboss jboss 26530 Nov 20 22:43 LICENSE.txtdrwxr-xr-x 3 jboss jboss 4096 Nov 20 22:43 modules-rw-r--r-- 1 jboss jboss 2356 Nov 20 22:43 README.txtdrwxr-xr-x 8 jboss jboss 4096 Feb 3 02:03 standalonedrwxr-xr-x 2 jboss jboss 4096 Nov 20 22:43 welcome-content |
Очистить кластер
Весь кластер Kubernetes можно очистить либо с помощью консоли Virtual Box, либо с помощью командной строки:
|
01
02
03
04
05
06
07
08
09
10
11
12
|
kubernetes> vagrant halt==> minion-1: Attempting graceful shutdown of VM...==> minion-1: Forcing shutdown of VM...==> master: Attempting graceful shutdown of VM...==> master: Forcing shutdown of VM...kubernetes> vagrant destroy minion-1: Are you sure you want to destroy the 'minion-1' VM? [y/N] y==> minion-1: Destroying VM and associated drives...==> minion-1: Running cleanup tasks for 'shell' provisioner... master: Are you sure you want to destroy the 'master' VM? [y/N] y==> master: Destroying VM and associated drives...==> master: Running cleanup tasks for 'shell' provisioner... |
Итак, мы узнали, как запустить приложение Java EE 7, развернутое в WildFly и размещенное с использованием Kubernetes и Docker.
Наслаждайтесь!
| Ссылка: | Java EE 7 и WildFly на Kubernetes с использованием Vagrant от нашего партнера по JCG Аруна Гупта в блоге Miles to go 2.0… . |


