Статьи

Java EE 7 и WildFly на Kubernetes с использованием Vagrant

Этот совет покажет, как запустить приложение Java EE 7, развернутое в WildFly и размещенное с использованием Kubernetes и Docker. Если вы хотите узнать больше об основах, то в этом блоге уже опубликовано немало контента по этой теме. Пример некоторых из содержания приведен ниже:

Давайте начнем!

Старт Кубернетского кластера

Кластер Kubernetes можно легко запустить на компьютере с Linux, используя обычные сценарии. Существуют руководства по началу работы для различных платформ, таких как Fedora, CoreOS, Amazon Web Services и другие. Для работы кластера Kubernetes в Mac OS X необходимо использовать образ Vagrant, что также объясняется в разделе Начало работы с Vagrant . Этот блог будет использовать Vagrant box.

  1. По умолчанию сценарии управления кластером Kubernetes предполагают, что вы работаете в Google Compute Engine. Kubernetes можно настроить для работы с различными провайдерами : gce , gke , aws , azure , vsphere , local , vsphere . Итак, давайте установим для нашего провайдера vagrant как:
    1
    export KUBERNETES_PROVIDER=vagrant

    Это означает, что ваш кластер Kubernetes работает внутри виртуальной машины Fedora, созданной Vagrant.

  2. Запустите кластер как:
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    kubernetes> ./cluster/kube-up.sh
    Starting cluster using provider: vagrant
    ... calling verify-prereqs
    ... calling kube-up
    Using credentials: vagrant:vagrant
    Bringing 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-logging
    TODO: setup logging
    Done

    Обратите внимание, что эта команда дается из каталога kubernetes, где она уже скомпилирована, как описано в разделе Сборка Kubernetes в Mac OS X.

    По умолчанию установка Vagrant создаст одного kubernetes-master и 1 kubernetes-minion. Это включает в себя создание виртуальной машины Fedora, установку зависимостей, создание master и minion, настройку связи между ними и многое другое. В результате этот шаг может занять несколько минут (~ 10 минут на моей машине).

Проверить кластер Kubernetes

Теперь, когда кластер запущен, давайте удостоверимся, что мы проверяем, что он делает все, что должен.

  1. Убедитесь, что ваши изображения Vagrant правильно, как:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    kubernetes> vagrant status
    Current machine states:
     
    master                    running (virtualbox)
    minion-1                  running (virtualbox)
     
    This environment represents multiple VMs. The VMs are all listed
    above with their current state. For more information about a specific
    VM, run `vagrant status NAME`.

    Это также можно проверить, проверив состояние в консоли Virtual Box, как показано ниже:

    Виртуальные машины Kubernetes в виртуальной коробке

    Виртуальные машины Kubernetes в виртуальной коробке

    boot2docker-vm — это виртуальная машина Boot2Docker. Тогда есть мастер Kubernetes и миньон В.М. Здесь показаны две дополнительные виртуальные машины, но они не относятся к примеру.

  2. Войдите в мастер как:
    1
    2
    3
    kubernetes> vagrant ssh master
    Last login: Fri Jan 30 21:35:34 2015 from 10.0.2.2
    [vagrant@kubernetes-master ~]$

    Убедитесь, что различные компоненты Kubernetes запущены правильно. Начать с сервера Kubernetes API:

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    [vagrant@kubernetes-master ~]$ sudo systemctl status kube-apiserver
    kube-apiserver.service - Kubernetes API Server
       Loaded: loaded (/usr/lib/systemd/system/kube-apiserver.service; enabled)
       Active: active (running) since Fri 2015-01-30 21:34:25 UTC; 7min ago
         Docs: https://github.com/GoogleCloudPlatform/kubernetes
     Main 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:

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    [vagrant@kubernetes-master ~]$ sudo systemctl status kube-controller-manager
    kube-controller-manager.service - Kubernetes Controller Manager
       Loaded: loaded (/usr/lib/systemd/system/kube-controller-manager.service; enabled)
       Active: active (running) since Fri 2015-01-30 21:34:27 UTC; 8min ago
         Docs: https://github.com/GoogleCloudPlatform/kubernetes
     Main 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 как:

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    kubernetes> vagrant ssh minion-1
    Last login: Fri Jan 30 21:37:05 2015 from 10.0.2.2
    [vagrant@kubernetes-minion-1 ~]$ sudo systemctl status docker
    docker.service - Docker Application Container Engine
       Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled)
       Active: active (running) since Fri 2015-01-30 21:39:05 UTC; 8min ago
         Docs: http://docs.docker.com
     Main 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 ~]$ sudo systemctl status kubelet
    kubelet.service - Kubernetes Kubelet Server
       Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled)
       Active: active (running) since Fri 2015-01-30 21:36:57 UTC; 10min ago
         Docs: https://github.com/GoogleCloudPlatform/kubernetes
     Main 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...
     
    . . .
  3. Проверьте миньонов как:
    1
    2
    3
    4
    kubernetes> ./cluster/kubectl.sh get minions
    Running: ./cluster/../cluster/vagrant/../../_output/dockerized/bin/darwin/amd64/kubectl --auth-path=/Users/arungupta/.kubernetes_vagrant_auth get minions
    NAME                LABELS              STATUS
    10.245.1.3          <none>              Ready

    Только один миньон создан. Это можно NUM_MINIONS установив переменную окружения NUM_MINIONS в целое число перед kube-up.sh сценария kube-up.sh .

    Наконец проверьте стручки как:

    1
    2
    3
    4
    5
    6
    kubernetes> ./cluster/kubectl.sh get pods
    Running: ./cluster/../cluster/vagrant/../../_output/dockerized/bin/darwin/amd64/kubectl --auth-path=/Users/arungupta/.kubernetes_vagrant_auth get pods
    POD                                    IP                  CONTAINER(S)        IMAGE(S)                           HOST                    LABELS              STATUS
    22d4a478-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      Running
                                                               kube2sky            kubernetes/kube2sky:1.0                                                       
                                                               skydns              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 pods
