0 Votes
Version 2.1 by Сергей Коршунов on 2023/07/08 20:40

Hide last authors
Сергей Коршунов 1.1 1 = Rancher K3s: Kubernetes на контейнерах Proxmox =
2
3 [[# докер >>url:https://dev.to/t/docker]][[# кубернетес >>url:https://dev.to/t/kubernetes]][[# проксмокс >>url:https://dev.to/t/proxmox]][[# devops>>url:https://dev.to/t/devops]]
4
5 Уже долгое время я самостоятельно размещаю большинство своих онлайн-сервисов, таких как календарь, контакты, электронная почта, облачное хранилище файлов, мой веб-сайт и т. Д. Текущая итерация моей установки опирается на серию плейбуков Ansible, которые устанавливают все различные приложения и настраивают их для использования.
6
7 Это было действительно стабильно и работало очень хорошо для меня. Я развертываю приложения в набор контейнеров LXC (читай: [[облегченные виртуальные машины Linux >>url:https://linuxcontainers.org/lxd/]]) на [[Proxmox >>url:https://www.proxmox.com/en/]], бесплатном гипервизоре с открытым исходным кодом и отличным интерфейсом управления.
8
9 Однако недавно я заново изучил Docker и преимущества развертывания приложений с использованием контейнеров. Вот некоторые из крупных:
10
11 * Гарантированные воспроизводимые среды. Приложение поставляется со своими зависимостями, готовыми к запуску.
12 * Портативность. Предполагая, что ваша среда поддерживает среду выполнения контейнера, она поддерживает приложение.
13 * Инфраструктура как код. Как и Ansible playbooks, Docker хорошо подходит для управления контейнерной средой с помощью кода, который можно отслеживать и управлять версиями.
14
15 Итак, я решил отправиться в путешествие по переходу моих плейбуков Ansible с чистого Linux на набор развертываний Kubernetes.
16
17 Тем не менее, есть еще некоторые вещи, которые мне нравятся в Proxmox, от которых я не хочу отказываться. Во-первых, возможность виртуализации физических машин (таких как мой маршрутизатор или портал управления точками доступа), которые не могут быть легко контейнеризированы. Возможность переносить «физические» установки ОС между серверами, когда мне нужно выполнять обслуживание хостов, очень полезна.
18
19 Итак, я буду устанавливать Kubernetes на Proxmox, и я хочу сделать это на контейнерах LXC.
20
21 == Что мы строим и обоснование ==
22
23 Я собираюсь развернуть кластер Kubernetes, используя [[дистрибутив Rancher K3s >>url:https://rancher.com/docs/k3s/latest/en/]]поверх контейнеров LXC.
24
25 K3s — это облегченный дистрибутив Kubernetes производственного уровня, который упрощает процесс установки благодаря предварительно настроенным DNS, сетевым и другим инструментам из коробки. K3s также позволяет безболезненно присоединять к кластеру новых рабочих процессов. Это, в сочетании с относительно небольшим масштабом моего развертывания, делает его довольно простым выбором.
26
27 С другой стороны, контейнеры LXC могут показаться немного странным выбором. Почти во всех других статьях, которые я нашел, развертывание K8 на Proxmox делалось с использованием полнофункциональных виртуальных машин, а не контейнеров. Это, безусловно, маршрут с меньшими трениями, поскольку процедурно он аналогичен установке на физические хосты. Я выбрал контейнеры LXC по двум основным причинам:
28
29 1. **Контейнеры LXC //быстрые //. Мол, почти так же быстро, как голый металл. **Поскольку контейнеры LXC виртуализированы на уровне ядра, они намного легче традиционных виртуальных машин. Таким образом, они загружаются почти мгновенно, работают почти с той же скоростью, что и ядро ​​хоста, и их гораздо проще переконфигурировать с большим количеством ОЗУ/дискового пространства/ядер ЦП на лету.
30 1. **Контейнеры LXC меньше. **Поскольку контейнеры работают на ядре хоста, они должны содержать гораздо меньший набор пакетов. Это делает их требующими гораздо меньше дискового пространства из коробки (и, следовательно, упрощает их миграцию).
31
32 Итак, для начала я создам 2 контейнера: один управляющий узел и один рабочий узел.
33
34 == Предпосылки ==
35
36 Я собираюсь предположить, что у вас (1) есть запущенный и работающий сервер Proxmox, (2) есть шаблон [[контейнера, >>url:https://us.lxd.images.canonical.com/images/rockylinux/8/amd64/default/]]доступный на Proxmox, и (3) у вас есть какой-то файловый сервер NFS.
37
38 Последнее важно, так как мы будем выделять нашим контейнерам относительно небольшой объем дискового пространства. Таким образом, любые тома, необходимые подам Kubernetes, могут быть созданы как [[монтирования NFS >>url:https://kubernetes.io/docs/concepts/storage/volumes/#nfs]].
39
40 Вы также захотите настроить kubectlи helmинструменты на вашем локальном компьютере.
41
42 == Создание контейнеров LXC ==
43
44 Поскольку наши контейнеры LXC должны иметь возможность запускать контейнеры Docker сами по себе, нам нужно сделать небольшую дополнительную настройку из коробки, чтобы предоставить им надлежащие разрешения.
45
46 Процесс настройки двух контейнеров практически идентичен, поэтому я пройдусь по нему только один раз.
47
48 В пользовательском интерфейсе Proxmox нажмите «Создать CT». Убедитесь, что вы установили флажок, чтобы показать дополнительные настройки.
49
50 [[~[~[image: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~|~|height="574" width="778"~]~]>>url: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]]
51
52 Обязательно снимите флажок «Непривилегированный контейнер».
53
54
55 Заполните данные контейнера. Обязательно снимите флажок «Непривилегированный контейнер». На следующем экране выберите нужный шаблон. Я использую [[образ Rocky Linux 8 >>url:https://us.lxd.images.canonical.com/images/rockylinux/8/amd64/default/]].
56
57 [[~[~[image: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~|~|height="573" width="781"~]~]>>url: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]]
58
59 Я решил предоставить каждому контейнеру корневой диск размером 16 ГиБ, что более чем достаточно для работы ОС и K3, если мы не размещаем какие-либо тома на самом диске.
60
61 Значения ЦП и памяти действительно зависят от того, что у вас есть на хосте, и от рабочих нагрузок, которые вы собираетесь запускать в своем кластере K8s. Для себя я выделил 4 ядра vCPU и 4 ГБ оперативной памяти на каждый контейнер.
62
63 [[~[~[image: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~|~|height="571" width="785"~]~]>>url: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]]
64
65 Для настройки сети обязательно установите статический IP-адрес для каждого узла. Кроме того, если вы используете определенный внутренний DNS-сервер (что я настоятельно рекомендую!), вам следует настроить его на следующей странице.
66
67 [[~[~[image: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~|~|height="586" width="793"~]~]>>url: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]]
68
69 Наконец, на последней странице обязательно снимите флажок «Начать после создания» и нажмите «Готово». Proxmox создаст контейнер.
70
71 === Дополнительная конфигурация ===
72
73 Теперь нам нужно настроить несколько внутренних вещей, чтобы дать нашим контейнерам надлежащие разрешения. Вам нужно подключиться по SSH к вашему хосту Proxmox в качестве rootпользователя для запуска этих команд.
74
75 в /etc/pve/lxcкаталог, вы найдете файлы с именем XXX.conf, где XXX— это идентификационные номера контейнеров, которые мы только что создали. Используя выбранный вами текстовый редактор, отредактируйте файлы для созданных нами контейнеров, добавив следующие строки:
76
77 {{{lxc.mount.entry = /dev/kmsg dev/kmsg none defaults,bind,create=file
78 lxc.apparmor.profile: unconfined
79 lxc.cgroup.devices.allow: a
80 lxc.cap.drop:
81 lxc.mount.auto: "proc:rw sys:rw"
82 }}}
83
84 >Примечание: Важно, чтобы контейнер был остановлен, когда вы пытаетесь отредактировать файл, иначе сетевая файловая система Proxmox не позволит вам его сохранить.
85
86 По порядку эти параметры (1) отключают [[AppArmor >>url:https://www.apparmor.net/]], (2) разрешают контрольной группе контейнера доступ ко всем устройствам, (3) предотвращают удаление каких-либо возможностей для контейнера и (4) монтируют /procи /sysкак чтение-запись в контейнере.
87
88 Далее нам нужно опубликовать загрузочную конфигурацию ядра в контейнере. Обычно контейнеру это не нужно, поскольку он работает с использованием ядра хоста, но Kubelet использует конфигурацию для определения различных параметров среды выполнения, поэтому нам нужно скопировать ее в контейнер. Для этого сначала запустите контейнер с помощью веб-интерфейса Proxmox, затем выполните следующую команду на хосте Proxmox:
89
90 {{{pct push <container id> /boot/config-$(uname -r) /boot/config-$(uname -r)
91 }}}
92
Сергей Коршунов 2.1 93 Наконец, **в каждом из контейнеров **нам нужно убедиться, что /dev/kmsgсуществует. Kubelet использует это для некоторых функций ведения журнала, и по умолчанию его нет в контейнерах. Для наших целей мы просто назовем его псевдонимом /dev/console. В каждом контейнере создайте файл /usr/local/bin/conf-kmsg.sh со следующим содержанием:
Сергей Коршунов 1.1 94
95 {{{#!/bin/sh -e
96 if [ ! -e /dev/kmsg ]; then
97 ln -s /dev/console /dev/kmsg
98 fi
99
100 mount --make-rshared /
101 }}}
102
Сергей Коршунов 2.1 103 Этот скрипт символизирует ссылки /dev/consoleкак /dev/kmsgесли последнего нет. Наконец, мы настроим его для запуска при запуске контейнера с одноразовой службой SystemD. Создайте файл /etc/systemd/system/conf-kmsg.service со следующим содержанием:
Сергей Коршунов 1.1 104
105 {{{[Unit]
106 Description=Make sure /dev/kmsg exists
107
108 [Service]
109 Type=simple
110 RemainAfterExit=yes
111 ExecStart=/usr/local/bin/conf-kmsg.sh
112 TimeoutStartSec=0
113
114 [Install]
115 WantedBy=default.target
116 }}}
117
118 Наконец, включите службу, выполнив следующее:
119
120 {{{chmod +x /usr/local/bin/conf-kmsg.sh
121 systemctl daemon-reload
122 systemctl enable --now conf-kmsg
123 }}}
124
125 == ==
126
127 == 1: Установка Docker На Rocky linux 9 ==
128
129 Пакет установки Docker, доступный в официальном репозитории Rocky Linux 9, может быть не самым свежим. Мы рекомендуем устанавливать Docker из официального репозитория, чтобы использовать самую актуальную версию. Как это сделать, мы покажем в этом разделе.
130
131 Сначала обновите существующий список пакетов:
132
133 sudo dnf check-update
134
135 Затем добавьте официальный репозиторий Docker:
136
Сергей Коршунов 2.1 137
138 {{{yum install yum-utils}}}
139
Сергей Коршунов 1.1 140 sudo dnf config-manager ~-~-add-repo https:~/~/download.docker.com/linux/centos/docker-ce.repo
141
142 У Docker нет специального репозитория Rocky Linux, потому что система Rocky Linux основана на CentOS и может использовать тот же репозиторий. После его добавления установите Docker, который состоит из трех пакетов:
143
144 sudo dnf install docker-ce docker-ce-cli containerd.io
145
146 После завершения установки запустите демон Docker.
147
148 sudo systemctl start docker
149
150 Убедитесь, что он запущен:
151
152 sudo systemctl status docker
153
154 Вывод должен быть примерно следующим (он должен обязательно показывать, что служба активна и работает).
155
156 {{{docker.service - Docker Application Container Engine
157 Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
158 Active: active (running) since Sun 2016-05-01 06:53:52 CDT; 1 weeks 3 days ago
159 Docs: https://docs.docker.com
160  Main PID: 749 (docker)}}}
161
162 Теперь введите такую команду, чтобы сервер запускался автоматически при каждой перезагрузке сервера:
163
164 sudo systemctl enable docker
165
166 После установки Docker у вас будет доступ не только к службе Docker (демон), но и к утилите командной строки docker (или клиенту). Как использовать команду docker, мы разберем позже.