chudinanton microservices repository
- Основное задание.
kubectl get componentstatuses
NAME STATUS MESSAGE ERROR scheduler Healthy ok controller-manager Healthy ok etcd-0 Healthy {"health":"true"} etcd-1 Healthy {"health":"true"} etcd-2 Healthy {"health":"true"}
kubectl get nodes
NAME STATUS ROLES AGE VERSION worker-0 Ready 2m30s v1.12.0 worker-1 Ready 2m28s v1.12.0 worker-2 Ready 2m26s v1.12.0
gcloud compute routes list --filter "network: kubernetes-the-hard-way"
NAME NETWORK DEST_RANGE NEXT_HOP PRIORITY default-route-755c5853d829ed5f kubernetes-the-hard-way 10.240.0.0/24 kubernetes-the-hard-way 1000 default-route-cbcabdec387b9ee4 kubernetes-the-hard-way 0.0.0.0/0 default-internet-gateway 1000 kubernetes-route-10-200-0-0-24 kubernetes-the-hard-way 10.200.0.0/24 10.240.0.20 1000 kubernetes-route-10-200-1-0-24 kubernetes-the-hard-way 10.200.1.0/24 10.240.0.21 1000 kubernetes-route-10-200-2-0-24 kubernetes-the-hard-way 10.200.2.0/24 10.240.0.22 1000
~/chudinanton_microservices/kubernetes# kubectl apply -f reddit
deployment.apps/comment-deployment created deployment.apps/mongo-deployment created deployment.apps/post-deployment created deployment.apps/ui-deployment created
~/chudinanton_microservices/kubernetes# kubectl get pods
NAME READY STATUS RESTARTS AGE busybox-bd8fb7cbd-dgclc 1/1 Running 0 9m57s comment-deployment-598ffc46f8-f6ltj 1/1 Running 0 62s mongo-deployment-6895dffdf4-nxvnf 1/1 Running 0 61s post-deployment-789df69956-z6fkm 1/1 Running 0 61s ui-deployment-f7fb7d64-rnkd8 1/1 Running 0 61s
- Основное задание.
- Дополнительное задание (кроме поиска проблемы в приложении со сломанным кодом). Нет времени.
- Основное задание.
Ссылка на докер хаб: https://hub.docker.com/u/chudinanton
- Основное задание по развертыванию prometheus и мониторингу сервисов.
Ссылка на докер хаб: https://hub.docker.com/u/chudinanton
- Gitlab поднят через terraform. Сделано два модуля, установка выполняется через провиженеры.
- Выполнено основное задание по построению pipiline'ов.
- Выполнил: docker run -ti --rm --network none joffotron/docker-net-tools -c ifconfig
lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
- Выполнил: docker-machine ssh docker-host ifconfig
docker0 Link encap:Ethernet HWaddr 02:42:bf:be:5d:1e inet addr:172.17.0.1 Bcast:172.17.255.255 Mask:255.255.0.0 UP BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) ens4 Link encap:Ethernet HWaddr 42:01:0a:84:00:03 inet addr:10.132.0.3 Bcast:10.132.0.3 Mask:255.255.255.255 inet6 addr: fe80::4001:aff:fe84:3/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1460 Metric:1 RX packets:4157 errors:0 dropped:0 overruns:0 frame:0 TX packets:3283 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:72983681 (72.9 MB) TX bytes:358736 (358.7 KB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
- Выполнил docker run --network host -d nginx
Запускается только 1 контейнер ввиду того что порт занят.
Остановить все контейнеры: docker kill $(docker ps -q)
Для инфо:
На docker-host машине выполните команду: > sudo ln -s /var/run/docker/netns /var/run/netns Теперь вы можете просматривать существующие в данный момент net-namespaces с помощью команды: > sudo ip netns Задание: Повторите запуски контейнеров с использованием драйверов none и host и посмотрите, как меняется список namespace-ов. Примечание: ip netns exec - позволит выполнять команды в выбранном namespace
- Выполнил запуск контейнеров из ранее созданных образов загруженных на докерхаб.
#Сначала создали сеть. docker network create reddit --driver bridge #Далее все как обычно docker run -d --network=reddit mongo:latest docker run -d --network=reddit chudinanton/post:1.0 docker run -d --network=reddit chudinanton/comment:1.0 docker run -d --network=reddit -p 9292:9292 chudinanton/ui:1.0
Проблема:
На самом деле, наши сервисы ссылаются друг на друга по dnsименам, прописанным в ENV-переменных (см Dockerfile). В текущей инсталляции встроенный DNS docker не знает ничего об этих именах. Решением проблемы будет присвоение контейнерам имен или сетевых алиасов при старте: --name (можно задать только 1 имя) --network-alias (можно задать множество алиасов)
- Делаем
docker run -d --network=reddit --network-alias=post_db --network-alias=comment_db mongo:latest docker run -d --network=reddit --network-alias=post chudinanton/post:1.0 docker run -d --network=reddit --network-alias=comment chudinanton/comment:1.0 docker run -d --network=reddit -p 9292:9292 chudinanton/ui:1.0 Проверяем: http://35.195.15.180:9292/ После успешного теста прибиваем контейнеры: docker kill $(docker ps -q)
- Тестирование двух bridge сетей. Инфо:
Давайте запустим наш проект в 2-х bridge сетях. Так , чтобы сервис ui не имел доступа к базе данных в соответствии со схемой ниже. Commenrt и post контейнеры находятся в двух сетях сразу.
- Создаем докер сети:
docker network create back_net --subnet=10.0.2.0/24 docker network create front_net --subnet=10.0.1.0/24
- Запускаем контейнеры:
docker run -d --network=front_net -p 9292:9292 --name ui chudinanton/ui:1.0 docker run -d --network=back_net --name comment chudinanton/comment:1.0 docker run -d --network=back_net --name post chudinanton/post:1.0 docker run -d --network=back_net --name mongo_db --network-alias=post_db --network-alias=comment_db mongo:latest
При проверке сервиса появляется ошибка ввиду:
Docker при инициализации контейнера может подключить к нему только 1 сеть. При этом контейнеры из соседних сетей не будут доступны как в DNS, так и для взаимодействия по сети. Поэтому нужно поместить контейнеры post и comment в обе сети. Дополнительные сети подключаются командой: docker network connect "network" "container"
- Подключим контейнеры ко второй сети
docker network connect front_net post docker network connect front_net comment Проверяем: http://35.195.15.180:9292/ все ок
- Просмотр бриджей на докер ноде
Входим на докер машину: docker-machine ssh docker-host Ставим нужную утилиту: sudo apt-get update && sudo apt-get install bridge-utils Смотрим сети: docker network ls Смотрим бриджи: ifconfig | grep br Выберите любой из bridge-интерфейсов и выполните команду. Ниже пример вывода: brctl show Отображаемые veth-интерфейсы - это те части виртуальных пар интерфейсов (2 на схеме), которые лежат в сетевом пространстве хоста и также отображаются в ifconfig. Вторые их части лежат внутри контейнеров
- docker-compose
Остановим контейнеры, запущенные на предыдущих шагах docker kill $(docker ps -q) Выполнил: export USERNAME=chudinanton docker-compose up -d docker-compose ps Проверил работу сервиса, все ок.
- Изменен docker-compose под кейс с множеством сетей, сетевых алиасов (стр 18).
- Параметризован порт публикации сервиса ui и версии сервисов
- Параметризованные параметры записаны в отдельный файл c расширением .env он внесен в игнор и создан example.
- Задано базовое имя проекта. Двумя способами:
- Через переменную в env файле - COMPOSE_PROJECT_NAME=project_name
- Через командную строку с ключем -p: docker-compose -p project_name up -d
- Скачан и распакован архив. Каталог переименован в src.
- Скачаны Dockerfil'ы.
- Выполнены:
docker pull mongo:latest docker build -t chudinanton/post:1.0 ./post-py docker build -t chudinanton/comment:1.0 ./comment docker build -t chudinanton/ui:1.0 ./ui
В первом случае добавлены:
apk update && apk add --no-cache musl-dev gcc && \ pip install --upgrade pip && \
Во втором и третьем:
sed -i '/deb http:\/\/deb.debian.org\/debian jessie-updates main/d' /etc/apt/sources.list \ &&
- Создал спец сеть и запустил контейнеры:
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 chudinanton/post:1.0 docker run -d --network=reddit --network-alias=comment chudinanton/comment:1.0 docker run -d --network=reddit -p 9292:9292 chudinanton/ui:1.0
ui взлетел на с первого раза т.к. порт был занят. Остановил старый конейнер и запустил еще раз новый.
- Проверил работоспособность (создал ссылку).
Для инфо: Что мы сделали? Создали bridge-сеть для контейнеров, так как сетевые алиасы не работают в сети по умолчанию (о сетях в Docker мы поговорим на следующем занятии) Запустили наши контейнеры в этой сети Добавили сетевые алиасы контейнерам Сетевые алиасы могут быть использованы для сетевых соединений, как доменные имена
- Связал утилиту управления gcloud с проектом в облаке.
- Создал докер машину в облаке.
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
Переключение на эту машину:
eval $(docker-machine env docker-host)
- Повторение практики из демо на лекции.
Изоляция (процессы хостовой системы будут не видны): docker run --rm -it tehbilly/htop Чтобы были видны процессы из контейнера (например для мониторинга): docker run --rm -it --pid host tehbilly/htop Docker-in-Docker (воспользовался готовым образом): docker run --privileged --rm -it jpetazzo/dind docker inspect id контейенера - просмотреть подробное инфо о конейнере
- Создал докер образ:
docker build -t reddit:latest . Точка в конце обязательна, она указывает на путь до Docker-контекста Флаг -t задает тег для собранного образа
- Запустил созданный контейнер
docker run --name reddit -d --network=host reddit:latest
- Создал правило:
gcloud compute firewall-rules create reddit-app \ --allow tcp:9292 \ --target-tags=docker-machine \ --description="Allow PUMA connections" \ --direction=INGRESS
- Зарегистрировал учетку в докер хаб и загрузил туда образ.
docker login docker tag reddit:latest chudinanton/otus-reddit:1.0 docker push chudinanton/otus-reddit:1.0 Проверка: eval $(docker-machine env --unset) docker run --name reddit -d -p 9292:9292 chudinanton/otus-reddit:1.0 http://localhost:9292/ - тест пройден.
Изучить логи контейнера:
docker logs reddit -f
Зайти в выполняемый контейнер, посмотреть список процессов, вызвать остановку контейнера:
docker exec -it reddit bash • ps aux • killall5 1
Запустить его повторно:
docker start reddit
Остановить и удалить:
docker stop reddit && docker rm reddit
Запустить контейнер без запуска приложения и посмотреть процессы:
docker run --name reddit --rm -it chudinanton/otus-reddit:1.0 bash ps aux exit
C помощью следующих команд можно посмотреть подробную информацию о образе
docker inspect chudinanton/otus-reddit:1.0
Вывести только определенный фрагмент информации:
docker inspect chudinanton/otus-reddit:1.0 -f '{{.ContainerConfig.Cmd}}'
Запустить приложение и добавить/удалить папки и посмотреть дифф:
docker run --name reddit -d -p 9292:9292 chudinanton/otus-reddit:1.0 docker exec -it reddit bash • mkdir /test1234 • touch /test1234/testfile • rmdir /opt • exit docker diff reddit docker stop reddit && docker rm reddit
Проверить что после остановки и удаления контейнера никаких изменений не останется:
docker run --name reddit --rm -it chudinanton/otus-reddit:1.0 bash
- Освоены базовые команды работы с Docker
- Настроена интеграция с Travis + чат слак
- Доп. задание: описано основное отличие контейнера от образа.