CodeFest 2018. Игорь Яцевич (2ГИС) — PHP приложение в Kubernetes

CodeFest 2018. Игорь Яцевич (2ГИС) — PHP приложение в Kubernetes

Посмотрите выступление Игоря: https://2018.codefest.ru/lecture/1260/

В наше время облачная инфраструктура перестала быть чем-то экзотическим и используется всё чаще вне зависимости от уровня проекта. Тем не менее, имея рабочую версию приложения в привычной среде, не всегда понятно, стоит ли браться за «переезд» ради всех благ новых облачных технологий. Я поделюсь опытом переноса PHP приложений 2ГИС в Kubernetes и расскажу: - Почему мы перешли с инфраструктуры в виде OpenStack/Ansible на Kubernetes. - Как у нас получилось сделать максимально близкими окружения dev, stage и production. - Об особенностях конфигурации Kubernetes-манифеста для PHP приложения. - Как мы проверяем работоспособность решения в Kubernetes. - С какими проблемами при переносе мы столкнулись и как их решали.

16b6c87229eaf58768d25ed7b2bbbf52?s=128

CodeFest

April 05, 2018
Tweet

Transcript

  1. PHP приложение в Kubernetes Игорь Яцевич, 2ГИС

  2. None
  3. None
  4. Обо мне

  5. Обо мне — 10 лет в разработке бекендов

  6. Обо мне — 10 лет в разработке бекендов — 4

    года в 2ГИС
  7. Обо мне — 10 лет в разработке бекендов — 4

    года в 2ГИС — 2 года в роли тимлида
  8. Зачем?

  9. None
  10. Как было

  11. Как было — Nginx

  12. Как было — Nginx — PHP-FPM

  13. Как было — Nginx — PHP-FPM — Cron

  14. Как было — Nginx — PHP-FPM — Cron — Beaver

  15. Как было — Nginx — PHP-FPM — Cron — Beaver

    — Supervisord
  16. Как было — Nginx — PHP-FPM — Cron — Beaver

    — Supervisord — Redis
  17. Как было — Nginx — PHP-FPM — Cron — Beaver

    — Supervisord — Redis — SSH
  18. Что не так?

  19. Что не так? — Унификация эксплуатации

  20. Что не так? — Унификация эксплуатации — Отказоустойчивость

  21. Что не так? — Унификация эксплуатации — Отказоустойчивость — Не

    заметные для пользователей релизы
  22. Что не так? — Унификация эксплуатации — Отказоустойчивость — Не

    заметные для пользователей релизы — Простая возможность отката релиза
  23. Что не так? — Унификация эксплуатации — Отказоустойчивость — Не

    заметные для пользователей релизы — Простая возможность отката релиза — Медленная скорость деплоя
  24. Что не так? — Унификация эксплуатации — Отказоустойчивость — Не

    заметные для пользователей релизы — Простая возможность отката релиза — Медленная скорость деплоя — Потребность в автоматизации деплоя
  25. Что не так? — Унификация эксплуатации — Отказоустойчивость — Не

    заметные для пользователей релизы — Простая возможность отката релиза — Медленная скорость деплоя — Потребность в автоматизации деплоя — Сложность автоматизации автотестов
  26. None
  27. Архитектура

  28. Web application

  29. Может как было, только в 1 контейнер?

  30. Как было — Nginx — PHP-FPM — Cron — Beaver

    — Supervisord — Redis — SSH
  31. Почему это плохо?

  32. Почему это плохо? — не docker way

  33. Почему это плохо? — не docker way — тяжело эксплуатировать

  34. Почему это плохо? — не docker way — тяжело эксплуатировать

    — проблемы масштабируемости останутся
  35. Web application pod

  36. Проверяем полной нагрузкой

  37. Проверяем полной нагрузкой — зеркалируем весь трафик с боя

  38. Проверяем полной нагрузкой — зеркалируем весь трафик с боя —

    следим за потреблением ресурсов
  39. Проверяем полной нагрузкой — зеркалируем весь трафик с боя —

    следим за потреблением ресурсов — следим за логом ошибок
  40. Проверяем полной нагрузкой — зеркалируем весь трафик с боя —

    следим за потреблением ресурсов — следим за логом ошибок — следим за метриками приложения
  41. Все упало

  42. Все упало — начали 500 приложения в кластере

  43. Все упало — начали 500 приложения в кластере — забита

    сеть
  44. Все упало — начали 500 приложения в кластере — забита

    сеть — DNS не вывозит
  45. Все упало — начали 500 приложения в кластере — забита

    сеть — DNS не вывозит — виновато наше приложение
  46. Amplify DNS запросов

  47. Web application pod - v2

  48. Web application — Secret — ConfigMap — Deployment — Service

  49. Background process

  50. Background process - scheduler

  51. Background process - scheduler $worker = new KohkimakimotoWorkerWorker(); $worker->job( "cleanup_old_tokens",

    [ 'cron_time' => '0 3 * * *', 'max_processes' => 1, 'command' => 'php yii cleanup' ] ); $worker->start();
  52. Background process - scheduler — Deployment — Secret

  53. Background process. Cron-job?

  54. Background process. Cron-job? — только недавно вышла из alpha

  55. Background process. Cron-job? — только недавно вышла из alpha —

    не было автоудаления отработавших pods
  56. Background process. Cron-job? — только недавно вышла из alpha —

    не было автоудаления отработавших pods — тяжеловесный механизм
  57. Admin tools

  58. Admin tools - migrations

  59. Admin tools - migrations Admin tools - migrations — Job

    — Secret
  60. None
  61. Codebase

  62. 12 factor application manifesto

  63. Logs => stdout/stderr

  64. Logs => stdout/stderr — json_encode

  65. Logs => stdout/stderr — json_encode — file_put_contents('php://stderr', ...

  66. Logs => stdout/stderr [pool www] child 12 said into stdout:

    {“message”: "2017-09-21 14:10:02 [x.x.x.x][-][-][trace][yii\base\Application::bootstrap] Bootstrap with yii\debug\Module::bootstrap()...
  67. Logs => logstash

  68. Logs => stdout/stderr — UDP

  69. Logs => stdout/stderr — UDP — GELF

  70. Logs => stdout/stderr — UDP — GELF — fastcgi_finish_request

  71. Config ... 'logstash' => [ 'class' => 'app\components\GelfLogger\GraylogTarget', 'enabled' =>

    getenv('APP_LOG_TARGET') == 'logstash', 'host' => getenv('APP_GELF_HOST') , 'port' => getenv('APP_GELF_PORT') , ] ...
  72. Tools

  73. Make

  74. Make — make build

  75. Make — make build — make up/down

  76. Make — make build — make up/down — make test

  77. Gitlab

  78. Gitlab — source version control

  79. Gitlab — source version control — continuous integration pipelines

  80. Gitlab — source version control — continuous integration pipelines —

    continuous integration runners
  81. Host platforms Dev, QA, CI Docker-compose Env files Stage, Performance,

    Production Kubernetes/K8s-handle Gitlab Variables/K8s-handle
  82. Почему не Minikube?

  83. Почему не Minikube? — сложнее использовать в CI

  84. Почему не Minikube? — сложнее использовать в CI — все

    равно будет != production
  85. Почему не Minikube? — сложнее использовать в CI — все

    равно будет != production — сложнее разворачивать внешние backend service
  86. Почему Docker-Compose?

  87. Почему Docker-Compose? — простой и популярный инструмент

  88. Почему Docker-Compose? — простой и популярный инструмент — можно поднять

    набор любых контейнеров
  89. Почему Docker-Compose? — простой и популярный инструмент — можно поднять

    набор любых контейнеров — достаточная похожесть на Kubernetes
  90. k8s-handle

  91. k8s-handle — jinja-style шаблоны k8s манифестов

  92. k8s-handle — jinja-style шаблоны k8s манифестов — файлы с конфигурацией

    приложения != secret
  93. Gitlab CI Variables

  94. Gitlab CI Variables — храним только секретные данные (ключи доступа

    к сервисам, пароли)
  95. Gitlab CI Variables — храним только секретные данные (ключи доступа

    к сервисам, пароли) — доступно только команде проекта
  96. Результаты

  97. Человеко-месяц разработчика

  98. Быстрое развертывание сервиса

  99. Быстрое прохождение/падение тестов

  100. Переиспользуемость

  101. Эксплуатация вывозит

  102. Имеем все плюшки Kubernetes как платформы

  103. Пол года на бою — полет нормальный

  104. None
  105. https://github.com/igonsk/php-k8s/

  106. Игорь Яцевич бэкенд разработчик тимлид 2ГИС Вопросы? igor.yatsevich igor@yatsevich.ru