Kubernetes

Как деплоить по-царски, попивая смуззи в коворкинге

Гребенников Роман / Findify.io / @public_void_grv

Обо мне

twitter: @public_void_grv email: grv@dfdx.me

Findify

  • Поиск и рекомендации
  • 15M уников в месяц, 100 rps

AWS everywhere!

  • CloudFormation, Beanstalk
  • в начале - хорошо
  • потом - ад копипасты
  • счет - 10k$/месяц

AWS подкинула проблем

  • dev / staging / prod - АААА!
  • colocating apps - нельзя
  • spot instances - через жопу

Любое телодвижение увеличивает счёт

Я твой куратор в игре синий кит

  • AWS ECS
  • Mesos + Marathon
  • Nomad
  • Kubernetes

Оркестраторы

ECS Mesos K8s
порог вхождения ок высокий высокий
фичи мало средне много
расширяемость нет высокая средне
сеть нет есть есть

А чё не <swarm/rancher/dcos/etc>?

Kubernetes

  • Написан гуглом
  • у нас - 1.5, недавно вышел 1.6
  • безумное количество фич
  • большое комьюнити, есть GСE

Как поставить?

  • kubeadm / minikube - для утех
  • kops / kubernetes-ansible - в прод
  • GCE - анальный зонд от гугла

demo: minikube

demo: Dockerfile

Поды

  • группа докер-контейнеров
  • запускается в одном месте

demo: pod

Гвозди микроскопом

Поды слишком низкоуровневы:

  • scaling
  • lifecycle

Deployment

декларативное описание операций над подами:

  • deploy-rollback
  • scale up-down
  • rolling update

demo: simple app

demo: deployment

Service

логическая группа подов

  • динамически добавляются новые поды
  • удаляются дохлые поды
  • единая точка контакта

demo: service

Типы сервисов

  • ClusterIP: только внутри
  • NodePort: привет, HAproxy
  • LoadBalancer: интеграция с ELB
  • ExternalName: маппинг для внешних сервисов

demo: nodeport service

Да я то же самое могу!

  • На баш скриптах!
  • Я знаю ansible/chef/salt/etc!
  • Это умеет swarm/mesos/etc.!

k8s это не только ценный мех

  • stateful-приложения
  • cluster network
  • autoscaling
  • service discovery
  • multi-DC

Как запустить mysql в k8s?

StatefulSet:

  • network identity
  • persistent storage
  • порядок операций

demo: mysql inside k8s

StatefulSet

  • PersistentVolumeClaim: хочу 100Гб, дай!
  • PersistentVolume: на, тут уже было!
  • PV Provisioning: на, я создал!

Где хранить?

  • Provisioning: GCE-PD, AWS EBS
  • GlusterFS, Ceph, Cinder, vSphere, Quobyte, Azure disk

Негатив: Cassandra

  • AWS: EBS привязан к AZ
  • соединения снаружи
  • OOM

результат: вынесли её на отдельные ноды

Негатив: сеть

  • Используем weave-cni [flannel/calico]
  • дважды вынесло весь кластер

Jenkins: до

  • Scala: билды по пол-часа
  • Несколько билдов мешают друг другу
  • на сервере зоопарк
  • overprovisioning

Jenkins: после

  • jenkins-k8s: воркеры по запросу
  • отдельные контейнеры для разных приложений
  • быстрые билды, не мешающие друг другу

Деньги: до

  • каждый сервис: отдельный инстанс в разных AZ
  • низкая утилизация
  • велосипеды для деплоя

Деньги: после

  • slave-ноды на spot-инстансах (через spotinst.com)
  • автоскейлинг: в зависимости от утилизации
  • разные окружения на одном кластере
  • счет в 3 раза меньше

Use case: сборка индекса

Сервис по периодической сборке индекса для ES

  • очередь сообщений
  • собирает несколько индексов одновременно
  • проблема: индексы разные

Use case: сборка индекса, после

  • Один индекс - один CronJob
  • разные ресурсы для больших индексов

А надо ли оно вам?


нет*


* - скорее всего

Что вас ждет

  • Запутанная документация
  • Баги
  • Седые волосы из-за деплоя
  • Инфаркт при обновлении
  • Осознание собственной тупизны

Что вас еще ждёт

  • Декларативное описание инфраструктуры
  • Ровная утилизация кластера
  • Спокойный деплой

Вопросы?

оскорбления100200300400500
холивар100200300400500
алгоритмы100200300400500
карго-культ100200300400500
эмоциональное выгорание100200300400500
языки программирования100200300400500