И как вы можете развернуть контейнерные приложения с легкостью и уверенностью
В настоящее время я изучаю прикладные компьютерные науки в Университете кооперативного государства Карлсруэ в Германии и собираюсь закончить еще один семестр (исключительное издание 2020 года).
В течение последних двух семестров я работал над проектом для нашей лекции по разработке программного обеспечения с несколькими моими друзьями. Проект объединяет многие онлайн -услуги нашего университета в центральный центр, который должен был в финале на прошлой неделе.
Одна из наших конечных целей — развернуть среду, которая будет использоваться в качестве живой демонстрации. Вот как я это сделал и что я могу порекомендовать для начинающих, впервые работая с Трафиком.
Что касается масштаба этой статьи, я также предоставлю некоторые идеи и лучшие практики, которые я накапливал на протяжении всего путешествия.
Почему Трафик?
В прошлом я развернул свои веб -проекты по -разному. От IIS (когда .NET .NET Ядро было даже чем -то), Apache (LOL), чтобы nginx to Трафик Анкет
Я многому научился на этих этапах, но я помню, что потратил больше времени на настройку и исправление своих реверсийных прокси, чем я, вероятно, потратил на улучшение своего кода. Настройка сетей и незнакомых инструментов может стать громоздкой, особенно когда конечные результаты не соответствуют вашим ожиданиям.
Для IIS я помню борьбу с разрешениями на файлы, когда файл обслуживается из локального пути системного пути, отличного от пути документа IIS по умолчанию. Вы не хотите тратить много часов на администрирование и исправление разрешений на файлы (которые в первую очередь не очевидны), это не ваша основная задача как разработчика. Это, но также и сложные модули IIS, которые требовали конкретной конфигурации, являются огромной болью.
Кроме того, давайте не будем говорить о настройке HTTPS для этих инструментов.
Как разработчик программного обеспечения, который преследует разработку чистого кода, вы хотите, чтобы все было как Поцелуй и сухой Как это возможно, без работы с каждой отдельной конфигурацией. Работай умом, а не силой. Используйте инструменты, которые упрощают вашу жизнь.
Эти аспекты значительно изменились с ростом задач, связанных с DevOps, и ростом контейнерных приложений в качестве новой платформы.
Трафик меняет это. Легко подключить ваш обратный прокси для ваших контейнерных приложений с такими функциями, как HTTPS, обновление сертификата SSL, средние войны, балансировка нагрузки и т. Д. В течение нескольких минут.
Откройте для себя Трафик
Traefik-это современный краевой маршрутизатор с открытым исходным кодом, который предназначен для работы с облачными приложениями. Они утверждают, что делают сетевые скучные. Это правда, в хорошем смысле.
Я обнаружил Traefik Version 1.0 в конце 2018 года на работе, в начале обучения, когда мне нужно было развернуть свой рабочий проект в демонстрационных целях. Я не могу точно вспомнить, как я наткнулся на это (я думаю, что это был reddit ), но в том, что я увидел, как я был похож на: мне нужно попробовать это.
С тех пор я использовал его для всех других проектов, от V1 до текущей версии V2.
Как это работает?
Traefik работает с различными поставщиками, такими как Docker, Kubernetes, AWS и многими другими. Вам решать, какой поставщик вы используете. Я выбрал Docker, потому что он легкий по сравнению со многими другими поставщиками, и потому что я также использую его для местного развития.
Он автоматически обнаруживает ваши услуги от выбранного провайдера и соответствует его с вашей конфигурацией. Для всех отдельных услуг вы можете настроить свои конечные точки, балансировку нагрузки, переписывание пути, базовую аудиторию и даже автоматические HTTPS с сертификатами SSL, работающим по Давайте зашифруем Анкет
Больше нечего сказать, потому что вся магия уже происходит для вас автоматически. Итак, давайте возьмем в руки это.
Начиная
Если вы хотите ссылаться на проект с рабочим Docker Compose Files, Проверьте наш университетский проект (WIP).
Подготовьте Traefik
Прежде чем мы сможем запустить Traefik, необходимо, чтобы мы были Docker полностью и работает Анкет Я всегда рекомендую запустить Docker в режиме роя, когда вы находитесь в производстве или постановке. Это облегчает развертывание в кластере (да, Трафик даже работает над Docker Swary через узлы из коробки).
Чтобы инициализировать рой, запустите Docker Swarm Init
и следуйте инструкциям.
После того, как вы находитесь в режиме роя, вы можете начать создавать свой первый файл Docker Compose для Traefik:
version: '3.8' services: traefik: image: traefik:v2.2 ports: - "80:80" - "443:443" command: - --api.insecure=true # set to 'false' on production - --api.dashboard=true # see https://docs.traefik.io/v2.0/operations/dashboard/#secure-mode for how to secure the dashboard - --api.debug=true # enable additional endpoints for debugging and profiling - --log.level=DEBUG # debug while we get it working, for more levels/info see https://docs.traefik.io/observability/logs/ - --providers.docker=true - --providers.docker.swarmMode=true - --providers.docker.exposedbydefault=false - --providers.docker.network=unidash_traefik - --entrypoints.web.address=:80 - --entrypoints.web-secured.address=:443 - --certificatesresolvers.defaultlts.acme.httpChallenge.entrypoint=web - --certificatesresolvers.defaultlts.acme.email=ud@ginomessmer.me - --certificatesresolvers.defaultlts.acme.storage=/letsencrypt/acme.json volumes: - letsencrypt:/letsencrypt - /var/run/docker.sock:/var/run/docker.sock networks: - traefik deploy: placement: constraints: - node.role == manager labels: - "traefik.enable=true" - "traefik.http.services.api.loadbalancer.server.port=8080" - "traefik.http.routers.api.rule=Host(`traefik.dev.unidash.top`)" - "traefik.http.routers.api.entrypoints=web-secured" - "traefik.http.routers.api.tls.certresolver=defaultlts" networks: traefik: driver: overlay volumes: letsencrypt:
Надеюсь, вы знакомы с Docker Compose. Я быстро проберусь через некоторые примечательные записи конфигурации для Traefik:
-API-Dashboard = true
: Включает красивую приборную панель, где вы можете осмотреть свои маршруты, услуги и конфигурацию.-Повидеры.docker.swarmmode
: Traefik запускает в режиме без разряжения хосты Docker Docker по умолчанию, но нам нужно указать, что мы используем Docker Swarm.-Повидеры.docker.ExposedByDefault
: По умолчанию все обнаруженные контейнеры автоматически подвергаются воздействию произвольных конечных точек, но нам нужно подавить это поведение.
В дополнение к этому, мы инструктируем Траефик, что он должен обнаружить только контейнеры, которые присоединялись к назначенной сети Docker, как описано в Providers.docker.network
и Сети Вход в конце файла Compose.
Лучшая практика #1 : Ваша сеть должна быть сетью наложения для экземпляров Docker Swarm. Я потратил впустую так много часов, когда работал с ним в Траефике v1, пока не понял, что, черт возьми, наложенный драйвер является. Не совершайте ту же ошибку. (Чтобы создать сеть наложений вручную, введите: Docker Network Create Proxy -d Overlay
)
В разделе «Объем» мы указываем объем докеров для нашего хранилища Let’s Encrypt (LE), чтобы мы могли сохранить его по разрыву во время разработки.
Лучшая практика #2 : Убедитесь, что вы сохраняете свои сертификаты LE, в противном случае вы столкнетесь с проблемами при развертывании вашего хоста с нуля в пятый раз или около того в течение определенного периода. Управление сертификата имеет предел ставки и не позволит вам продлить сертификат для данного имени DNS. Вы, по сути, обречены тогда, особенно на полном производстве (правдивая история, это произошло с моей средой QA-не пользуясь).
Для развертывания Docker Swarm мы Установите ограничение для контейнера Traefik Потому что мы всегда хотим запустить его на узле Master Docker.
Теперь большинство было настроено, и с этого момента нам нужно только настроить этикетки, которые настраивают Traefik для нашего контейнерного приложения. В файле Compose мы будем направлять наш сетевой трафик на приборную панель Траефика.
Прежде чем мы это сделаем, я хочу объяснить некоторые основные Терминология Трафик Анкет
Маршрутизатор
Маршрутизатор приписывает, как обрабатывается конкретный запрос. Вы обучаете маршрутизатора Как направить запрос на свой пункт назначения (служба) Предоставляя имя хоста, точку входа, средние войны и многое другое. На данный момент просто сосредоточьтесь на имя хоста.
Услуга
Сервис — это приложение, которое обрабатывает входящий трафик. В сферах Docker это ваше контейнерное приложение.
Точка входа
Мы уже настроили две точки входа в наш первый файл Compose. Точка входа определяет порт, который будет получать сетевые пакеты. Вам не нужно беспокоиться об этом после того, как вы настроили экземпляр Traefik, он просто работает.
Итак, теперь с базовой терминологией, конфигурация должна быть в значительной степени семантической и самоэкспланирующей:
labels: - "traefik.enable=true" - "traefik.http.services.api.loadbalancer.server.port=8080" - "traefik.http.routers.api.rule=Host(`traefik.dev.unidash.top`)" - "traefik.http.routers.api.entrypoints=web-secured" - "traefik.http.routers.api.tls.certresolver=defaultlts"
- Поскольку мы говорим Traefik не автоматически раскрыть услуги, нам нужно установить
traefik.enable
к истинному. - В разделе «Сервис» мы сообщаем Трафику, где подключиться к нашему приложению в контейнер. Панель инструментов использует порт 8080.
- В разделе маршрутизаторов мы указываем имя хоста, желаемые точки въезда и разрешение сертификата.
Лучшая практика #3 : Мы также можем использовать сложные правила хоста с хвостовыми путями, но делать это только в том случае, если ваше приложение совместимо с различными основаниями пути, чем /
, в противном случае вы столкнетесь с неочевидными проблемами.
Подготовьте заявку
Теперь, когда Traefik настроен, вам нужно будет составить файл сочинения вашего приложения. Это случай на случай, но я покажу вам, как я сделал это для своего проекта.
Лучшая практика № 4 : Для контейнерного приложения у меня есть два отдельных файла Docker Compose. Первый используется локально и для Удаленные развертывания, второе используется для Конкретная среда переопределяет , как для локального, так и для удаленного развертывания индивидуально.
version: '3.8' services: gateway: image: unidash/gateway build: context: . dockerfile: Unidash.Gateway/Dockerfile auth: image: unidash/auth build: context: . dockerfile: Unidash.Auth.Application/Dockerfile depends_on: - mssql # Trimmed for brevity... mongodb: image: mongo volumes: - mongodb_data:/data/db mssql: image: mcr.microsoft.com/mssql/server:2019-latest volumes: - mssql:/var/opt/mssql rabbitmq: image: rabbitmq:3 volumes: mongodb_data: mssql:
Явным преимуществом этого является то, что я могу использовать это в качестве шаблона для всех сред. Для локальных сборок он будет строить мои изображения с нуля в зависимости от сборка:
свойство. Для развертывания Docker Stack он будет использовать изображение из Docker Hub и просто игнорировать свойство сборки.
Теперь нам нужны конкретные переопределения среды. Это будет наша среда Dev/Prod.
version: '3.8' services: gateway: networks: - traefik - default deploy: labels: - "traefik.enable=true" - "traefik.http.services.gateway.loadbalancer.server.port=80" - "traefik.http.routers.gateway-secured.rule=Host(`tinf18b4.dev.unidash.top`)" - "traefik.http.routers.gateway-secured.entrypoints=web-secured" - "traefik.http.routers.gateway-secured.tls.certresolver=defaultlts" - "traefik.http.middlewares.gateway.headers.accesscontrolallowmethods=OPTIONS,GET,PATCH,PUT,DELETE" - "traefik.http.middlewares.gateway.headers.accesscontrolalloworiginlist=*" - "traefik.http.middlewares.gateway.headers.accesscontrolmaxage=100" - "traefik.http.middlewares.gateway.headers.addvaryheader=true" auth: networks: - default environment: - "ConnectionStrings:AuthDbContext=Server=mssql, 1433;Database=Auth;User=sa;Password=yourStrong!Password123;" timetable: networks: - default environment: - "ConnectionStrings:TimeTableDbContext=Server=mssql, 1433;Database=TimeTable;User=sa;Password=yourStrong!Password123;" - "TimeTable:UpstreamICalUrl=https://rapla.dhbw-karlsruhe.de/rapla?page=ical&user=eisenbiegler&file=TINF18B4" canteen: networks: - default chat: networks: - default mssql: networks: - default environment: - ACCEPT_EULA=Y # This is for **demo purposes** only: don't store your secrets in compose files. # Instead, use Docker secrets or an equivilant secret manager. - SA_PASSWORD=yourStrong!Password123
При разработке микросервисов он рекомендуется использовать централизованный шлюз API. Независимо от того, следует ли вы использовать это или нет, является совершенно другой темой, а не частью этой статьи, но ты могу Об этом подробнее здесь Если вы чувствуете себя предприимчивым.
Как вы, вероятно, можете видеть, я использовал аналогичную конфигурацию, как первый Когда мы настроили Traefik.
Я обучаю Траефу, где найти контейнерное приложение ( Сервис ) и как направиться к нему ( маршрутизатор ). Для дальнейшего прогресса нам нужно добавить новую терминологию в нашу распоряжение.
Средние войны
Промежуточное программное обеспечение расширяет поведение маршрутизаторов. Он может настраивать запросы, прежде чем они будут переданы в службу или обратно к клиенту. Обычно используемые средние войны — это заголовки, пределы скорости, схемы перенаправления и многое другое.
Поскольку наш проект состоит из интерфейса и заднего конца, я добавил промежуточное программное обеспечение в шлюз, который имеет дело с CORS. Записи конфигурации являются самоочевидными, если вы уже знакомы с CORS, но если вам интересно, Проверьте документацию Traefik Анкет
Лучшая практика #5 : Убедитесь, что ваша контейнерная приложение поддерживает Переходные заголовки Анкет Traefik автоматически пересылает заголовки в ваш сервис. Вам также может потребоваться настройка COR на уровне приложения.
Кроме того, не забудьте добавить Трафик
Сеть, которую мы создали в первом файле Compose в стек, в противном случае Traefik не обнаружит службу в соответствии с нашей первоначальной конфигурацией.
Итак, теперь это было довольно много конфигурации. Пусть это погрузится и возьмите чашку кофе, прежде чем мы развертываем нашу стек.
Выпустить Кракена
Развертывание — самая легкая, но самая удовлетворительная часть. Давайте быстро повторим все файлы, которые мы создали перед развертыванием:
- Docker-compose.yml Это файл конфигурации с голой костями, который служит нашим родителем. У него есть все подробности о том, где найти наши изображения Docker.
- Docker-compose.traefik.yml Этот файл составления содержит экземпляр Traefik и конфигурацию в Команды и Ярлыки раздел. Помните, что это первый раз, когда мы настроили Сервис Traefik Анкет
- Docker-compose.dev.yml или Docker-Compose. {env} .yml Этот файл Compose является аддитивным к нашей базе Docker-compose.yml файл. Он содержит конкретную конфигурацию приложения и Траефика.
Теперь давайте скопируем эти файлы на наших основных хостах с помощью нашего любимого инструмента.
Лучшая практика № 6 : Этот тип иерархии в нашей конфигурации также делает его надежным для CI/CD. Предположим, у вас есть конвейер выпуска, который развертывает для Prod или Dev. Вы можете бросить базовые файлы, а затем добавить файл для конкретной среды (третий в списке) в качестве аддитивного перезаписи. Это держит его настолько организованным и подлежащим обслуживанию для будущих изменений.
Как только они встают на наш сервер, нам просто нужно запустить:
docker stack deploy-c docker-compose.yml -c docker-compose.traefik.yml -c docker-compose.dev.yml
… И вуаля, наше приложение теперь работает и полностью загружено с SSL.
Чтобы проверить это, вы можете попробовать получить доступ к приборной панели Traefik и конечной точке вашего приложения. Чтобы получить доступ к приборной панели, посмотрите на свой файл COMPOSE, а затем скопируйте имя хоста, добавьте /панель приборов
В конце и бум, вы сейчас на приборной панели.
Я надеюсь, что вам понравилась эта статья и найдете эту полезную. Прокомментируйте, если у вас есть обратная связь или вопрос, я был бы рад ответить на них.
Кроме того, пожалуйста, не стесняйтесь следить за мной dev.to и Twitter , или если вы чувствуете себя очень щедрым, купить мне кофе Анкет
Спасибо за чтение, и, как всегда, в настоящее время оставайтесь в безопасности.
Спасибо Райан Для кофе!
Герой фото Бренданская церковь на Unsplash.
Оригинал: «https://dev.to/ginomessmer/here-s-how-i-deployed-my-university-project-with-traefik-ec0»