Під капотом AWS Elastic Beanstalk. Частина 2

Це продовження попереднього посту: Під капотом Elastic Beanstalk Частина 1. У цьому пості ми розглянемо налаштування nginx для docker контейнера.

EB Docker на Upstart

По-перше, docker контейнер завжди підтримується в роботі через конфігурацію upstart /etc/init/eb-docker.conf. Якщо ви зупините процес, він автоматично знову запуститься.

# docker ps  
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES  
163ebbeedede aws_beanstalk/current-app:latest "/bin/sh -c docker/b 19 hours ago Up 19 hours 3000/tcp hopeful_brattain  
# docker stop 163ebbeedede  
163ebbeedede  
# docker ps  
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES  
163ebbeedede aws_beanstalk/current-app:latest "/bin/sh -c docker/b 19 hours ago Up 1 seconds 3000/tcp hopeful_brattain  
#

Якщо ви хочете дійсно зупинити його, потрібно зробити це через upstart: stop eb-docker.

# docker ps  
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES  
163ebbeedede aws_beanstalk/current-app:latest "/bin/sh -c docker/b 19 hours ago Up 34 seconds 3000/tcp hopeful_brattain  
# stop eb-docker  
eb-docker stop/waiting  
# docker ps  
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES  
# start eb-docker  
eb-docker start/running, process 11090  
# docker ps  
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES  
163ebbeedede aws_beanstalk/current-app:latest "/bin/sh -c docker/b 19 hours ago Up 1 seconds 3000/tcp hopeful_brattain  
#

Nginx проксить до Docker контейнера

Як ви можете побачити, контейнер, що працює, слухає порт 3000 у цьому випадку. Контейнер відкриває порт, який налаштований у вашому Dockerfile або в файлі Dockerrun.aws.json згідно з документацією AWS. Скрипт з логікою, що вибирає порт для відкриття, фактично розташований за адресою /opt/elasticbeanstalk/hooks/appdeploy/enact/00run.sh. EB налаштовує nginx так, щоб він проксировав порт 80 на цей відкритий порт контейнера за допомогою цього конфігураційного файлу: /etc/nginx/conf.d/elasticbeanstalk-nginx-docker-upstream.conf

Ми можемо безпосередньо перевірити порт docker.

# curl -s -v -o /dev/null 172.17.0.9:3000 2>&1 | grep '< HTTP'  
< HTTP/1.1 200 OK  
#

Ми також можемо перевірити порт nginx 80, щоб переконатися, що проксі працює належним чином — від nginx до контейнера.

# curl -s -v -o /dev/null localhost:80 2>&1 | grep '< HTTP'  
< HTTP/1.1 200 OK  
#

Налаштування одночасної роботи сервера Docker контейнера

Налаштування nginx для проксирування до іншого веб-сервера є досить типовим. Unicorn і Puma зазвичай використовуються і налаштовуються таким чином, щоб мати кілька процесів або потоків для обробки одночасних запитів. У випадку з EB, nginx проксирує запити до сервера безпосередньо всередині docker контейнера. Знаючи це, важливо для масштабування, щоб сервер контейнера був налаштований для коректної обробки одночасних запитів. Вам потрібно налаштувати контейнер так, щоб він мав правильну кількість робочих процесів або потоків, щоб ефективно використовувати RAM і CPU на інстансі. EB зазвичай використовує лише один docker контейнер на кожному AWS інстансі. Тому критично важливо налаштувати сервер цього docker контейнера на виконання більше ніж одного процесу чи потоку, інакше ви ймовірно марно витрачатимете ресурси, а ще гірше — не зможете масштабувати.

Кожен додаток має свої особливості щодо споживання CPU і використання RAM, тому вам потрібно буде експериментувати. Ось прості приклади для unicorn та puma.

ELB

Наостанок, EB налаштовує ELB, щоб трафік рівномірно розподілявся на порт 80 на кожному інстансі в середовищі.
Отже, загальний маршрут виглядає так: клієнт -> ELB -> nginx -> docker.

Перевірте ELB кінцеву точку, щоб переконатися, що все працює від ELB до nginx, а потім до docker.

$ curl -s -v -o /dev/null "http://your-custom-endpoint.elasticbeanstalk.com" 2>&1 | grep '< HTTP'  
< HTTP/1.1 200 OK  
$

Дякую, що прочитали до кінця. Якщо цей пост був для вас корисний, буду дуже вдячний, якщо ви порекомендуєте його (натиснувши на кнопку "плескати"), щоб інші могли знайти його теж! Також підключайтеся до мене на LinkedIn.

pic

P.S. Не забувайте підписатися на розсилку BoltOps, щоб отримувати безкоштовні поради та оновлення з DevOps.

Можливо, вам також буде цікаво:

Перекладено з: Under the Hood of AWS Elastic Beanstalk Part 2

Leave a Reply

Your email address will not be published. Required fields are marked *