0 Votes

Rancher K3s: Kubernetes на контейнерах Proxmox

Last modified by Сергей Коршунов on 2023/07/08 23:53

Rancher K3s: Kubernetes на контейнерах Proxmox

# докер # кубернетес # проксмокс # devops

Уже долгое время я самостоятельно размещаю большинство своих онлайн-сервисов, таких как календарь, контакты, электронная почта, облачное хранилище файлов, мой веб-сайт и т. Д. Текущая итерация моей установки опирается на серию плейбуков Ansible, которые устанавливают все различные приложения и настраивают их для использования.

Это было действительно стабильно и работало очень хорошо для меня. Я развертываю приложения в набор контейнеров LXC (читай: облегченные виртуальные машины Linux ) на Proxmox , бесплатном гипервизоре с открытым исходным кодом и отличным интерфейсом управления.

Однако недавно я заново изучил Docker и преимущества развертывания приложений с использованием контейнеров. Вот некоторые из крупных:

  • Гарантированные воспроизводимые среды. Приложение поставляется со своими зависимостями, готовыми к запуску.
  • Портативность. Предполагая, что ваша среда поддерживает среду выполнения контейнера, она поддерживает приложение.
  • Инфраструктура как код. Как и Ansible playbooks, Docker хорошо подходит для управления контейнерной средой с помощью кода, который можно отслеживать и управлять версиями.

Итак, я решил отправиться в путешествие по переходу моих плейбуков Ansible с чистого Linux на набор развертываний Kubernetes.

Тем не менее, есть еще некоторые вещи, которые мне нравятся в Proxmox, от которых я не хочу отказываться. Во-первых, возможность виртуализации физических машин (таких как мой маршрутизатор или портал управления точками доступа), которые не могут быть легко контейнеризированы. Возможность переносить «физические» установки ОС между серверами, когда мне нужно выполнять обслуживание хостов, очень полезна.

Итак, я буду устанавливать Kubernetes на Proxmox, и я хочу сделать это на контейнерах LXC.

Что мы строим и обоснование

Я собираюсь развернуть кластер Kubernetes, используя дистрибутив Rancher K3s поверх контейнеров LXC.

K3s — это облегченный дистрибутив Kubernetes производственного уровня, который упрощает процесс установки благодаря предварительно настроенным DNS, сетевым и другим инструментам из коробки. K3s также позволяет безболезненно присоединять к кластеру новых рабочих процессов. Это, в сочетании с относительно небольшим масштабом моего развертывания, делает его довольно простым выбором.

С другой стороны, контейнеры LXC могут показаться немного странным выбором. Почти во всех других статьях, которые я нашел, развертывание K8 на Proxmox делалось с использованием полнофункциональных виртуальных машин, а не контейнеров. Это, безусловно, маршрут с меньшими трениями, поскольку процедурно он аналогичен установке на физические хосты. Я выбрал контейнеры LXC по двум основным причинам:

  1. Контейнеры LXC быстрые . Мол, почти так же быстро, как голый металл. Поскольку контейнеры LXC виртуализированы на уровне ядра, они намного легче традиционных виртуальных машин. Таким образом, они загружаются почти мгновенно, работают почти с той же скоростью, что и ядро ​​хоста, и их гораздо проще переконфигурировать с большим количеством ОЗУ/дискового пространства/ядер ЦП на лету.
  2. Контейнеры LXC меньше. Поскольку контейнеры работают на ядре хоста, они должны содержать гораздо меньший набор пакетов. Это делает их требующими гораздо меньше дискового пространства из коробки (и, следовательно, упрощает их миграцию).

Итак, для начала я создам 2 контейнера: один управляющий узел и один рабочий узел.

Предпосылки

Я собираюсь предположить, что у вас (1) есть запущенный и работающий сервер Proxmox, (2) есть шаблон контейнера, доступный на Proxmox, и (3) у вас есть какой-то файловый сервер NFS.

Последнее важно, так как мы будем выделять нашим контейнерам относительно небольшой объем дискового пространства. Таким образом, любые тома, необходимые подам Kubernetes, могут быть созданы как монтирования NFS .

Вы также захотите настроить kubectlи helmинструменты на вашем локальном компьютере.

Создание контейнеров LXC

Поскольку наши контейнеры LXC должны иметь возможность запускать контейнеры Docker сами по себе, нам нужно сделать небольшую дополнительную настройку из коробки, чтобы предоставить им надлежащие разрешения.

Процесс настройки двух контейнеров практически идентичен, поэтому я пройдусь по нему только один раз.

В пользовательском интерфейсе Proxmox нажмите «Создать CT». Убедитесь, что вы установили флажок, чтобы показать дополнительные настройки.

https://res.cloudinary.com/practicaldev/image/fetch/s--xsl8hK_O--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://static.garrettmills.dev/assets/blog-images/ct-1.png

Обязательно снимите флажок «Непривилегированный контейнер».

Заполните данные контейнера. Обязательно снимите флажок «Непривилегированный контейнер». На следующем экране выберите нужный шаблон. Я использую образ Rocky Linux 8 .

https://res.cloudinary.com/practicaldev/image/fetch/s--wN_Dgdcj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://static.garrettmills.dev/assets/blog-images/ct-2.png

Я решил предоставить каждому контейнеру корневой диск размером 16 ГиБ, что более чем достаточно для работы ОС и K3, если мы не размещаем какие-либо тома на самом диске.

