- Развернут Prometheus в kubernetes
- Настроен Prometheus и Grafana для сбора метрик
- Настроен EFK для сбора логов
- Написаны Helm Chart для приложения
- Развернут Gitlab в Kubernetes
- Запущены CI/CD конвейеры в Kubernetes
- Рассмотрена работа сервисов:
- ClusetrIP
- NodePort
- LoadBalancer
- Рассмотрена работа плагинов:
- kube-dns
- Ingress Controller (балансировщик L4 или L7, TLS терминация)
- Рассмотрены сетевые политики
- Рассмотрено хранилище для базы в виде:
- классический том kubernetes emptyDir
- внешний том GCP
- PersistentVolume
- PersistentVolume из разных StorageClass (PersistentVolumeClaim)
- Описан создаваемый объект Secret в виде Kubernetes-манифеста ui-secret.yml.
В качестве tls.crt и tls.key были взяты выводы команд:
$ cat tls.crt | base64 $ cat tls.key | base64
- Развернуто локальное окружение kubernates с помощью minikube
- Развернут kubernates в GKE
- Запущен reddit в Kubernates
- Созданы манифесты нашего приложения (4 сервиса) в контексте kubernetes
- Установлен kubernates "с нуля" Kubernetes The Hard Way
- Установлен стек EFK
- Для сервисов ui и post настроено логгирование во fluentd
- Написан фильтр для парсинга неструктурированных логов
- Установлен zipkin для распределенного трейсинга, проблема с тормозами не решена
- Настроен сониторинг контейнеров с помощью cAdvisor
- Для визуализации метрик установлена Grafana
- Созданы панели отображения метрик
- Установлен Alertmanager и создано правило оповещения о недоступности сервисов, оповещения приходят в Slack (dmitry_chirkov)
Ссылка на собранные docker-образы: https://hub.docker.com/u/daryan
- Добавлены новые сервисы в Makefile
- Добавлен мониторинг встроенными средствами Docker:
Панель отображения: monitoring/grafana/dashboards/Docker_daemon_container_states_containers.json
$ docker-machine scp /monitoring/docker-native/daemon.json docker-host:/tmp $ docker-machine ssh docker-host sudo cp /tmp/daemon.json /etc/docker/ $ docker-machine ssh docker-host sudo systemctl restart docker
- Изучен интерфейс prometheus
- Сконфигурирован мониторинг сервисов ui, comment и prometheus, для этого выделена отдельная сеть и алиасы.
- Создан docker-compose.yml для запуска приложения reddit и prometheus
- Проверена корректность мониторинга с помощью остановки/запуска каждого микросервиса
- Установен node exporter для мониторинга метрик хоста
Ссылка на собранные docker-образы: https://hub.docker.com/u/daryan
Экспортер взят от компании Percona mongodb_exporter Сборка образа реализована посредством Makefile (см. ниже)
$ cd docker
$ make build_mongodb_exporter
$ make push_mongodb_exporter
Экспортер взят с докерхаба prom/blackbox-exporter:master. Сервис ui мониторится модулем http_2xx. Сервисы comment и ui мониторятся модулем icmp.
Написан docker/Makefile. Запуск сборки:
$ cd docker
$ make build_${SERVICE}
$ make build_all
Запуск выгрузки образов в репозиторий:
$ cd docker
$ make push_${SERVICE}
$ make push_all
- Установлен GitLab в Google Cloud (см. ниже)
- Настроен GitLab
- Подключен новый удаленный GitLab-репозиторий
- Создан CI/CD Pipeline (описан .gitlab-ci.yml)
- Установлен и запущен Runner
- Проведены эксперименты с pipeline
Установка инстанса для GitLab:
$ gcloud compute addresses create gitlab-ci --region europe-west1
$ 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-address gitlab-ci --google-tags http-server,https-server --google-zone europe-west1-b gitlab-ci
$ eval $(docker-machine env gitlab-ci)
Установка GitLab:
$ cd gitlab-ci && docker-compose up -d
Регистрация runners для сборки образа в Docker:
$ gitlab-runner register --non-interactive --url "http://35.210.200.83/" --registration-token "Bx65sXMhdpFwsZt9kqMy" --executor "docker+machine" --docker-image alpine:latest --docker-volumes /var/run/docker.sock:/var/run/docker.sock --description "autoscaling-runners" --tag-list "docker,linux,ubuntu,xenial" --run-untagged="true" --locked="false"
Разворачивание reddit выполнено в виде монолитного приложения (все в одном контейнере). В GitLab CI/CD установлены переменные (protected):
CI_REGISTRY_PASSWORD
CI_REGISTRY_USER
SSH_PRIVATE_KEY
- Устанавливаем целевой хост и все зависимости, где будет размещаться приложение reddit:
$ cd gitlab-ci
$ terraform init terraform/
$ terraform apply -var-file=terraform/terraform.tfvars terraform/
$ ansible-playbook playbooks/reddit_req.yml
- Делаем коммит в созданный GitLab SCM, запускается pipeline со сборкой, тестами и выкаткой в целевой хост reddit.
Лучший способ масштабирования Runners - это создание новых по-требованию (Runners autoscale) Из-за ограничения времени не все шаги автоматизированы:
- Создан новый инстанс gitlab-runner, который для GitLab будет выступать как бастион, т.е. он будет управлять запуском новых и удалением неактивных Runner:
$ cd gitlab-ci
$ terraform init terraform-runner/
$ terraform apply -var-file=terraform-runner/terraform.tfvars terraform-runner/
- На него установлены GitLab Runner, Google Cloud SDK и Docker с docker-machine:
$ ansible-playbook playbooks/deploy_runner.yml
- В созданном инстансе авторизован в Google и зарегистировн Runner:
gitlab-runners$ gcloud init --console-only
gitlab-runners$ gcloud auth application-default login
gitlab-runners$ gitlab-runner register --non-interactive --url "http://${gitlab_ci_ip}/" --registration-token "${gitlab_installation_token}" --executor "docker+machine" --docker-image alpine:latest --description "autoscaling-runners" --tag-list "docker,linux,ubuntu,xenial" --run-untagged="true" --locked="false"
- Отредактирован файл конфигурации /etc/gitlab-runner/config.toml (шаблон находится в gitlab-ci/template/config.toml.j2). Добавлены/изменены опции:
concurrent = 10
...
[runners.machine]
IdleCount = 1
IdleTime = 300
MachineDriver = "google"
MachineName = "autoscale-%s"
MachineOptions = [
"google-project={{ google_project }}",
"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",
"google-use-internal-ip=true"
]
- Перезапущен сервис gitlab-runner:
$ systemctl restart gitlab-runner.service
В итоге при запуске stage с 3 job получаем 3 инстанса (и 1 в ожидании):
- Настроена интеграция Gitlab со Slack dmitry_chirkov
- Проведены эксперименты с разными типами сетей в Docker
- Сделан микросервис с двумя сетями
- Собраны образы и запущены контейнеры с помощью docker-compose
- Параметризированы порт сервиса, версии и путь к БД
Изменить проект можно двумя путями:
-
Задать переменную окружения COMPOSE_PROJECT_NAME
Например:
$ export COMPOSE_PROJECT_NAME=reddit
-
С запуском docker-compose с опцией -p
Например:
$ docker-compose -p reddit up -d
Изменять код приложения без пересборки образа можно монтированием хостовой директории к контейнеру. Для этого скопируем git-репозиторий на хостовую машину:
docker-host$ git clone -b docker-4 https://github.com/otus-devops-2019-02/dchirkov_microservices.git
В файле docker-compose.override.yml для каждого сервиса укажем:
ui:
volumes:
- /home/docker-user/dchirkov_microservices/src/ui:/app
post:
volumes:
- /home/docker-user/dchirkov_microservices/src/post-py:/app
comment:
volumes:
- /home/docker-user/dchirkov_microservices/src/comment:/app
Для переопределения запускаемой команды в контейнере ui нужно в docker-compose.override.yml указать:
ui:
command: puma --debug -w 2
- Описаны 3 Dockerfile для трёх микросервисов: post, ui и comment
- Создана сеть reddit типа bridge
- Образ ui оптимизирован
- К микросервису mongo подключен том reddit_db
$ docker run -d --network=reddit --network-alias=post_db --network-alias=comment_db -v reddit_db:/data/db mongo:latest
- Запущены контейнеры с другими сетевыми алиасами. Окружение в контейнере переопределено опцией "-e":
$ docker run -d --network=reddit --network-alias=new_post_db --network-alias=new_comment_db mongo:latest
$ docker run -d --network=reddit --network-alias=new_post -e POST_DATABASE_HOST=new_post_db daryan/post:1.0
$ docker run -d --network=reddit --network-alias=new_comment -e COMMENT_DATABASE_HOST=new_comment_db daryan/comment:1.0
$ docker run -d --network=reddit -p 9292:9292 -e POST_SERVICE_HOST=new_post -e COMMENT_SERVICE_HOST=new_comment daryan/ui:1.0
- Все микросервисы пересобраны на основе адаптированных дистрибутивов alpine
Сделано:
- Создан новый проект docker
- Создан docker-host в gcloud
- Создан Dockerfile для построения образа нашего приложения
- Полученный образ залит на Docker Hub
Команды
docker run --rm -ti tehbilly/htop
docker run --rm --pid host -ti tehbilly/htop
показывают разную видимость PID
- с помощью Terraform создаётся нужное количество инстансов, указанное в terraform.tfvars
$ cd docker-monolith/infra
$ terraform apply -var-file=terraform/terraform.tfvars terraform/
- с помощью плейбуков Ansible и использованием динамического инвентори устанавливается докер и наше приложение
$ ansible-playbook playbooks/reddit.yml
- описан шаблон пакера, который делает образ с уже установленным Docker и нашим приложением
$ packer build -var-file=packer/variables.json packer/reddit.json
Сделано:
- Установлен Docker
- Описано отличие образа от контейнера