Skip to content

ivaninkv microservices repository

License

Notifications You must be signed in to change notification settings

Otus-DevOps-2020-02/ivaninkv_microservices

Repository files navigation

ivaninkv microservices repository

HW12 Docker под капотом

Основное ДЗ

  • Настроили интеграцию с travis-ci
  • Установили docker и docker-machine
  • Проверили базовые команды docker
    • docker run (create + start + attach)
    • docker start
    • docker attach
    • docker exec
    • docker kill
    • docker stop
    • docker rm
    • docker rmi
  • Создали image из запущенного контейнера (docker commit)
  • Создали docker-host на GCP
  • Созздали свой образ при помощи Dockerfile и docker build
  • Запустили контейнер в docker-host на GCP
  • Опубликовали образ на dockerhub

Команда создания docker-host'а:

export GOOGLE_PROJECT=docker-275604

docker-machine create --driver google \
    --google-machine-image https://www.googleapis.com/compute/v1/projects/ubuntu-os-cloud/global/images/family/ubuntu-1604-lts \
    --google-machine-type n1-standard-1 \
    --google-zone europe-west1-b \
    docker-host

Команда создания правила файервола:

 gcloud compute firewall-rules create reddit-app \
    --allow tcp:9292 \
    --target-tags=docker-machine \
    --description="Allow PUMA connections" \
    --direction=INGRESS

Первое задание со*

  • Описали различия в выводе команд docker inspect container и docker inspect image в файле docker-1/log

Второе задание со*

  • Описали создание инстансов с помощью terraform
  • Описали плейбуки ansible для установки docker
  • Описали файлы для создания образов с установленным docker'ом

HW13 Docker. Микросервисы

Основное ДЗ

  • Скачали исходники приложения
  • Установили hadolint и плагин для VS Code
  • Создали 3 докерфайла для различных компонентов сервиса
  • Собрали 3 образа, при сброке образа ui, использовался кэш
  • Создали bridge network для контейнеров, запустили их и проверили работоспособность сервиса
  • Пересоздали образ ui исользуя другой базовый образ, чтобы уменьшить размер образа
  • Подключили docker volume для сохранения данных после перезапуска контейнеров.

Первое задание со*

Оригинальная команда запуска:

docker network create reddit
docker run -d --network=reddit --network-alias=post_db --network-alias=comment_db mongo:latest
docker run -d --network=reddit --network-alias=post const84/post:1.0
docker run -d --network=reddit --network-alias=comment const84/comment:1.0
docker run -d --network=reddit -p 9292:9292 const84/ui:2.0

Команда с передачей ENV, документация по ссылке:

docker run -d --network=reddit --network-alias=post_db1 --network-alias=comment_db1 mongo:latest
docker run -d --network=reddit \
            --env POST_DATABASE_HOST=post_db1 \
            --env POST_DATABASE=posts1 \
            --network-alias=post1 const84/post:1.0
docker run -d --network=reddit \
            --env COMMENT_DATABASE_HOST=comment_db1 \
            --env COMMENT_DATABASE=comments1 \
            --network-alias=comment1 const84/comment:1.0
docker run -d --network=reddit \
            --env POST_SERVICE_HOST=post1 \
            --env COMMENT_SERVICE_HOST=comment1 \
            -p 9292:9292 const84/ui:2.0

Второе задание со*

Не получилось полностью выполнить, было лень разбираться с ruby и его зависимостями. Пример докерфайла можно посмотреть здесь.

HW14 Сеть Docker. Docker-compose

Основное ДЗ

  • Поэксперементировали с сетями и алиасами сетей
  • Создали 2 сети и запустили в них наше приложение
  • Посмотрели создаваемые правила файервола
  • Запустили базовый docker-compose файл
  • Параметризировали docker-compose с помощью .env файла
  • Имя проекта docker-compose можно задать с помощью опции командной строки -p или с помощью переменной окружения COMPOSE_PROJECT_NAME.

Задание со*

  • Написан файл docker-compose.override.yml
    • ui, comment запускаются командой puma --debug -w 2
    • post запускается командой с помощью нового скрипта new_post_app.py (который является копией оригинального)
  • Продвинутое конфигурирование docker-compose

HW15 Gitlab CI

Основное ДЗ

  • Подняли машину с докером в GCP
  • Установили туда Gitlab CI, gitlab-runner
  • Создали группу проектов, проект
  • Создали пайплайн и зарегистрировали его
  • Добавили исходный код приложения в репозиторий
  • Добавили тест для приложения
  • Описали несколько окружений
  • stage и prod окружения запускаются только тогда, когда проставлен тэг в гите
  • Добавили динамические окружения