Running: ./cluster/../cluster/vagrant/../../_output/dockerized/bin/darwin/amd64/kubectl --auth-path=/Users/arungupta/.kubernetes_vagrant_auth get pods
POD                                    IP                  CONTAINER(S)        IMAGE(S)                           HOST                    LABELS              STATUS
4c283aa1-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-адрес, на котором доступно приложение.

На рисунке ниже показано, как все компоненты соответствуют друг другу:

Java EE 7 / WildFly в Кубернетесе на Mac OS X

Java EE 7 / WildFly в Кубернетесе на Mac OS X

Поскольку по умолчанию создается только один миньон, этот пакет будет создан на этом миньоне. Блог покажет, как можно создать несколько миньонов. Kubernetes конечно выбирает миньона, где созданы стручки.

Запуск модуля гарантирует, что приложение Java EE 7 развернуто в WildFly.

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

Из kubectl.sh get pods столбце HOST отображается IP-адрес, с которого приложение доступно извне. В нашем случае IP-адрес 10.245.1.3 . Итак, откройте приложение в браузере, чтобы увидеть результат как:

Приложение Java EE 7 для Kubernetes

Приложение Java EE 7 для Kubernetes

Это подтверждает, что ваше приложение Java EE 7 теперь доступно.

Kubernetes Советы по отладке

Как только кластер Kubernetes создан, вам нужно отладить его и посмотреть, что происходит под капотом.

Прежде всего, давайте войдем в миньон:

