Skip to content

otus-devops-2019-02/chudinanton_microservices

Repository files navigation

chudinanton_microservices

chudinanton microservices repository

ДЗ№20

В процессе сделано:

  • Основное задание.

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

ДЗ№19

В процессе сделано:

  • Основное задание.
  • Дополнительное задание (кроме поиска проблемы в приложении со сломанным кодом). Нет времени.

ДЗ№18

В процессе сделано:

  • Основное задание.

Ссылка на докер хаб: https://hub.docker.com/u/chudinanton

ДЗ№17

В процессе сделано:

  • Основное задание по развертыванию prometheus и мониторингу сервисов.

Ссылка на докер хаб: https://hub.docker.com/u/chudinanton

ДЗ№16

В процессе сделано:

  • Gitlab поднят через terraform. Сделано два модуля, установка выполняется через провиженеры.
  • Выполнено основное задание по построению pipiline'ов.

ДЗ№15

В процессе сделано:

  • Выполнил: 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.
  • Задано базовое имя проекта. Двумя способами:
  1. Через переменную в env файле - COMPOSE_PROJECT_NAME=project_name
  2. Через командную строку с ключем -p: docker-compose -p project_name up -d

ДЗ№14

В процессе сделано:

  • Скачан и распакован архив. Каталог переименован в 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 мы поговорим
на следующем занятии)
Запустили наши контейнеры в этой сети
Добавили сетевые алиасы контейнерам
Сетевые алиасы могут быть использованы для сетевых
соединений, как доменные имена

ДЗ№13

В процессе сделано:

  • Связал утилиту управления 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

ДЗ№12

В процессе сделано:

  • Освоены базовые команды работы с Docker
  • Настроена интеграция с Travis + чат слак
  • Доп. задание: описано основное отличие контейнера от образа.

About

chudinanton microservices repository

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published