Как создать и развернуть контейнеризированное приложение (Docker+K8s)
- Создание проекта приложения
- Открытие проекта в IDE
- Изменение прослушиваемого порта
- Добавление пакета controllers
- Добавление класса HealthController
- Создание docker-образа нашего приложения [5]
- Регистрация и размещения образа на dockerhub
- Полезный скрипт для Linux
- Регистрация на github, создание репозитория для развёртывания miniservice
- Добавление файлов kubernetes в локальный репозиторий
- Описание сущностей kubernetes
- Развертывание приложения в кубах
- Установка nginx-controller
- Установка ingress
- Создание коммита и заливка в репозиторий
- Список использованных источников:
Создание проекта приложения
-
Перейти на start.spring.io/ [1]
-
Указать настройки проекта в соответствии с Рис. 1 (можете просто эту ссылку - настройки автоматически установятся в соответствии с вышеупомянутым рисунком):
Рис. 1. Создание заготовки проекта -
Нажать кнопку “GENERATE”.
-
Скачать его на своё рабочее место.
Открытие проекта в IDE
Открыть подготовленный на предыдущем шаге проект можно в любом IDE. Ниже пример открытия и работы с проектом средствами IntelliJ IDEA Community Edition (далее - IDEA).
-
Нажать в Windows правой кнопкой мыши на папке с проектом и выбрать в контекстном меню элемент “Open Folder as IntelliJ IDEA Community Edition Project.
-
После открытия интерфейса IDEA дождаться, пока загрузятся все зависимости (dependencies).
Изменение прослушиваемого порта
Открыть файл проекта application.properties и добавить следующую строчку (см. Рис. 2 ниже):
server.port = 8000

Добавление пакета controllers
Добавить в корень проекта пакет controllers (см. Рис. 3 ниже).

Добавление класса HealthController
Добавить (см. Рис. 4 ниже) [3], [4]:
-
в пакет controllers класс HealthController [4];
-
в вышеупомянутый класс метод checkHealth, обрамить его следующей аннотацией:
@GetMapping(“health”).

Создание docker-образа нашего приложения [5]
-
Создать в корне нашего проекта файл Dockerfile следующего содержания:
FROM openjdk:8-jdk-alpine #за основу взята 8 версия джавы ARG JAR_FILE=target/*.jar COPY ${JAR_FILE} app.jar ENTRYPOINT ["java","-jar","/app.jar"]
-
См. п. 7.3.1
-
Чтобы увидеть вновь созданный образ, запустить следующую команду:
docker images
Результаты выполнения команды будут примерно как на Рис. 5 ниже.
Рис. 5. Проверка успешного создания образа -
Запустить созданный образ посредством выполнения следующей команды:
docker run -p host_port:container_port {image_id}
где:
-
host_port - порт на вашей машине (любой открытый порт);
-
container_port - порт контейнера, который занят нашим приложением;
-
image_id - идентификатор образа, в примере выше равен 05427e3f564c (вводить здесь и далее без фигурных скобок).
Команда запуска для нашего примера выше:
docker run -p 8080:8000 05427e3f564c
-
-
Дождаться запуска нашего контейнеризированного приложения (см. Рис. 6 ниже).

-
Открыть браузер и ввести следующий адрес:
localhost:8080/health
Если всё выполнено правильно (и работает правильно), в окне браузера должен быть выведен следующий текст (см. Рис. 7 ниже):
Рис. 7. Запуск нашего приложения -
Для остановки нашего контейнеризированного приложения необходимо выполнить следующее:
-
Выполнить следующую команду:
docker ps
Будет выведен список запущенных контейнеров (см. пример на <<a_RunningContainersList ниже):
Рис. 8. Запуск нашего приложения -
Выполнить следующую команду:
docker stop {container_id}
где container_id - идентификатор нашего контейнера, в примере выше равен 3851257740d0.
-
Регистрация и размещения образа на dockerhub
-
Зарегистрироваться на hub.docker.com
-
Создать репозиторий miniservice
-
В командной строке на локальной машине последовательно выполнить следующие команды:
-
docker build –tag miniservice:v1 .
Try -t instead of -tag and don’t forget about “.” at the end of the command.
-
docker login -u “{username}” -p “{password}” docker.io
-
docker tag miniservice:v1 {user_name}/miniservice:v1
-
docker push docker.io/vetalalien/miniservice:v1
-
Полезный скрипт для Linux
Не забудь сделать его исполняемым: chmod +x {script_name} |
#!/bin/bash
docker build -t minicrud:v1 .
docker tag minicrud:v1 vetalalien/minicrud:v1
docker push docker.io/vetalalien/minicrud:v1
docker-compose -p hub_minicrud_java stop
docker-compose -p hub_minicrud_java rm
docker-compose --project-name hub_minicrud_java up -d
Регистрация на github, создание репозитория для развёртывания miniservice
-
Зарегистрироваться на github;
-
Добавить репозиторий miniservice;
-
Клонировать репозиторий на рабочую машину.
Добавление файлов kubernetes в локальный репозиторий
-
miniservice-deployment.yaml
-
miniservice-service.yaml
-
miniservice-ingress.yaml
-
nginx-deploy.yaml [6]
Описание сущностей kubernetes
-
Описать Deployment для нашего приложения.
-
Описать Service для нашего приложения.
-
Описать Ingress в соответствии с требованиями к домашнему заданию.
Развертывание приложения в кубах
-
Выполнить последовательно следующие команды:
-
create -f miniservice-deployment.yaml
-
kubectl create -f miniservice-service.yaml
Проверить подключение: localhost:31667/health
-
-
Выполнить проксирование портов:
-
kubectl get replicaset
-
kubectl port-forward replicaset/miniservice-645d87cf64 8001:8000
Проверить подключение: localhost:8001/health
-
Установка nginx-controller
Установить nginx-controller посредством выполнения следующей команды [6]:
kubectl create -f nginx-deploy.yaml
Установка ingress
Установить ingress посредством выполнения следующей команды:
kubectl apply -f miniservice-ingress.yaml
Это интересно:
В секцию annotations можно добавить следующую аннотацию: kubernetes.io/ingress.class: "nginx" Это равнозначно добавлению в секцию spec следующего атрибута: ingressClassName: nginx Без указания класса ingress работать не будет!!! |
Создание коммита и заливка в репозиторий
-
Выполнить для каждого созданного yaml следующую команду:
git status add {yaml_file_name}
-
Выполнить коммит посредством выполнения следующей команды:
git commit -m “Homework is ready”
-
Выполнить заливку на github посредством выполнения следующей команды:
git push origin
Список использованных источников:
-
stackoverflow.com/questions/51735084/return-http-code-200-from-spring-rest-api
-
java-master.com/docker-%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B/
-
stackoverflow.com/questions/67031162/what-exactly-does-nginx-ingress-kubernetes-io-rewrite-target-1-mean-in-miniku - кое-что о “$1”, “$2”. etc…
-
kubernetes.github.io/ingress-nginx/examples/rewrite/ - кое-что о “$1”, “$2”. Смотри: “In this ingress definition, any characters captured by (.) will be assigned to the placeholder $2, which is then used as a parameter in the rewrite-target annotation.”. Если вкратце, то для /otusapp/vitalii(/|$)(.) $2 означает, что возьмётся вторая группа регулярки - (.*) - т.е. то, что будет после /otusapp/vitalii/ - например, arch.homework/otusapp/vitallii/health в браузере откроет xxx.xxx.xxx.xxx:port_number/health