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

JUGNsk Meetup #18. Михаил Папин и Руслан Зайнутдинов - Всему своё место, или как написать k8s оператор на Java

JUGNsk Meetup #18. Михаил Папин и Руслан Зайнутдинов - Всему своё место, или как написать k8s оператор на Java

Докладчики: Михаил Папин и Руслан Зайнутдинов, Backend-инженеры, R&D центр, ЦФТ

Расскажем, как, зачем и почему мы на написали k8s оператор для сущностей Kafka на Java, используя Quarkus Framework, и запустили его, используя сборку в native.

Покажем, какие грабли собрали в пути, и поделимся своими впечатлениями от данного подхода.

jugnsk

June 27, 2021
Tweet

More Decks by jugnsk

Other Decks in Programming

Transcript

  1. Всему своё место
    Или как написать k8s оператор на Java
    1

    View Slide

  2. Позвольте представиться
    2
    Папин Михаил
    Компания ЦФТ
    Центр исследований и
    разработок
    Tg: @i4exz
    Зайнутдинов Руслан
    Компания ЦФТ
    Центр исследований и
    разработок
    Tg: @beelzzebub

    View Slide

  3. О чем доклад?
    Если кратко:
    K8s + operator + прикладная задача + Java + Quarkus Framework +
    GraalVM native image = Prod
    Если подробнее:
    Расскажем (и покажем) из чего состоит и для чего может
    использоваться k8s оператор и как его написать самостоятельно
    используя Java.
    3

    View Slide

  4. Мы не будем детально рассказывать про
    то:
    • Как работает Apache Kafka (присутствует исключительно в
    контексте решаемой задачи).
    • Что такое и как устроен k8s.
    Что почитать, посмотреть?
    • Официальная документация.
    • Недавняя статья на хабре от Southbridge
    https://habr.com/ru/company/southbridge/blog/556860/
    • Twitter: @gAmUssA (Viktor Gamov)
    4

    View Slide

  5. С чего всё началось?
    Дано:
    1. Kafka как шина данных.
    2. Клиенты (банки) при подключении к сервису получают свой
    логин, пароль и пишут в свои персональные топики.
    Требуется:
    1. Автоматизировать процесс подключения.
    2. Сделать артефакты подключения удобными для обслуживания.
    5

    View Slide

  6. Лемма о k8s
    6

    View Slide

  7. K8S Custom resources
    • Особый ресурс (мета-ресурс)
    Custom-resource-definition (далее crd)
    Довольно известный пример:
    ServiceMonitor – custom resource для регистрации сервиса в
    Prometheus-е
    7

    View Slide

  8. K8S (расширение API, custom resources)
    8
    Имя crd в кластере
    Пример cr KafkaAcl

    View Slide

  9. Лемма об операторах
    • Operators are software extensions to Kubernetes that make use of
    custom resources to manage applications and their components.
    • По сути своей мы подражаем работе человека-оператора.
    9

    View Slide

  10. Примеры операторов
    • https://github.com/prometheus-operator/prometheus-operator
    • https://github.com/zalando/postgres-operator
    • https://github.com/strimzi/strimzi-kafka-operator
    • https://operatorhub.io/
    Суть одна, мы описываем сущности как код в виде custom resources
    и выполняем в зависимости от «конфигурации» некоторые
    действия.
    10

    View Slide

  11. Лемма о прикладных сущностях
    Сущности, которые
    нам нужны:
    • Topic
    • ACL
    • User
    11

    View Slide

  12. «Доказываем теорему»
    • Создаем crd для ключевых сущностей Kafka (topic, user, acl)
    • При подключении пользователя генерируются cr
    соответствующих типов конкретно для него и загружаются в k8s
    кластер
    • Оператор видит новые ресурсы и создает в Kafka и Zookeeper’e
    соответствующие сущности
    • При модификации существующих ресурсов оператор вносит
    соответствующие изменения.
    • НИКТО В Kafka И Zookeeper НАПРЯМУЮ РУКАМИ НЕ ХОДИТ.

    12

    View Slide

  13. Почему не готовое решение?
    • Хотелось попробовать ☺
    • Существующие решения «оверкилл» для нашей задачи.
    • Какие-то решения были заточены под «свой клауд».
    13

    View Slide

  14. Почему Java?
    • Хотелось понять можно ли погрузиться в мир «новомодных штук»
    используя проверенный язык.
    • Да, можно было сделать на любом другом подходящем.
    • Dev-ы отправились в мир Ops, вооруженные знакомыми
    инструментами.
    • “One-shot” язык сильно усложнит доработки спустя время.
    14

    View Slide

  15. Почему не Spring Quarkus?
    • Supersonic subatomic java ☺
    • Поддерживает стандарт JavaEE
    • Возможность собрать native image
    Если хочется большего про Quarkus:
    Twitter: @DaschnerS (Sebastian Daschner)
    15

    View Slide

  16. Что такое native image?
    • Исполняемый файл скомпилирован под конкретную архитектуру
    (исполняется не байткод, а «бинарник»)
    Это стало возможным после выпуска Oracle GraalVM, Quarkus был
    первым фреймворком который предоставил возможность без боли
    собрать native image.
    Если хочется большего про GraalVM:
    Twitter: @shelajev (Oleg Šelajev)
    16

    View Slide

  17. Зачем native image?
    - Resources.Request.Memory=Resources.Limit.Memory=200m
    - MaxRamPercentage=75
    17
    JVM
    Native
    Startup time:

    View Slide

  18. Зачем native image?
    - Resources.Request.Memory=Resources.Limit.Memory=20m
    - MaxRamPercentage=75
    18
    Native
    Startup time:
    JVM

    View Slide

  19. Наглядно, без лишних циферок. Limit=200m
    19

    View Slide

  20. Ограничения накладываемые native image
    • Платформозависимость
    • AOT компиляция
    • https://www.graalvm.org/reference-manual/native-
    image/Limitations/
    20

    View Slide

  21. Как устроен процесс
    • Гитлаб -> создает ресурсы в
    кластере.
    • Оператор -> мониторит
    ресурсы, модифицирует
    внутренности Kafka и
    Zookeeper
    • Администратор ->
    модифицирует ресурсы.
    21

    View Slide

  22. План второй части
    • Конфигурация
    • Структура проекта
    • Зависимости
    • Жизненный цикл ресурса вместе с кодом
    • Грабли
    • Выводы
    22

    View Slide

  23. Полезные ссылки
    • Quarkus - https://quarkus.io/
    • Fabric8 kubernetes client - https://github.com/fabric8io/kubernetes-
    client
    • GraalVM - https://www.graalvm.org/reference-manual/native-image/
    23

    View Slide

  24. Выводы
    • На Java писать инфраструктурные полезняшки МОЖНО
    • Native image (GraalVM) реально работает
    • Quarkus поддерживает работу с native image “из коробки”
    • На этом слое магии нет
    24

    View Slide

  25. Спасибо
    центру за это
    за внимание!
    Полезные ссылки
    • Quarkus: https://quarkus.io/
    • Fabric8 kubernetes client: https://github.com/fabric8io/kubernetes-client
    • GraalVM: https://www.graalvm.org/reference-manual/native-image/
    • CRD: https://kubernetes.io/docs/tasks/extend-kubernetes/custom-
    resources/custom-resource-definitions/
    Михаил Папин
    Руслан Зайнутдинов
    ЦФТ
    🏳

    View Slide