1
2
kubernetes> vagrant ssh minion-1
Last 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 ps
CONTAINER ID        IMAGE                                  COMMAND                CREATED             STATUS              PORTS                                            NAMES
3f7e174b82b1        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 live
02: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.ExpiryQueue
02:04:12,735 INFO  [org.jboss.as.messaging] (ServerService Thread Pool -- 56) JBAS011601: Bound messaging object to jndi name java:/jms/queue/ExpiryQueue
02:04:12,736 INFO  [org.hornetq.core.server] (ServerService Thread Pool -- 60) HQ221003: trying to deploy queue jms.queue.DLQ
02:04:12,749 INFO  [org.jboss.as.messaging] (ServerService Thread Pool -- 60) JBAS011601: Bound messaging object to jndi name java:/jms/queue/DLQ
02: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 found
02:04:12,801 INFO  [org.hibernate.cfg.Environment] (ServerService Thread Pool -- 57) HHH000021: Bytecode provider name : javassist
02:04:12,820 INFO  [org.jboss.as.connector.deployment] (MSC service thread 1-1) JBAS010406: Registered connection factory java:/JmsXA
02: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/RemoteConnectionFactory
02:04:13,025 INFO  [org.jboss.as.messaging] (ServerService Thread Pool -- 58) JBAS011601: Bound messaging object to jndi name java:/ConnectionFactory
02:04:13,072 INFO  [org.hornetq.ra] (MSC service thread 1-1) HornetQ resource adaptor started
02:04:13,073 INFO  [org.jboss.as.connector.services.resourceadapters.ResourceAdapterActivatorService$ResourceAdapterActivator] (MSC service thread 1-1) IJ020002: Deployed: file://RaActivatorhornetq-ra
02:04:13,078 INFO  [org.jboss.as.messaging] (MSC service thread 1-4) JBAS011601: Bound messaging object to jndi name java:jboss/DefaultJMSConnectionFactory
02: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.war
02:04:13,694 INFO  [org.hibernate.validator.internal.util.Version] (MSC service thread 1-2) HV000001: Hibernate Validator 5.1.3.Final
02: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/ShowTimingFacadeREST
 
02: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/TheaterFacadeREST
 
02: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/MovieFacadeREST
 
02: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/SalesFacadeREST
 
02: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/TimeslotFacadeREST
 
02:04:14,802 INFO  [org.jboss.as.messaging] (MSC service thread 1-1) JBAS011601: Bound messaging object to jndi name java:global/jms/pointsQueue
02:04:14,931 INFO  [org.jboss.weld.deployer] (MSC service thread 1-2) JBAS016005: Starting Services for CDI deployment: movieplex7-1.0-SNAPSHOT.war
02: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/pointsQueue
02:04:15,110 INFO  [org.jboss.weld.deployer] (MSC service thread 1-6) JBAS016008: Starting weld service for deployment movieplex7-1.0-SNAPSHOT.war
02: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.H2Dialect
02:04:17,191 WARN  [org.hibernate.dialect.H2Dialect] (ServerService Thread Pool -- 57) HHH000431: Unable to determine H2 database version, certain features may not work
02:04:17,954 INFO  [org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory] (ServerService Thread Pool -- 57) HHH000397: Using ASTQueryTranslatorFactory
02:04:19,832 INFO  [org.hibernate.dialect.Dialect] (ServerService Thread Pool -- 57) HHH000400: Using dialect: org.hibernate.dialect.H2Dialect
02:04:19,833 WARN  [org.hibernate.dialect.H2Dialect] (ServerService Thread Pool -- 57) HHH000431: Unable to determine H2 database version, certain features may not work
02: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 /websocket
02: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 modifications
02: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.ApplicationConfig
02: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.ApplicationConfig
02: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.ApplicationConfig
02: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.ApplicationConfig
02: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.ApplicationConfig
02: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.ApplicationConfig
02: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.ApplicationConfig
02: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.ApplicationConfig
02:04:31,544 INFO  [org.wildfly.extension.undertow] (MSC service thread 1-5) JBAS017534: Registered web context: /movieplex7
02: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/management
02:04:34,859 INFO  [org.jboss.as] (Controller Boot Thread) JBAS015951: Admin console listening on http://127.0.0.1:9990
02: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/bash
docker 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 -la
total 424
drwxr-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 appclient
drwxr-xr-x  5 jboss jboss   4096 Nov 20 22:43 bin
-rw-r--r--  1 jboss jboss   2451 Nov 20 22:43 copyright.txt
drwxr-xr-x  4 jboss jboss   4096 Nov 20 22:43 docs
drwxr-xr-x  5 jboss jboss   4096 Nov 20 22:43 domain
drwx------  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.txt
drwxr-xr-x  3 jboss jboss   4096 Nov 20 22:43 modules
-rw-r--r--  1 jboss jboss   2356 Nov 20 22:43 README.txt
drwxr-xr-x  8 jboss jboss   4096 Feb  3 02:03 standalone
drwxr-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.

Наслаждайтесь!