- Сборку артефакта произвожу сам, своим инструментом (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
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/
Добавить комментарий