Поздравляю, вы успешно (или не очень) развернули свой первый кластер k8s с помощью kubeadm! В связи с этим ловите мем, вы его заслужили:
Но давайте перейдем к сути... А что дальше делать-то? Большинство побежит читать доку побегут сразу на гитхаб искать любое приложение которое можно запустить в их кластере Kubernetes (Далее k8s), но они столкнутся с рядом «нюансов». И вот как раз про эти нюансы мы сегодня и поговорим.
В этой статье я, как DevOps-инженер компании СТАРКОВ Групп, расскажу о трёх ключевых "подводных камнях", с которыми сталкивается каждый, кто начинает работать с кубиком:
В k8s за сеть отвечает Container Network Interface (далее CNI). Что-же такое CNI? Если коротко – это фреймворк для динамической настройки всех сетевых ресурсов в k8s. CNI может применяться как для оверлейных сетей (сети, в которых трафик инкапсулируется посредством виртуального интерфейса), так и для андерлейных (сети, работающие сугубо на физическом уровне). Но давайте душнить не будем, а перейдем к конкретике. После «ванильной» раскатки вы обязательно должны установить один из CNI-плагинов чтобы ваши pod-ы смогли общаться между собой. Вот они все, слева направо: Calico, Cilium, Flannel, Kube-route.
GitHub: https://github.com/projectcalico/calico
Docs: https://docs.tigera.io (Придется использовать ВПН)
Плюсы:
поддержка Network Policies (NP);
очень большое комьюнити: Calico используется большими компаниями, а как следствие очень быстро развивается, и активно поддерживается;
поддержка большого количества плюх: интеграция с istio, глубокая интеграция с большинством облачных систем, при отсутствии BGP – есть fallback через IP-in-IP или VXLAN и еще очень много всего;
высокая производительность (при использовании BGP);
рекомендуется для продуктивных сред.
Минусы:
требует понимания: что такое BGP, как используется, общие азы маршрутизации;
в больших кластерах может быть сложно писать, а также поддерживать большое количество NP.
GitHub: https://github.com/cilium/cilium
Docs: https://docs.cilium.io/en/stable/index.html
Плюсы:
самая высокая производительность среди всех CNI;
хорошо себя проявляет в больших инсталляциях, которые порождают большое количество правил iptables;
рекомендуется к применению в хайлоад продуктивных системах;
нативная интеграция с eBPF – функционалом ядра Linux, который позволяет создавать и встраивать на уровне ядра (т.е запускаться в kernel space, а не в user space как обычные приложения) программы, которые могут мониторить и контролировать различные события в системе;
Cloud-native;
может полностью заменить дефолтный kube-proxy, что в больших кластерах просто обязательно для снижения накладных сетевых ресурсов.
Минусы:
требует очень глубокого понимания eBPF(!), а как следствие:
знание основ языка C, всю базу про syscall, чтобы уметь создавать свои костыли для BPF и вообще понимать, как это все работает;
знание языка GOlang, так как все либы написаны нём.
Но опять же, все вышеперечисленное необходимо, если вы хотите раскрыть весь "потанцевал" данного CNI.
не подходит для легаси кластеров, так как требует минимально ядро linux 4.9.
GitHub: https://github.com/flannel-io/flannel
Docs: https://github.com/flannel-io/flannel/tree/master/Documentation
Плюсы:
самый легкий способ запустить сеть в кластере: одна команда, и все начинает работать.
Минусы:
нет поддержки NP;
совершенно не подходит для продакшена, максимум для препрода;
overlay сети (яркий пример – udp) могут выдавать оверхед в ~10-20%.
GitHub: https://github.com/cloudnativelabs/kube-router
Docs: https://kube-router.io/docs/user-guide
Плюсы:
Минусы:
Вы, скорее всего, спросите: а что выбрать? А вот ответ на ваш вопрос:
На данном этапе у вас в кластере есть только CNI плагин для работы сети, но его одного не достаточно, чтобы сразу запускать приложухи/вводить кластер в продакшен и так далее – нам же наши данные где-то надо хранить! В k8s за хранение данных отвечают 3 сущности: Storage Class, PV и PVC. Но так как вы только-только развернули свой первый кластер, вам это ни о чем не говорит. Давайте подробнее разберем каждую сущность.
Storage Class (Далее SC) – это абстракция, которая определяет класс хранилища, и указывает, как создавать PV.
PV (Persistent Volume) – это объект k8s, который предоставляет кусок хранилища который УЖЕ существует в кластере или создается динамически (автоматическое выделение PV мы разберем ниже).
PVC (Persistent Volume Claim) – если по-простому, это запрос на использование хранилища, то есть абстракция, которая как бы говорит: "Мне нужно X Гб хранилища с режимом Y и классом Z".
Казалось бы, ну и в чем тут нюанс? А нюанс в том, что при ванильной раскатке у вас не будет SC из коробки, его придется создать, как и CNI. А чтобы создать SC, нам нужен соответствующий провайдер. Давайте же выберем его! Вот список проверенных провайдеров, каждый со своими плюсами и минусами:
GitHub: -
Docs: -
Плюсы:
Минусы:
GitHub: https://github.com/rancher/local-path-provisioner (содержит примеры использования)
Docs: -
Плюсы:
Минусы:
GitHub: https://github.com/rook/rook
Docs: https://rook.io/docs/rook/latest-release/Getting-Started/intro/
Плюсы:
Минусы:
А также:
GitHub:
Docs: https://longhorn.io/docs
Плюсы: https://github.com/longhorn/longhorn
Минусы:
Также существуют сугубо облачные провайдеры, но их описывать большого смысла нет. Там все +/- одинаковое.
А где что использовать-то?
На данный момент мы уже и сеть подняли, и хранилище организовали. Когда там уже можно будет деплоить приложухи? Ответ: скоро, осталось только обратный прокси как-то засунуть в этот кластер – и все, можно будет работать.
Для начала разберемся, что такое ingress и что такое Ingress Controller. Ingress – это декларативный ресурс (YAML-файл по сути), который описывает, как маршрутизировать запросы. А Ingress Controller – это работающий процесс (под/набор подов), который обрабатывает эти правила. Если очень просто: Ingress это файлик с описанием что и куда отправлять, а Ingress Controller выполняет то, что описано в Ingress.
Рассмотрим существующие контроллеры, чтобы выбрать тот, что подходит именно нам.
GitHub: https://github.com/kubernetes/ingress-nginx
Docs: https://docs.nginx.com/nginx-ingress-controller/
Плюсы:
Минусы:
GitHub: https://github.com/traefik/traefik
Docs: https://doc.traefik.io/traefik/
Плюсы:
Минусы:
GitHub: https://github.com/istio/istio/tree/master/manifests/charts/gateway
Docs: https://istio.io/latest/docs/reference/config/networking/gateway/
Istio Gateway является частью сервис-меша Istio, которая может использоваться как Ingress-прокси на основе Envoy Proxy.
Плюсы:
Минусы:
GitHub: https://github.com/haproxytech/kubernetes-ingress
Docs: https://www.haproxy.com/documentation/kubernetes-ingress/
Плюсы:
Минусы:
Подведем краткий итог:
И вот теперь, дорогие мои читатели, если вы не просто прочитали статью, а еще и выбрали из нее то, что вам подходит, и сами развернули это, то – ваш кластер готов к деплою приложений, поздравляю!
Авторизуйтесь, чтобы написать комментарий