Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Миграция из Docker Swam в Kubernetes

Sysadminka
October 25, 2019

Миграция из Docker Swam в Kubernetes

Дмитрий Гадеев, Альфа-Банк, руководитель направления инфраструктурных сервисов

Sysadminka

October 25, 2019
Tweet

More Decks by Sysadminka

Other Decks in Technology

Transcript

  1. Чего не будет в докладе • Рассказа о нашем проекте

    • Как мы жили в Docker Swarm и почему решили с него мигрировать • Как эксплуатируем OpenShift-кластеры и как пришли к ванильному кубу
  2. Варианты on-premise Kubernetes-ов o Vanilla Kubernetes o Docker Universal Control

    Plane (UCP) в Docker ЕЕ o RedHat OpenShift и OKD (ранее OpenShift Origin) o IBM Cloud Private o GKE Anthos o Надстройки для оркестрации кластеров: o Rancher 2 o Pivotal Container Service (PKS) o …
  3. Варианты on-premise Kubernetes-ов o Vanilla Kubernetes o Docker Universal Control

    Plane (UCP) в Docker ЕЕ o RedHat OpenShift и OKD (ранее OpenShift Origin) o IBM Cloud Private o GKE Anthos o Надстройки для оркестрации кластеров: o Rancher 2 o Pivotal Container Service (PKS) o …
  4. 1000 и 1 способ получить Kubernetes • взять kube-as-a-service и

    не заниматься ерундой • eсли используется openshift/okd или Docker EE выбора нет :) • воспользоваться kops (AWS only) • kube-spray • kubeadm • hand-made Ansible-роли
  5. 1 кластера хватит всем… или нет? Много кластеров Мало кластеров

    + Меньше цена ошибки - Сложнее жизнь эксплуатации + Легче эксплуатация - Крупнее failure-domain - Более критичные сервисы мешают жить менее важным (PCI DSS vs весь мир) • dev / test и prelive – кластеры (минимально возможное количество) • 1 prod. кластер на каждый класс критичности (MC/BC/…)
  6. 1 кластера хватит всем… или нет? Много кластеров Мало кластеров

    + Меньше цена ошибки - Сложнее жизнь эксплуатации + Легче эксплуатация - Крупнее failure-domain - Более критичные сервисы мешают жить менее важным (PCI DSS vs весь мир) • dev / test и prelive – кластеры (минимально возможное количество) • 1 prod. кластер на каждый класс критичности (MC/BC/…)
  7. Ingress трафика в кластер • Ingress-nginx (от авторов Kubernetes) •

    Хост-порты на ingress-нодах (без k8s-сервисов, чтобы не терять source IP) • Железный аналог keepalived и haproxy/nginx для балансировки запросов к apiserver • Отдельный IP на нем же на каждое «приложение» (проект / сервис etc) в кластере
  8. Немного про сесурити • OpenShift – это security-first система •

    из коробки есть SecurityContextConstraints • и набор предопределенных классов «привилегированности» • В Kubernetes есть PodSecurityPolicy, но • чаще всего их контроль выключен • Описание политик и права в них надо составлять вручную • IBM Cloud заопенсорсил свой набор PSP-правил https://github.com/IBM/cloud-pak/tree/master/spec/security/psp
  9. Немного про сесурити • По-умолчанию, трафик между POD-ами и namespace-ами

    не ограничен • NetworkPolicy позволяет устранить эту «особенность» • Работают по принципу белого списка (запрещено все, что не разрешено)
  10. Немного про сесурити • По-умолчанию, трафик между POD-ами и namespace-ами

    не ограничен • NetworkPolicy позволяет устранить эту «особенность» • Работают по принципу белого списка (запрещено все, что не разрешено) • От выбора CNI зависит, доступны ли NetworkPolicy вам :) • Flannel не поддерживает NetworkPolicy
  11. Балансировка нагрузки на кластер • kube-scheduler не вытесняет POD-ы с

    нод после размещения (если нет нехватки ресурсов) • Descheduler позволяет повторно провести планирование • Запускается в качестве Job-ы (а лучше CronJob-ы ;) https://github.com/kubernetes-sigs/descheduler
  12. Bootstrap нового проекта в k8s • Создать PR в нужный

    git-репо и доверить автоматике весь процесс: • Создать Namespace и набор необходимых RBAC-объектов • Добавить в Namespace NetworkPolicy-объекты: • Изоляция от других NS • Доступ к общим инфраструктурным сервисам • …
  13. А что такое приложение? • Набор js-файлов, jar / war

    / ear – архив или статический бинарник на go? • Docker-образ c чем-то из предыдущего пункта? • Образ и набор манифестов для его развертывания в Kubernetes?
  14. А что такое приложение? • Набор js-файлов, jar / war

    / ear – архив или статический бинарник на go? • Docker-образ c чем-то из предыдущего пункта? • Образ и набор манифестов для его развертывания в Kubernetes?
  15. Немного про сборку образов: где и чем? • Доступ к

    /var/run/docker.sock - сразу нет • docker-in-docker пока еще есть, но мы от него уходим • Google Kaniko самый простой и незатейливый на подъем, но не без проблем • Хотим начать пробовать buildah от Red Hat
  16. Что такое приложение? • Минимальный набор манифестов для его развертывания

    в Kubernetes: • Deployment • Service • Ingress • ConfigMap / Secrets (опционально)
  17. Немного правды жизни • Многих разработчиков пугает многословность описания Kubernetes-

    объектов • Наша задача снизить степень тревожности разработчиков
  18. Об упрощении будней разработчика • Helm – наиболее распространенный инструмент

    шаблонизациии Kubernetes-манифестов • Для Kubernetes-native проектов предоставляем черновой Helm-чарт • Многословие Kubernetes-манифестов пытаемся скрыть в values.yaml- файлах
  19. Helm :: тизер • В текущей реализации Helm не все

    хорошо с безопасностью • Helm Tiller допустимо использовать только для развертывания инфраструктуры и проведения экспериментов в тестовых кластерах (БД / кеш / …) • Подробнее о Helm на заключительном докладе!
  20. Миграция существующих проектов • Для существующих проектов хочется бесшовной миграции

    в k8s • Текущая логика CD (деплой в Mesos/Marathon) написана на Ansible • Helm – не лучший выбор • Мы пытаемся упростить миграцию в Kubernetes за счет обновления deployment-логики существующих ролей
  21. Пару слов о деплое • Для проверки подготовленных манифестов в

    CI-пайплайне проверяем их с помощью kubeval • Для прозрачности процесса деплоя и его синхронности используем kubedog • Если у вас OpenShift (OKD) и пользуетесь встроенными DeploymentConfig- объектами, можно деплоить и через oc.
  22. Как (не) выстрелить себе в ногу при деплое • label

    selector в объектах Deployment – неизменяемое поле • selector в объекте сервис – поддерживает изменения • …
  23. Как (не) выстрелить себе в ногу при деплое • label

    selector в объектах Deployment – неизменяемое поле • selector в объекте сервис – поддерживает изменения • … • Использовать свой admission controller для верификации манифестов – хороший способ избежать подобных ситуаций
  24. Откуда берется даунтайм • При деплое новой версии приложения контейнер

    по команде kubelet-а может завершиться до того, как kube-proxy удалит его из списка доступных
  25. Откуда берется даунтайм • preStop lifecycle-хук работает синхронно и позволяет

    решить проблему: # ... containers: - name: good-app image: nginx:latest readinessProbe: # ... lifecycle: preStop: exec: command: ["/bin/bash", "-c", "sleep 20"] # ...
  26. Управление ресурсами – это не только $ • Процесс размещения

    ПОДов на нодах основан на учете доступности запрошенных гарантированных (resource.requests) ресурсов
  27. ResourceQuota, LimitRange, … • Процесс размещения ПОДов на нодах основан

    на учете доступности запрошенных гарантированных (resource.requests) ресурсов • ResourceQuota позволяет ограничить утилизацию ресурсов в пределах неймспейса: • Доступные ресурсы CPU и памяти (гарантированные и предельные (resource.limits)) • Доступный объем использования «диска»: постоянного и эфемерного хранилищ (v1.8 – alpha, v1.16 – beta) • Ограничение на количество объектов заданного типа
  28. ResourceQuota, LimitRange, … • Наличие ограничения через ResourceQuota-е требует, чтобы

    ВСЕ создаваемые POD-ы имели явно заданные requests и limits на ресурсы этого типа ресурса • Ресурс LimitRange позволяет задать допустимые диапазоны requests и limits для ресурса и их значения по-умолчанию
  29. HPA / VPA или растем во всех направлениях • Horizontal

    Pod Autoscaler (HPA) может автоматически изменять количество реплик объектов Deployment / StatefulSet, в зависимости от заданных метрик • Потребление CPU / памяти (базовая функциональность) • Любые кастомные метрики через интеграцию metrics-api кластера и Prometheus посредством prometheus-adapter • Vertical Pod Autoscaler (VPA) отслеживает фактическое потребление ресурсов контейнера и формирует рекомендации по оптимальным значениям requests и limits для CPU и памяти • VPA может автоматически применять рассчитанные рекомендации к ресурсу (Deployment / StatefulSet)
  30. 0.5 vCPU: 2019-10-19 13:54:27.481 INFO 1 --- [ main] ru.alfa.Application

    : Started Application in 48.276 seconds (JVM running for 50.597) 1 vCPU: 2019-10-19 13:42:51.678 INFO 1 --- [ main] ru.alfa.Application : Started Application in 22.755 seconds (JVM running for 24.199) 1.5 vCPU: 2019-10-19 14:38:19.440 INFO 1 --- [ main] ru.alfa.Application : Started Application in 14.429 seconds (JVM running for 15.244) 2 vCPU: 2019-10-19 13:48:45.784 INFO 1 --- [ main] ru.alfa.Application : Started Application in 10.687 seconds (JVM running for 11.284) Это Spring, сынок
  31. HPA / VPA и о том, чего не хватает •

    в Docker есть возможность изменять лимиты на ресурсы контейнера в рантайме, без перезапуска • Но не все так просто…
  32. Снижаем область отказа • affinity / antiAffinity-правила позволяют контролировать область

    отказа • рекомендательные spec: affinity: podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: labelSelector: matchExpressions: - key: security operator: In values: - S2 topologyKey: failure-domain.beta.kubernetes.io/zone • https://clck.ru/JbvZT • https://clck.ru/JbvZs
  33. Снижаем область отказа spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions:

    - key: app operator: In values: - web-store topologyKey: "kubernetes.io/hostname" • affinity / antiAffinity-правила позволяют контролировать область отказа • обязательные • https://clck.ru/JbvZT • https://clck.ru/JbvZs
  34. Снижаем область отказа spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions:

    - key: app operator: In values: - web-store topologyKey: "kubernetes.io/hostname" • affinity / antiAffinity-правила позволяют контролировать область отказа • обязательные • https://clck.ru/JbvZT • https://clck.ru/JbvZs
  35. PodDisruptionBudget • Помогает приложению быть прозрачным для кластера • При

    проблемах с оборудованием позволяет тратить время на действительно ВАЖНЫЕ сервисы
  36. То, о чем нельзя забывать • Kubernetes Failure Stories -

    k8s.af • Kubernetes Failure Stories, or: How to Crash Your Cluster - Zalando - ContainerDays EU 2019 • Build Errors of Continuous Delivery Platform - Zalando - postmortem 2019 • 10 Ways to Shoot Yourself in the Foot with Kubernetes, #9 Will Surprise You - Datadog - KubeCon Barcelona 2019 • Kubernetes Failure Stories - Zalando - KubeCon Barcelona 2019 • Let's talk about Failures with Kubernetes - Zalando - Hamburg meetup 2019 • Total DNS outage in Kubernetes cluster - Zalando - postmortem 2019 • How NOT to do Kubernetes - Sr.SRE Medya Ghazizadeh – Google • Running Kubernetes in Production: A Million Ways to Crash Your Cluster - Zalando - DevOpsCon Munich 2018 • Stories from the Playbook - Google - KubeCon Europe 2018
  37. То, о чем нельзя забывать • Kubernetes Failure Stories -

    k8s.af • Kubernetes Failure Stories, or: How to Crash Your Cluster - Zalando - ContainerDays EU 2019 • Build Errors of Continuous Delivery Platform - Zalando - postmortem 2019 • 10 Ways to Shoot Yourself in the Foot with Kubernetes, #9 Will Surprise You - Datadog - KubeCon Barcelona 2019 • Kubernetes Failure Stories - Zalando - KubeCon Barcelona 2019 • Let's talk about Failures with Kubernetes - Zalando - Hamburg meetup 2019 • Total DNS outage in Kubernetes cluster - Zalando - postmortem 2019 • How NOT to do Kubernetes - Sr.SRE Medya Ghazizadeh – Google • Running Kubernetes in Production: A Million Ways to Crash Your Cluster - Zalando - DevOpsCon Munich 2018 • Stories from the Playbook - Google - KubeCon Europe 2018 (только Google и Zalando)