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

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

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


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

Dockerfile
FROM openjdk

MAINTAINER Rylkov Alexander 

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

sfqaka7ktv6dgiq4x5hgtjjjars.png

Состав файлов это условно, если например в 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


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

9gpsvkelhgapvyrs8ypt4wgbwmc.png

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

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


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

_spoeigfhi4yfrjvslwc9qkqogs.png

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

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

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


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

kmzgx8pdj4fdijpjszymorixogw.png

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

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

gqupw2cdds-aqrk1eeyevl-lzna.png

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

qvoyiltd_mfmwkxrk56_pufkdxg.png

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

efe0_t9q-0rnwfbmueirqml6wp4.png

В логе

ttwccef2ab99saldv_kfhmszro0.png

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

Материалы

Installing Minishift
для изучения темы OpenShift я бы посоветовал начать с Minishift

© Habrahabr.ru