Статьи

MySQL как сервис Kubernetes, доступ из WildFly Pod

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 и порт, которая при обращении перенаправляет на соответствующие серверные части.

techtip72-kubernetes-услуги

Позволяет запустить службу 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&amp;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>

Или рассматривается в браузере как:

techtip72-kubernetes-wildfly-вывода

Отладка Кубернетеса и Докера

Вход в ВМ Миньон-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… .