Задание со*

  • Как делать билд контейнеров докер в GitLab описано в документации. Плюс есть пример в файле к лекции MeetUP.pdf
  • Для автоматизации установки gitlab-runner можно использовать готовые ansible роли, как например эта
  • Настроена интеграция со slack

HW16 Monitoring

Основное ДЗ

  • Создали DockerHost и подняли в нем Prometheus
  • Изучили web-интерфейс Prometheus
  • Создали свой docker-образ Prometheus со своим конфигом
  • Создали docker-compose.yml с микросервисами и Prometheus'ом
  • Проверили как работает мониторинг, если останавливать один из компонентов системы
  • Добавили node-exporter в нашу конфигурацию, для мониторинга состояния хоста
  • Сслыка на DockerHub

Задание со*

HW17 Monitoring 2. Приложение и инфраструктура

Основное ДЗ

  • Разделили файл docker-compose.yml на 2, отдельно приложение и отдельно мониторинг
  • Добавили cAdviser для мониторинга Docker контейнеров
  • Добавили Grafana для визуализации данных Prometheus
  • Настроили несколько дашбордов, визуализирующих как технические, так и бизнес метрики
  • Настроили алертинг при недоступности одного из сервисов в течении 1 минуты
  • Сслыка на DockerHub

HW18 Логирование в инфраструктуре Docker

Основное ДЗ

  • Создали Docker-compose для централизованного логирования (ElasticSearch, Fluentd, Kibana)

  • При запуске инфоаструктуры логирования встретились 2 ошибки

    • max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] - решение тут
    • the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured - решение добавить в docker-compose-logging девелопер-режим
        environment:
            - discovery.type=single-node
    
  • Добавили в сервис post драйвер fluentd для логирования структурированных логов

  • Добавили в сервис ui драйвер fluentd для логирования неструктурированных логов

  • В интерфейсе Kibana настроили индекс для просмотра логов

  • Посмотрели как Kibana отображет логи, попробовали как работает поиск

  • В fluent.conf настроили парсер, для парсинга json по полям

  • Для несруктурированных логов настроили и проверили парсинг логов через регулярку и grok-шаблон

  • Добавили в инфраструктуру zipkin и проверили распределенную трассировку

HW19 Kubernetes. The Hard Way

Инструкция

Основное ДЗ

  • Пререквизиты - установили gcloud и выполнили аутентификацию, установили дефолтную зону и регион
  • Установили клиентские утилиты cfssl, cfssljson, and kubectl.
  • Создали VPC для кластера k8s, правила фаервола, внешний IP. Создали 3 контроллера и 3 воркера.
  • С помощью утилиты cfssl сгенерировали сертификат и приватный ключ для авторизации, для каждого воркера, для контроллера, прокси и шедуллера, API-сервера.
  • Сгенерировали конфигурационные файлы для воркеров, kube-proxy, controller-manager, kube-scheduler
  • Сгенерировали ключ и конфиг шифрования, залили их на контроллеры
  • Сконфигурировали и запустили etcd на контроллерах
  • Настроили и запустили на контроллерах kube-apiserver, kube-controller-manager, kube-scheduler, kubectl
  • Установили и запустили на воркерах runc, container networking plugins, containerd, kubelet, kube-proxy
  • Сгенерировали kubeconfig
  • Настроили правила маршрутизации
  • Установили DNS add-on для k8s
  • Создали Deployment nginx и протестировали port-forwarding, просмотр логов, выполнение команд на подах
  • Выполнили команду kubectl apply -f post-deployment.yml для проверки работоспособности кластера с нашим приложением

HW20 Kubernetes. Запуск кластера и приложения

  • Установили kubectl
  • Установили minikube в wsl по инструкции
  • Ещё два варианта установки minikube на GCP, если у вас Win10 Home и нельзя включить Hyper-V (раз, два)
  • Описали Deplyment'ы для наших сервисов (post, comment, ui, mongodb)
  • Описали Service для взаимодействия подов
  • Создали Namespace DEV
  • Развернули все сначала в minikube, затем в GKE
  • Включение ui на GKE описано тут. Пропустить теперь нельзя, нужно авторизовываться по конфиг файлу kubectl
  • Для корректной проверки ДЗ, необходимо прогнать *.yml файлы через утилиту dos2unix