Развертывание Java приложения в OpenShift

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!

Казалось бы что здесь такого? подключаем к проекту fabric8-maven-plugin и вперед: сборка, запуск приложения в OpenShift. Но когда изучал хотелось большего понимания этого процесса, а затем хотелось большего контроля и свободы над процессом сборки и развертывания приложения в OpenShift. Таким образом получился следующий сценарий и с такими особенностями.

  • Сборку артефакта произвожу сам, своим инструментом (maven, gradle и др.)
  • Контролирую создание Docker Image через Dockerfile
  • Build и Deployment процесс в Openshift настраивается в шаблоне, т.е. любые характеристики контейнера, pod настраиваются.
  • Таким образом сам процесс можно перенести во внешнюю систему сборки, развертывания

Конечно для этого использую доступные возможности самого OpenShift, которых предостаточно.
И так у меня есть подготовленный java артефакт, далее подготавливаю Dockerfile c нужными мне характеристиками и функциональностью

Dockerfile

FROM openjdk

MAINTAINER Rylkov Alexander <arylkov@ххххх.ххх>

COPY demo.springboot.mvn-0.0.1-SNAPSHOT.jar /deployments/app.jar

ENV JAVA_OPTS="$JAVA_OPTS -Xms500m -Xmx1024m"

EXPOSE 8080
EXPOSE 5005

ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar /deployments/app.jar" ]

Таким образом в папке будет два файла: артефакт и Dockerfile



Состав файлов это условно, если например в Dockerfile потребуются еще дополнительные файлы для docker image, то их добавляем сюда. Сейчас собственно в Dockerfile указан базовый образ java и мое приложение Spring boot, открыто два порта и др.

На этом шаге имеем выбор/свободу в средстве сборки приложения и сборки docker image.

Далее подготавливаю OpenShift template для приложения, эта операция может быть разовой, ее надо только параметризовать. Поскольку он может содержать в себе все возможное для создания, запуска и работы приложения, то через него и будем управлять этими процессами. У меня он будет достаточно простой и состоять из трех самых необходимых конфигураций

  • ImageStream
  • BuildConfig
  • DeploymentConfig

Template java-app-sample
kind: Template
apiVersion: v1
metadata:
  labels:
    app: java-app-sample
  name: java-app-sample
  annotations:
    description: >-
      This example shows how to create a simple Java application in openshift
    tags: java
parameters:
  - name: APP_NAME
    description: application name
    value: app-sample
    required: true
objects:
  - kind: ImageStream
    apiVersion: v1
    metadata:
      name: "${APP_NAME}"
    spec:
      tags:
        - from:
            kind: DockerImage
            name: 172.30.1.1:5000/myproject/${APP_NAME}:latest
          name: latest
  - kind: BuildConfig
    apiVersion: v1
    metadata:
      name: "${APP_NAME}"
      labels:
        name: "${APP_NAME}"
    spec:
      source:
        binary: {}
        type: Binary
      strategy:
        type: Docker
      output:
        to:
          kind: DockerImage
          name: 172.30.1.1:5000/myproject/${APP_NAME}:latest
      postCommit: {}
      resources: {}
  - kind: DeploymentConfig
    apiVersion: v1
    metadata:
      name: "${APP_NAME}"
    spec:
      strategy:
        type: Rolling
        rollingParams:
          updatePeriodSeconds: 1
          intervalSeconds: 1
          timeoutSeconds: 120
        resources: {}
      replicas: 1
      selector:
        app: "${APP_NAME}"
      template:
        metadata:
          labels:
            app: "${APP_NAME}"
        spec:
          containers:
            - name: "${APP_NAME}"
              image: 172.30.1.1:5000/myproject/${APP_NAME}:latest
              ports:
                - containerPort: 8080
                  protocol: TCP
                - containerPort: 5005
                  protocol: TCP
              env:
                - name: TZ
                  value: Europe/Moscow
              resources:
                limits:
                  cpu: '0.5'
                  memory: 1000Mi
                requests:
                  cpu: '0.2'
                  memory: 500Mi
              imagePullPolicy: Always
          restartPolicy: Always
          dnsPolicy: ClusterFirst
    triggers:
      - type: ConfigChange
        imageChangeParams:
          automatic: true
          containerNames:
            - "${APP_NAME}"
          from:
            kind: ImageStreamTag
            name: 172.30.1.1:5000/myproject/${APP_NAME}:latest
      - type: ImageChange
    status: {}


В шаблоне указаны как пример некоторые параметры контейнера, указаны например ресурсы/лимиты, перемененная окружения TZ, указан один параметр шаблона — имя приложения (APP_NAME). Адрес docker реестра указан для версии minishift (172.30.1.1:5000/myproject/ ее использую локально для разработки) и др.

Но для моего сценария самое главное указано здесь

  - kind: BuildConfig
    spec:
      source:
        binary: {}
        type: Binary
      strategy:
        type: Docker

В BuildConfig сказано что источником будет являться бинарный файл(ы), а управлять стратегией подготовки docker image — Dockerfile (type: Docker)

Создадим этот шаблон в OpenShift

 oc create -f template.yaml


Этот шаблон появится в каталоге шаблонов (можно будет организовать процесс и из web UI консоли, но не здесь).



По этому шаблону далее создадим приложение (по факту это только имя и не более)

oc new-app java-app-sample -p APP_NAME=app-sample

укажем имя шаблона и параметр имя приложения



Создались три мои конфигурации.

Запускаем сам процесс сборки и развертывания приложения в контейнере.

>oc start-build app-sample --from-dir . --follow

Важно выполнять из папки где указан бинарный файл и Dockerfile, как раз параметр --from-dir указывает на это, что будет подготовлена вся папка для загрузки в OpenShift для построения и развертывания image в docker реестре. Есть и другие параметры этой команды, например из архива.



Видим, что содержимое папки было загружено в OpenShift, который запустил процесс Docker для подготовки Image по Dockerfile и в заключении поместил образ в docker registry.

В web консоли OpenShift видно стартовало приложение



Указанные в конфигурации параметры контейнера



Указанная в конфигурации переменная окружения



В логе



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

Материалы

Installing Minishift
для изучения темы OpenShift я бы посоветовал начать с Minishift
Источник: https://habr.com/ru/post/500076/


Интересные статьи

Интересные статьи

Прокачивайте скилы, читайте, смотрите, думайте, применяйте на практике! Станьте частью DevNation! Читать дальше: Еще немного про C# 8.0, шпаргалка по Red Hat OpenShift C...
Статья о том, как упорядочить найм1. Информируем о вакансии2. Ведём до найма3. Автоматизируем скучное4. Оформляем и выводим на работу5. Отчитываемся по итогам6. Помогаем с адаптацией...
FYI: Первая часть. Бенчмарк пакетного конвейера Пакетный конвейер обрабатывает конечный объём сохранённых данных. Здесь нет потока результатов обработки, выходные данные агрегир...
Приветствую, Дорогие Друзья. Продолжаем цикл статей, освещающий деятельность (бурную) нашей некоммерческой организации. Как и обещал — переходим от простого (логирование) к более сложному: мета...
Доброго времени суток жители Хабра! Сегодня хочу рассказать вам, как нам очень хотелось мониторить postgres и еще пару сущностей внутри кластера OpenShift и как мы это сделали. На входе име...