Начиная с версии 1.20 разработчики Kubernetes объявили, что в будущих релизах не будут поддерживать контейнерный движок Docker. А с версии 1.24 вообще удалили его из списка поддерживаемых движков. К счастью, его отлично заменил CRI-O — легковесная исполняемая среда для контейнеров в Kubernetes.
Технические характеристики для узлов кластера Kubernetes
Я использую ванильный (оригинальный) трехнодовый кластер Kubernetes с версией 1.27.3. Он состоит из одной мастер-ноды и двух рабочих (worker) нод. Технические характеристики серверов:
Настройка ОС
В первую очередь нужно подготовить ОС. Шаги, описанные ниже, выполняйте на всех узлах кластера.
- Обновите список пакетов и установите обновления:
sudo apt update && sudo apt -y upgrade
- Выключите SWAP. Kubernetes не поддерживает работу с этим механизмом, поэтому отключить его нужно на постоянной основе. Для этого откройте для редактирования файл fstab:
sudo nano /etc/fstab
Добавьте символ # в самое начало строки, которая содержит слово swap.
Сохраните изменения в файле и закройте из него. После этого перезагрузите сервер:
sudo reboot
- Загрузите сетевые модули overlay и br_netfilter из ядра операционной системы:
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
И активируйте их:
sudo modprobe overlay
sudo modprobe br_netfilter
- Примените сетевые настройки:
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
Выполните перезапуск параметров ядра:
sudo sysctl --system
- Для удобства выключите firewall. В ОС семейства Ubuntu по умолчанию используется UFW, поэтому выключите и удалите UFW из автозагрузки:
sudo systemctl stop ufw && sudo systemctl disable ufw
Теперь ОС готова к установке движка.
Установка CRI-O
Пакеты CRI-O отсутствуют в официальных репозиториях ОС Ubuntu, поэтому воспользуйтесь репозиторием от разработчиков ОС openSUSE.
- Задайте две переменные:
a) имя и версию используемого дистрибутива;
b) версию CRI-O.Напомню, что я использую дистрибутив Ubuntu с версией 22.04:
OS=xUbuntu_22.04
Далее задайте версию CRI-O:
VERSION=1.23
- Добавьте репозиторий от разработчиков ОС OpenSUSE:
echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/ /" | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list
- Далее добавьте репозиторий, в котором хранятся пакеты с CRI-O:
echo "deb
http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:
cri-o:/$VERSION/$OS/ /" | sudo tee
/etc/apt/sources.list.d/devel:kubic:libcontainers:stable:cri-o:$VERSION.list
- Скачайте и добавьте официальный GnuPG-ключ от репозитория OpenSUSE:
curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/Release.key | sudo apt-key add -
- После этого обновите списки пакетов, установите CRI-O и необходимые пакеты:
sudo apt update && sudo apt install cri-o cri-o-runc cri-tools -y
- Добавьте CRI-O в автозагрузку и запустите:
sudo systemctl enable crio.service && sudo systemctl start crio.service
- Проверьте статус службы CRI-O:
sudo systemctl status crio.service
На скриншоте выше видно, что unit crio.service успешно запустился. Движок CRI-O готов к работе.
Установка пакетов Kubernetes
Теперь нужно установить пакеты, которые требуются для запуска кластера Kubernetes. Разработчики Kubernetes предоставляют собственный репозиторий, где есть всё необходимое.
- Скачайте и добавьте официальный GnuPG-ключ от официального репозитория Kubernetes:
curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg
Добавьте официальный репозиторий Kubernetes в систему:
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
Обновите список пакетов, установите утилиты kubelet, kubeadm, kubectl:
sudo apt update && sudo apt -y install kubelet kubeadm kubectl
- После установки всех пакетов добавьте сервис kubelet в автозагрузку:
sudo systemctl enable kubelet
Теперь у вас есть все пакеты для Kubernetes, и можно запускать мастер-ноду.
Запуск мастер-ноды Kubernetes
Перейдите на сервер, где будет находиться мастер-нода Kubernetes. Инициализируйте кластер и заранее задайте подсеть для подов с помощью команды:
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
В зависимости от скорости интернет-соединения инициализация кластера может занимать от 2–3 до 10 минут.
После того как команда выполнится, вы увидите в командной строке фразу: Your Kubernetes control-plane has initialized successfully! Это означает, что мастер-нода успешно запущена и кластер инициализирован.
Чтобы начать использовать кластер, нужно скопировать конфигурационный файл с именем config в домашнюю директорию текущего пользователя. Для этого выполните шаги, которые указаны в выводе команды:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Убедитесь, что мастер-нода успешно запущена:
kubectl get nodes
В статусе указано Ready — это значит, что нода готова к работе.
Добавление рабочих нод
Чтобы присоединить рабочие ноды, выполните команду, которая была сгенерирована в конце инициализации мастер-ноды. В моем примере команда выглядит следующим образом:
kubeadm join 192.168.199.130:6443 --token sgnjx8.6i227i7ueb9deiyf --discovery-token-ca-cert-hash sha256:3b820a853c9955647e0c44976a4a7efb2c037955691eff75fdd41c603623aac2
Установка плагина flannel в кластер
Для организации сети внутри кластера я использую плагин flannel — это популярный сетевой плагин, который разработан специально для контейнеров. Всем контейнерам и подам назначается один IP-адрес в созданной сети, а взаимодействие между ним происходит путем прямого обращения по IP.
Для установки воспользуйтесь командой:
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
Убедитесь, что flannel успешно создан и запущен:
kubectl get po -n kube-flannel
На выходе вы получите полностью рабочий кластер Kubernetes, который использует движок CRI-O и состоит из одной мастер-ноды и двух рабочих нод. Готовый кластер можно использовать для публикации контейнерных приложений.