Развертывание 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 <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/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *