Как создать и развернуть контейнеризированное приложение (Docker+K8s)

Создание проекта приложения

  1. Перейти на start.spring.io/ [1]

  2. Указать настройки проекта в соответствии с Рис. 1 (можете просто эту ссылку - настройки автоматически установятся в соответствии с вышеупомянутым рисунком):

    fig start.spring.io
    Рис. 1. Создание заготовки проекта
  3. Нажать кнопку “GENERATE”.

  4. Скачать его на своё рабочее место.

Открытие проекта в IDE

Открыть подготовленный на предыдущем шаге проект можно в любом IDE. Ниже пример открытия и работы с проектом средствами IntelliJ IDEA Community Edition (далее - IDEA).

  1. Нажать в Windows правой кнопкой мыши на папке с проектом и выбрать в контекстном меню элемент “Open Folder as IntelliJ IDEA Community Edition Project.

  2. После открытия интерфейса IDEA дождаться, пока загрузятся все зависимости (dependencies).

Изменение прослушиваемого порта

Открыть файл проекта application.properties и добавить следующую строчку (см. Рис. 2 ниже):

server.port = 8000
fig server port changing
Рис. 2. Изменение прослушиваемого порта

Добавление пакета controllers

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

fig controllers package adding
Рис. 3. Добавление пакета controllers

Добавление класса HealthController

Добавить (см. Рис. 4 ниже) [3], [4]:

  • в пакет controllers класс HealthController [4];

  • в вышеупомянутый класс метод checkHealth, обрамить его следующей аннотацией:

    @GetMapping(“health”).
fig health controller adding
Рис. 4. Добавление класса HealthController

Создание docker-образа нашего приложения [5]

  1. Создать в корне нашего проекта файл Dockerfile следующего содержания:

    FROM openjdk:8-jdk-alpine
    #за основу взята 8 версия джавы
    ARG JAR_FILE=target/*.jar
    COPY ${JAR_FILE} app.jar
    ENTRYPOINT ["java","-jar","/app.jar"]
  2. См. п. 7.3.1

  3. Чтобы увидеть вновь созданный образ, запустить следующую команду:

    docker images

    Результаты выполнения команды будут примерно как на Рис. 5 ниже.

    fig if image created checking
    Рис. 5. Проверка успешного создания образа
  4. Запустить созданный образ посредством выполнения следующей команды:

    docker run -p host_port:container_port {image_id}

    где:

    • host_port - порт на вашей машине (любой открытый порт);

    • container_port - порт контейнера, который занят нашим приложением;

    • image_id - идентификатор образа, в примере выше равен 05427e3f564c (вводить здесь и далее без фигурных скобок).

    Команда запуска для нашего примера выше:

    docker run -p 8080:8000 05427e3f564c
  5. Дождаться запуска нашего контейнеризированного приложения (см. Рис. 6 ниже).

fig app launching
Рис. 6. Запуск нашего приложения
  1. Открыть браузер и ввести следующий адрес:

    localhost:8080/health

    Если всё выполнено правильно (и работает правильно), в окне браузера должен быть выведен следующий текст (см. Рис. 7 ниже):

    fig health response
    Рис. 7. Запуск нашего приложения
  2. Для остановки нашего контейнеризированного приложения необходимо выполнить следующее:

    • Выполнить следующую команду:

      docker ps

      Будет выведен список запущенных контейнеров (см. пример на <<a_RunningContainersList ниже):

      fig health response
      Рис. 8. Запуск нашего приложения
    • Выполнить следующую команду:

      docker stop {container_id}

      где container_id - идентификатор нашего контейнера, в примере выше равен 3851257740d0.

Регистрация и размещения образа на dockerhub

  1. Зарегистрироваться на hub.docker.com

  2. Создать репозиторий miniservice

  3. В командной строке на локальной машине последовательно выполнить следующие команды:

    • 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

  1. Зарегистрироваться на github;

  2. Добавить репозиторий miniservice;

  3. Клонировать репозиторий на рабочую машину.

Добавление файлов kubernetes в локальный репозиторий

  1. miniservice-deployment.yaml

  2. miniservice-service.yaml

  3. miniservice-ingress.yaml

  4. nginx-deploy.yaml [6]

Описание сущностей kubernetes

  1. Описать Deployment для нашего приложения.

  2. Описать Service для нашего приложения.

  3. Описать Ingress в соответствии с требованиями к домашнему заданию.

Развертывание приложения в кубах

  1. Выполнить последовательно следующие команды:

    • create -f miniservice-deployment.yaml
    • kubectl create -f miniservice-service.yaml

    Проверить подключение: localhost:31667/health

  2. Выполнить проксирование портов:

    • 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 работать не будет!!!

Создание коммита и заливка в репозиторий

  1. Выполнить для каждого созданного yaml следующую команду:

    git status add {yaml_file_name}
  2. Выполнить коммит посредством выполнения следующей команды:

    git commit -m “Homework is ready”
  3. Выполнить заливку на github посредством выполнения следующей команды:

    git push origin

Список использованных источников:

  1. tproger.ru/articles/spring-boot-bystroe-znakomstvo-i-start-na-primere-prostogo-veb-prilozhenija/#part1

  2. www.baeldung.com/spring-boot-change-port

  3. spring.io/guides/tutorials/rest/

  4. stackoverflow.com/questions/51735084/return-http-code-200-from-spring-rest-api

  5. java-master.com/docker-%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B/

  6. kubernetes.github.io/ingress-nginx/deploy/#quick-start

  7. stackoverflow.com/questions/67031162/what-exactly-does-nginx-ingress-kubernetes-io-rewrite-target-1-mean-in-miniku - кое-что о “$1”, “$2”. etc…

  8. 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