Значения ЦП и памяти действительно зависят от того, что у вас есть на хосте, и от рабочих нагрузок, которые вы собираетесь запускать в своем кластере K8s. Для себя я выделил 4 ядра vCPU и 4 ГБ оперативной памяти на каждый контейнер.

https://res.cloudinary.com/practicaldev/image/fetch/s--XO3yhqDf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://static.garrettmills.dev/assets/blog-images/ct-3.png

Для настройки сети обязательно установите статический IP-адрес для каждого узла. Кроме того, если вы используете определенный внутренний DNS-сервер (что я настоятельно рекомендую!), вам следует настроить его на следующей странице.

https://res.cloudinary.com/practicaldev/image/fetch/s--S-M6YyHE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://static.garrettmills.dev/assets/blog-images/ct-4.png

Наконец, на последней странице обязательно снимите флажок «Начать после создания» и нажмите «Готово». Proxmox создаст контейнер.

Дополнительная конфигурация

Теперь нам нужно настроить несколько внутренних вещей, чтобы дать нашим контейнерам надлежащие разрешения. Вам нужно подключиться по SSH к вашему хосту Proxmox в качестве rootпользователя для запуска этих команд.

в /etc/pve/lxcкаталог, вы найдете файлы с именем XXX.conf, где XXX— это идентификационные номера контейнеров, которые мы только что создали. Используя выбранный вами текстовый редактор, отредактируйте файлы для созданных нами контейнеров, добавив следующие строки:

lxc.mount.entry = /dev/kmsg dev/kmsg none defaults,bind,create=file
lxc.apparmor.profile: unconfined
lxc.cgroup.devices.allow: a
lxc.cap.drop:
lxc.mount.auto: "proc:rw sys:rw"

Примечание: Важно, чтобы контейнер был остановлен, когда вы пытаетесь отредактировать файл, иначе сетевая файловая система Proxmox не позволит вам его сохранить.

По порядку эти параметры (1) отключают AppArmor , (2) разрешают контрольной группе контейнера доступ ко всем устройствам, (3) предотвращают удаление каких-либо возможностей для контейнера и (4) монтируют /procи /sysкак чтение-запись в контейнере.

Далее нам нужно опубликовать загрузочную конфигурацию ядра в контейнере. Обычно контейнеру это не нужно, поскольку он работает с использованием ядра хоста, но Kubelet использует конфигурацию для определения различных параметров среды выполнения, поэтому нам нужно скопировать ее в контейнер. Для этого сначала запустите контейнер с помощью веб-интерфейса Proxmox, затем выполните следующую команду на хосте Proxmox:

pct push <container id> /boot/config-$(uname -r) /boot/config-$(uname -r)

Наконец, в каждом из контейнеров нам нужно убедиться, что /dev/kmsgсуществует. Kubelet использует это для некоторых функций ведения журнала, и по умолчанию его нет в контейнерах. Для наших целей мы просто назовем его псевдонимом /dev/console. В каждом контейнере создайте файл /usr/local/bin/conf-kmsg.sh со следующим содержанием:

#!/bin/sh -e
if [ ! -e /dev/kmsg ]; then
    ln -s /dev/console /dev/kmsg
fi

mount --make-rshared /

Этот скрипт символизирует ссылки /dev/consoleкак /dev/kmsgесли последнего нет. Наконец, мы настроим его для запуска при запуске контейнера с одноразовой службой SystemD. Создайте файл /etc/systemd/system/conf-kmsg.service со следующим содержанием:

[Unit]
Description=Make sure /dev/kmsg exists

[Service]
Type=simple
RemainAfterExit=yes
ExecStart=/usr/local/bin/conf-kmsg.sh
TimeoutStartSec=0

[Install]
WantedBy=default.target

Наконец, включите службу, выполнив следующее:

chmod +x /usr/local/bin/conf-kmsg.sh
systemctl daemon-reload
systemctl enable --now conf-kmsg

1: Установка Docker На Rocky linux 9

Пакет установки Docker, доступный в официальном репозитории Rocky Linux 9, может быть не самым свежим. Мы рекомендуем устанавливать Docker из официального репозитория, чтобы использовать самую актуальную версию. Как это сделать, мы покажем в этом разделе.

Сначала обновите существующий список пакетов:

sudo dnf check-update

Затем добавьте официальный репозиторий Docker:

yum install yum-utils

sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

У Docker нет специального репозитория Rocky Linux, потому что система Rocky Linux основана на CentOS и может использовать тот же репозиторий. После его добавления установите Docker, который состоит из трех пакетов:

sudo dnf install docker-ce docker-ce-cli containerd.io

После завершения установки запустите демон Docker.

sudo systemctl start docker

Убедитесь, что он запущен:

sudo systemctl status docker

Вывод должен быть примерно следующим (он должен обязательно показывать, что служба активна и работает).

docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2016-05-01 06:53:52 CDT; 1 weeks 3 days ago
     Docs: https://docs.docker.com
 Main PID: 749 (docker)

Теперь введите такую команду, чтобы сервер запускался автоматически при каждой перезагрузке сервера:

sudo systemctl enable docker

После установки Docker у вас будет доступ не только к службе Docker (демон), но и к утилите командной строки docker (или клиенту). Как использовать команду docker, мы разберем позже.

docker run -d --name=rancher-server --restart=unless-stopped -p 80:80 -p 443:443 --privileged rancher/rancher:v2.7.0

Если нужно удалить все контейнеры можно применить связку команд: docker rm $(docker ps -qa)