Это небольшая компиляция с комментариями, достаточно любопытного для технических специалистов, ролика выступления инженеров NCSoft https://www.youtube.com/watch?v=o-KJNWyHmQE

TL;DL NCSoft внедряют контейнеризацию на основе Kubernetes для части игровых сервисов.

Во вступлении к сожалению мало деталей.

«Наша инфраструктура в основном построена на физических серверах и виртуальных машинах. Всё это было оптимизировано годами, включая настройку сетей и серверов под наши игры. Мы даже знаем недельные, суточные и почасовые паттерны трафика — система была стабильна».

Дальше есть интересная деталь про разницу поддержки привычных для NC ПК игр и мобильных:

«Несколько лет назад перед нами встала новая задача: поддержка мобильных игр. Их рынок стремительно растёт, и NCSoft начала развивать мобильное направление. Но они сильно отличаются от ПК-игр:

  • Жизненный цикл короче

  • Игровая нагрузка более динамична

  • Частые релизы и обновления

  • Нужно быстро масштабироваться»

Для решения такого ряда задач он разделяют нагрузку на два типа: динамичная и статичная.
«Статичную нагрузку мы размещаем в частном облаке (OpenStack) — так дешевле в долгосрочной перспективе. Динамичную нагрузку — в публичных облаках (AWS, GCP).»

Причины, по которым перешли на Kubernetes:

«Универсальное управление сервисами на разных инфраструктурах. Простой и гибкий способ описания сервисов. Kubernetes + OpenStack = идеальная комбинация (OpenStack управляет железом, Kubernetes — сервисами).»

Инженер рассказывает, что одной из проблем при внедрении была потеря производительности. Поскольку Kubernetes подами становятся виртуальные машины, они могут терять производительность из-за «шумных соседей».

Планировщик Kubernetes этого не учитывает. И для решения пришлось настроить авто-масштабирование нод через OpenStack API или закрепить физические ядра за каждой виртуалкой.

По сетевому стеку используют следующее:

  • Пробовали Flannel + VXLAN — но bandwidth был слабый

  • Перешли на Host Gateway mode — и всё заработало лучше

  • Также улучшили производительность VXLAN, изменив MTU (как именно без деталей)

Про миграцию сервисов

У NC 16 сервисов (тут не очень понятно каких) работающих под Linux. Пытались адаптировать их с разработчиками для Kubernetes: настройка билдов, деплой, логика масштабирования и т.д.

Старые виртуальные машины не отключали — они продолжали работать параллельно с Kubernetes-нодами. Затем постепенно выводили из эксплуатации, убедившись в стабильности работы нод.

По словам инженера NCSoft в результате потребление ресурсов снизилось — не из-за технологии, а из-за смены подхода: раньше каждый сервис запрашивал свои виртуалки. Теперь — просто поды. Нет избыточных запросов, масштабирование стало проще.

Так же в видео пара слов о логировании и мониторинге.

  • Используют Fluentd, размещая агент в каждом поде. Это позволяет настраивать индивидуальный парсинг логов.

  • Логи читаются из общего volume (emptyDir), доступного всем контейнерам в поде

  • Отправляем их в Elasticsearch

  • Zabbix для мониторинга железа

  • Prometheus + Grafana для мониторинга Kubernetes и общих дашбордов

Немного деталей про собственные «костыли».

«Из-за сложности гибридной архитектуры мы строим свою систему для управления всей инфраструктурой:

1. API и UI для управления IaaS

2. Поддержка Kubernetes-кластеров

3. Возможность развёртывания приложений и контейнеров»

В ответах на вопросы выяснилось ещё немного информации:

Используют дистрибутив на базе Ubuntu

Нагрузка. ~30 сервисов на 13 нодах, загрузка невысокая — основные игровые сервера ещё не перенесены

Почему не Fluentd как DaemonSet, а в каждом поде? Потому что у каждого сервиса свои логи, и им нужны свои парсеры.

Почему не используете Magnum? Нужно независимое решение, т.к. используют разные инфраструктуры.