Java EE 7 и WildFly на Kubernetes с использованием Vagrant (Tech Tip # 71) объяснили, как запустить тривиальное приложение Java EE 7 на WildFly, размещенном с использованием Kubernetes и Docker. Приложение Java EE 7 было практической лабораторией , поставляемой по всему миру. Он использует базу данных в памяти, которая связана с WildFly и позволяет понять ключевые строительные блоки Kubernetes. Это хорошо, чтобы вы начали с первоначальных усилий по разработке, но быстро становятся узким местом, поскольку база данных теряется, когда сервер приложений выходит из строя. Этот технический совет покажет, как запустить другое тривиальное приложение Java EE 7 и использовать MySQL в качестве сервера базы данных. Он будет использовать службы Kubernetes, чтобы объяснить, как MySQL и WildFly могут быть легко отделены.
Давайте начнем!
Убедитесь, что у вас есть работающая настройка Kubernetes, как описано в Kubernetes с использованием Vagrant .
Полный исходный код, используемый в этом блоге, доступен по адресу github.com/arun-gupta/kubernetes-java-sample .
Запустить MySQL Kubernetes pod
Первый шаг — запустить модуль MySQL. Это можно запустить с помощью файла конфигурации MySQL Kubernetes:
1
2
3
4
|
kubernetes> . /cluster/kubectl .sh create -f .. /kubernetes-java-sample/mysql .json KUBE_MASTER_IP: 10.245.1.2 Running: . /cluster/ .. /cluster/vagrant/ ../.. /_output/dockerized/bin/darwin/amd64/kubectl --auth-path= /Users/arungupta/ .kubernetes_vagrant_auth create -f .. /kubernetes-java-sample/mysql .json mysql |
Файл конфигурации используется по адресу github.com/arun-gupta/kubernetes-java-sample/blob/master/mysql.json .
Проверьте статус модуля MySQL:
1
2
3
4
5
|
kubernetes> . /cluster/kubectl .sh get pods KUBE_MASTER_IP: 10.245.1.2 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 mysql 10.246.1.3 mysql mysql:latest 10.245.1.3 /10 .245.1.3 name=mysql Pending |
Подождите, пока статус не изменится на «Бег». Это будет выглядеть так:
1
2
3
4
|
KUBE_MASTER_IP: 10.245.1.2 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 mysql 10.246.1.3 mysql mysql:latest 10.245.1.3 /10 .245.1.3 name=mysql Running |
Чтобы сервер MySQL находился в таком состоянии, требуется несколько минут, так что возьмите кофе или быстро и быстро!
Запустите сервис MySQL Kubernetes
Стручки и назначенные им IP-адреса эфемерны. Если модуль умирает, Kubernetes воссоздает этот модуль из-за его особенностей самовосстановления, но он может воссоздать его на другом хосте. Даже если он находится на одном хосте, ему может быть назначен другой IP-адрес. И поэтому любое приложение не может полагаться на IP-адрес модуля.
Сервисы Kubernetes — это абстракция, которая определяет логический набор модулей. Служба обычно поддерживается одним или несколькими физическими модулями (ассоциированными с использованием меток ) и имеет постоянный IP-адрес, который может использоваться другими модулями / приложениями. Например, модуль WildFly не может напрямую подключаться к модулю MySQL, но может подключаться к службе MySQL. По сути, сервис Kubernetes предлагает клиентам пару IP и порт, которая при обращении перенаправляет на соответствующие серверные части.
Позволяет запустить службу MySQL.
1
2
3
4
|
kubernetes> . /cluster/kubectl .sh create -f .. /kubernetes-java-sample/mysql-service .json KUBE_MASTER_IP: 10.245.1.2 Running: . /cluster/ .. /cluster/vagrant/ ../.. /_output/dockerized/bin/darwin/amd64/kubectl --auth-path= /Users/arungupta/ .kubernetes_vagrant_auth create -f .. /kubernetes-java-sample/mysql-service .json mysql |
Файл конфигурации используется по адресу github.com/arun-gupta/kubernetes-java-sample/blob/master/mysql-service.json . В этом случае запускается только один экземпляр MySQL. Но несколько экземпляров MySQL могут быть легко запущены, и WildFly Pod продолжит ссылаться на все из них, используя MySQL Service.
Проверьте статус / IP службы MySQL:
1
2
3
4
5
6
7
8
|
kubernetes> . /cluster/kubectl .sh get services KUBE_MASTER_IP: 10.245.1.2 Running: . /cluster/ .. /cluster/vagrant/ ../.. /_output/dockerized/bin/darwin/amd64/kubectl --auth-path= /Users/arungupta/ .kubernetes_vagrant_auth get services NAME LABELS SELECTOR IP PORT kubernetes component=apiserver,provider=kubernetes <none> 10.247.0.2 443 kubernetes-ro component=apiserver,provider=kubernetes <none> 10.247.0.1 80 mysql name=mysql name=mysql 10.247.202.104 3306 skydns k8s-app=skydns k8s-app=skydns 10.247.0.10 53 |
Запустить WildFly Kubernetes Pod
WildFly Pod должен быть запущен после запуска сервиса MySQL. Это связано с тем, что переменные среды, используемые для создания ресурса JDBC в WildFly, доступны только после запуска службы. В частности, ресурс JDBC создается как:
1
|
data- source add --name=mysqlDS --driver-name=mysql --jndi-name=java:jboss /datasources/ExampleMySQLDS --connection-url=jdbc:mysql: // $MYSQL_SERVICE_HOST:$MYSQL_SERVICE_PORT /sample ?useUnicode= true &characterEncoding=UTF-8 --user-name=mysql --password=mysql --use-ccm= false --max-pool-size=25 --blocking-timeout-wait-millis=5000 --enabled= true |
$MYSQL_SERVICE_PORT
среды $MYSQL_SERVICE_HOST
и $MYSQL_SERVICE_PORT
заполняются Kubernetes, как описано здесь .
Это показано на сайте github.com/arun-gupta/docker-images/blob/master/wildfly-mysql-javaee7/customization/execute.sh#L44 .
Запустите модуль WildFly:
1
2
3
4
|
kubernetes> . /cluster/kubectl .sh create -f .. /kubernetes-java-sample/wildfly .json KUBE_MASTER_IP: 10.245.1.2 Running: . /cluster/ .. /cluster/vagrant/ ../.. /_output/dockerized/bin/darwin/amd64/kubectl --auth-path= /Users/arungupta/ .kubernetes_vagrant_auth create -f .. /kubernetes-java-sample/wildfly .json wildfly |
Используемый файл конфигурации находится на github.com/arun-gupta/kubernetes-java-sample/blob/master/wildfly.json .
Проверьте статус стручков:
1
2
3
4
5
|
KUBE_MASTER_IP: 10.245.1.2 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 mysql 10.246.1.3 mysql mysql:latest 10.245.1.3 /10 .245.1.3 name=mysql Running wildfly 10.246.1.4 wildfly arungupta /wildfly-mysql-javaee7 :knetes 10.245.1.3 /10 .245.1.3 name=wildfly Pending |
Подождите, пока статус модуля WildFly не изменится на Running. Это может занять несколько минут, так что, может быть, пришло время взять еще один быстрый мильер!
После того, как контейнер запущен и работает, вы можете проверить /opt/jboss/wildfly/standalone/configuration/standalone.xml в контейнере WildFly и убедиться, что URL-адрес соединения действительно содержит правильный IP-адрес. Вот как это выглядит на моей машине:
1
2
|
[jboss@wildfly ~]$ grep 3306 /opt/jboss/wildfly/standalone/configuration/standalone .xml <connection-url>jdbc:mysql: //10 .247.202.104:3306 /sample ?useUnicode= true &characterEncoding=UTF-8< /connection-url > |
Обновленный статус (после запуска контейнера) будет выглядеть следующим образом:
1
2
3
4
5
6
|
kubernetes> . /cluster/kubectl .sh get pods KUBE_MASTER_IP: 10.245.1.2 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 mysql 10.246.1.3 mysql mysql:latest 10.245.1.3 /10 .245.1.3 name=mysql Running wildfly 10.246.1.4 wildfly arungupta /wildfly-mysql-javaee7 :knetes 10.245.1.3 /10 .245.1.3 name=wildfly Running |
Доступ к приложению Java EE 7
Запишите HOST IP-адрес контейнера WildFly и получите доступ к приложению как:
1
|
curl http: //10 .245.1.3:8080 /employees/resources/employees |
чтобы увидеть результат как:
1
|
<?xml version= "1.0" encoding= "UTF-8" standalone= "yes" ?><collection><employee>< id >1< /id ><name>Penny< /name >< /employee ><employee>< id >2< /id ><name>Sheldon< /name >< /employee ><employee>< id >3< /id ><name>Amy< /name >< /employee ><employee>< id >4< /id ><name>Leonard< /name >< /employee ><employee>< id >5< /id ><name>Bernadette< /name >< /employee ><employee>< id >6< /id ><name>Raj< /name >< /employee ><employee>< id >7< /id ><name>Howard< /name >< /employee ><employee>< id >8< /id ><name>Priya< /name >< /employee >< /collection > |
Или рассматривается в браузере как:
Отладка Кубернетеса и Докера
Вход в ВМ Миньон-1:
1
2
|
kubernetes> vagrant ssh minion-1 Last login: Tue Feb 10 23:20:13 2015 from 10.0.2.2 |
Войдите в систему как root:
1
2
3
|
[vagrant@kubernetes-minion-1 ~]$ su - Password: [root@kubernetes-minion-1 ~] # |
Пароль пользователя по умолчанию для образов виртуальных машин, созданных Vagrant, — «vagrant».
Список Docker-контейнеров, запущенных на этой виртуальной машине, можно увидеть как:
1
2
3
4
5
6
7
8
|
[root@kubernetes-minion-1 ~] # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7fc1fca102bf arungupta /wildfly-mysql-javaee7 :knetes " /opt/jboss/wildfly/ 28 minutes ago Up 28 minutes k8s_wildfly.6c5f240e_wildfly.default.api_1230e74a-b178-11e4-8464-0800279696e1_509268aa 4aa49c0ebb70 kubernetes /pause :go "/pause" 43 minutes ago Up 43 minutes 0.0.0.0:8080->8080 /tcp , 0.0.0.0:9090->9090 /tcp k8s_POD.bca60d1a_wildfly.default.api_1230e74a-b178-11e4-8464-0800279696e1_0bff6efa c36e99cd4557 mysql:latest " /entrypoint .sh mysq 47 minutes ago Up 47 minutes k8s_mysql.278e3c40_mysql.default.api_f3d07101-b175-11e4-8464-0800279696e1_ddbcaf62 ed4611b5c276 google /cadvisor :0.8.0 "/usr/bin/cadvisor" 56 minutes ago Up 56 minutes k8s_cadvisor.8d424740_cadvisor-agent. file -6bb810db-kubernetes-minion-1.file_80331227d28e618b4cef459507a31796_36d83f7d 50a3428612f0 kubernetes /pause :go "/pause" 58 minutes ago Up 58 minutes 0.0.0.0:3306->3306 /tcp k8s_POD.c783ea16_mysql.default.api_f3d07101-b175-11e4-8464-0800279696e1_e46a8424 11a95eeda794 kubernetes /pause :go "/pause" 59 minutes ago Up 59 minutes 0.0.0.0:4194->8080 /tcp k8s_POD.252debe0_cadvisor-agent. file -6bb810db-kubernetes-minion-1.file_80331227d28e618b4cef459507a31796_734d54eb |
Последние 10 строк журнала WildFly (после нескольких обращений к приложению) можно увидеть как:
01
02
03
04
05
06
07
08
09
10
|
23:12:25,004 INFO [stdout] (ServerService Thread Pool -- 50) Hibernate: INSERT INTO EMPLOYEE_SCHEMA(ID, NAME) VALUES (8, 'Priya' ) 23:12:27,928 INFO [org.jboss.resteasy.spi.ResteasyDeployment] (MSC service thread 1-5) Deploying javax.ws.rs.core.Application: class org.javaee7.samples.employees.MyApplication 23:12:27,987 INFO [org.wildfly.extension.undertow] (MSC service thread 1-5) JBAS017534: Registered web context: /employees 23:12:28,073 INFO [org.jboss.as.server] (ServerService Thread Pool -- 28) JBAS018559: Deployed "employees.war" (runtime-name : "employees.war" ) 23:12:28,203 INFO [org.jboss.as] (Controller Boot Thread) JBAS015961: Http management interface listening on http: //127 .0.0.1:9990 /management 23:12:28,203 INFO [org.jboss.as] (Controller Boot Thread) JBAS015951: Admin console listening on http: //127 .0.0.1:9990 23:12:28,204 INFO [org.jboss.as] (Controller Boot Thread) JBAS015874: WildFly 8.2.0.Final "Tweek" started in 26772ms - Started 280 of 334 services (92 services are lazy, passive or on-demand) 23:23:16,091 INFO [stdout] (default task-16) Hibernate: select employee0_. id as id1_0_, employee0_.name as name2_0_ from EMPLOYEE_SCHEMA employee0_ 23:24:07,322 INFO [stdout] (default task-17) Hibernate: select employee0_. id as id1_0_, employee0_.name as name2_0_ from EMPLOYEE_SCHEMA employee0_ 23:35:07,030 INFO [stdout] (default task-18) Hibernate: select employee0_. id as id1_0_, employee0_.name as name2_0_ from EMPLOYEE_SCHEMA employee0_ |
Аналогично, журнал MySQL выглядит так:
01
02
03
04
05
06
07
08
09
10
|
2015-02-10 22:52:55 1 [Note] Server hostname (bind-address): '*' ; port: 3306 2015-02-10 22:52:55 1 [Note] IPv6 is available. 2015-02-10 22:52:55 1 [Note] - '::' resolves to '::' ; 2015-02-10 22:52:55 1 [Note] Server socket created on IP: '::' . 2015-02-10 22:52:56 1 [Note] Event Scheduler: Loaded 0 events 2015-02-10 22:52:56 1 [Note] Execution of init_file '/tmp/mysql-first-time.sql' started. 2015-02-10 22:52:56 1 [Note] Execution of init_file '/tmp/mysql-first-time.sql' ended. 2015-02-10 22:52:56 1 [Note] mysqld: ready for connections. Version: '5.6.23' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server (GPL) 2015-02-10 23:12:21 1 [Warning] IP address '10.246.1.1' could not be resolved: Name or service not known |
Наслаждайтесь!
Ссылка: | MySQL как сервис Kubernetes, доступ от WildFly Pod от нашего партнера по JCG Аруна Гупта в блоге Miles to go 2.0… . |