Привет! Меня зовут Сергей, я DevOps в Surf. DevOps-отдел в Surf ставит своей задачей не только налаживание взаимодействия между специалистами и интеграцию рабочих процессов, но и активные исследования и внедрение актуальных технологий как в собственную инфраструктуру, так и в инфраструктуру заказчика.
Ниже я немного расскажу об изменениях в технологическом стеке для контейнеров, с которыми мы встретились при изучении дистрибутива CentOS 8 и о том, что такое CRI-O и как быстро настроить с его помощью исполняемую среду для Kubernetes.
Почему Docker отсутствует в стандартной поставке CentOS 8
После установки последних крупных релизов ຮຮ 8 ຫຼື CentOS 8 нельзя не заметить: в этих дистрибутивах и официальных репозиториях отсутствует приложение Docker, которое идеологически и функционально заменяют собой пакеты podman, Buildah (присутствуют в дистрибутиве по умолчанию) и CRI-O. Это связано с практической реализацией стандартов, разрабатываемых, в том числе, и компанией Red Hat в рамках проекта Open Container Initiative (OCI).
Цель OCI, являющейся частью The Linux Foundation, — создание открытых индустриальных стандартов для форматов и исполняемой среды контейнеров, которые бы решали сразу несколько задач. Во-первых, не противоречили как философии Linux (например, в той её части, что каждая программа должна выполнять какое-то одно действие, а Docker представляет собой этакий комбайн всё-в-одном). Во-вторых, могли бы устранить все имеющиеся недостатки в программном обеспечении Docker. В-третьих, были бы полностью совместимыми с бизнес-требованиями, выдвигаемыми ведущими коммерческими платформами для развёртывания, управления и обслуживания контейнеризованных приложений (например, Red Hat OpenShift).
ຂໍ້ບົກພ່ອງ Docker и достоинства нового ПО уже были довольно подробно описаны в ບົດຂຽນນີ້, а с подробным описанием как всего предлагаемого в рамках проекта OCI стека ПО и его архитектурными особенностями можно ознакомиться в официальной документации и статьях как от самой Red Hat (неплохая ບົດຄວາມ в Red Hat blog), так и в сторонних ການທົບທວນຄືນ.
Важно отметить, какую функциональность имеют компоненты предлагаемого стека:
podman — непосредственное взаимодействие с контейнерами и хранилищем образов через процесс runC;
Buildah — сборка и загрузка в реестр образов;
CRI-O — исполняемая среда для систем оркестрации контейнеров (например, Kubernetes).
Думаю, что для понимания общей схемы взаимодействия между компонентами стека целесообразно привести здесь схему связей Kubernetes c runC и низкоуровневыми библиотеками с использованием CRI-O:
CRI-O и Kubernetes придерживаются одного и того же цикла выпуска и поддержки (матрица совместимости очень проста: мажорные версии Kubernetes и CRI-O совпадают), а это, с учётом ориентира на полное и всестороннее тестирование работы данного стека разработчиками, даёт нам право ожидать максимально достижимой стабильности в работе при любых сценариях использования (здесь на пользу идет и относительная легковесность CRI-O ປຽບທຽບກັບ Docker в силу целенаправленного ограничения функциональности).
ເມື່ອຕິດຕັ້ງ Kubernetes «right way» способом (по мнению OCI, конечно) с использованием CRI-O ສຸດ CentOS 8 мы столкнулись с небольшими затруднениями, которые, однако, успешно преодолели. Буду рад поделиться с вами инструкцией по установке и настройке, которые в совокупности займут от силы 10 минут.
Как развернуть Kubernetes на CentOS 8 с использованием среды CRI-O
Предварительные условия: наличие как минимум одного хоста (2 cores, 4 GB RAM, накопитель не менее 15 GB) с установленной CentOS 8 (рекомендуется профиль установки «Server»), а также записи для него в локальном DNS (в крайнем случае можно обойтись записью в /etc/hosts). И не забудьте отключить swap.
Все операции на хосте производим от имени пользователя root, будьте внимательны.
На первом шаге настроим ОС, установим и настроим предварительные зависимости для CRI-O.
Обновим ОС:
dnf -y update
Далее требуется настроить файрволл и SELinux. Здесь у нас всё зависит от окружения, в котором будут работать наш хост или хосты. Вы можете либо настроить файрволл по рекомендациям из ເອກະສານ, либо, если находитесь в доверенной сети или применяете сторонний файрволл, изменить зону по умолчанию на доверенную или выключить файрволл:
зададим необходимую версию CRI-O (мажорная версия CRI-O, как уже упоминалось, совпадают с требуемой версией Kubernetes), так как последняя стабильная версия Kubernetes на данный момент 1.18:
Обратите внимание на первый нюанс, который мы встречаем в процессе инсталляции: необходимо отредактировать конфигурацию CRI-O перед запуском сервиса, так как требуемый компонент conmon имеет отличное от указанного место размещения:
sed -i 's//usr/libexec/crio/conmon//usr/bin/conmon/' /etc/crio/crio.conf
Теперь можно активировать и запустить демон CRI-O:
Второй важный нюанс: так как мы не используем демон Docker, а используем демон CRI-O, до запуска и инициализации Kubernetes требуется внести соответствующие настройки в конфигурационный файл /var/lib/kubelet/config.yaml, предварительно создав нужный каталог:
Третий важный момент, с которым мы сталкиваемся при установке: несмотря на то, что мы указали используемый драйвер cgroup, и его настройка через аргументы передаваемые ກະດູກ устарела (на что прямо указано в документации), нам необходимо добавить в файл аргументы, иначе наш кластер не инициализируется:
ເພື່ອປັບແຕ່ງ ຍົນຄວບຄຸມ ຫຼື ພະນັກງານ ноды за считанные минуты, вы можете воспользоваться этим скриптом.
Пора инициализировать наш кластер.
Для инициализации кластера выполните команду:
kubeadm init --pod-network-cidr=10.244.0.0/16
Обязательно запишите команду присоединения к кластеру «kubeadm join …», которой предлагается воспользоваться в конце вывода, либо, как минимум, указанные токены.
Установим плагин (CNI) для работы Pod network. Я рекомендую использовать Calico. Возможно, более популярный Flannel имеет проблемы с совместимостью с nftables, да и Calico — единственная реализация CNI, рекомендуемая и полностью протестированная проектом Kubernetes:
Для подключения worker ноды к нашему кластеру её требуется настроить по пунктам инструкции 1 и 2, либо воспользоваться ສະຄຣິບ, затем выполнить команду из вывода «kubeadm init …», которую мы записали на предыдущем этапе:
Проверим, что наш кластер инициализирован и начал работу:
kubectl --kubeconfig=/etc/kubernetes/admin.conf get pods -A
Готово! Вы уже можете размещать на вашем K8s кластере полезную нагрузку.
Что нас ждёт впереди
Надеюсь, что инструкция выше помогла сэкономить вам немного времени и нервов.
Исход процессов, происходящих в индустрии, зачастую зависит от того, как их принимает основная масса конечных пользователей и разработчиков другого ПО в соответствующей нише. Пока не совсем ясно, к какому итогу через несколько лет приведут инициативы OCI, но мы будем с удовольствием за этим следить. Своим мнением вы можете поделиться прямо сейчас в комментариях.
ຕິດຕາມເບິ່ງ!
Данная статья появилась благодаря следующим источникам: