Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Next revisionBoth sides next revision | ||
proxmox:how_to_start_kubernetes_inside_proxmox_lxc_container [2019/06/02 11:22] – [Параметры контейнеров] admin | proxmox:how_to_start_kubernetes_inside_proxmox_lxc_container [2021/09/14 10:38] – [Proxmox br_netfilter module absent] admin | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== Задача ====== | ||
+ | Для экспериментов мне требуется периодически поднимать кластер **kubernetes** (на момент написания - версия 1.16.0). \\ | ||
+ | Я не хочу использовать виртуальные машины, | ||
+ | В качестве инструмента развертывания я использую **ansible**. \\ | ||
+ | |||
+ | ====== Настройки хоста Proxmox 5.x/6 ====== | ||
+ | |||
+ | Вот тут есть описание профиля контейнера, | ||
+ | [[https:// | ||
+ | |||
+ | ===== модули ядра ===== | ||
+ | В **/ | ||
+ | overlay | ||
+ | aufs | ||
+ | и чтобы не переазгружаться выполняем: | ||
+ | /sbin/lsmod | /bin/grep overlay || / | ||
+ | /sbin/lsmod | /bin/grep aufs || / | ||
+ | |||
+ | ====== Параметры контейнеров ====== | ||
+ | Запустить **master**-node в **unprivileged** контейнере пока не удалось, | ||
+ | То есть при создании контейнера мнимаем галку **unprivileged**. \\ | ||
+ | Объем **swap** - 0. | ||
+ | |||
+ | ====== Параметры контейнера в Proxmox 5.x ====== | ||
+ | К стандартным настройкам добавляем: | ||
+ | < | ||
+ | lxc.cap.drop: | ||
+ | lxc.cgroup.devices.allow: | ||
+ | lxc.mount.auto: | ||
+ | |||
+ | ====== Параметры контейнера в Proxmox 6 ====== | ||
+ | К стандартным настройкам контейнера добавляем: | ||
+ | < | ||
+ | mp1: / | ||
+ | lxc.hook.autodev: | ||
+ | lxc.apparmor.profile: | ||
+ | lxc.cap.drop: | ||
+ | lxc.cgroup.devices.allow: | ||
+ | lxc.mount.auto: | ||
+ | |||
+ | ====== Параметры контейнера в Proxmox 7 ====== | ||
+ | После апгрейда до **Proxmox 7** в системе **cgroups** обновился до версии **cgroups2**. В итоге **kubelet** нормально стартовал с такими параметрами контейнера: | ||
+ | < | ||
+ | lxc.cap.drop: | ||
+ | lxc.cgroup2.devices.allow: | ||
+ | lxc.mount.auto: | ||
+ | lxc.mount.entry: | ||
+ | Также в версии Proxmox 7 используется ядро 5.11 и более новое. В нем запрещено изменения параметров **net_filter** (https:// | ||
+ | server.go: | ||
+ | conntrack.go: | ||
+ | server.go: | ||
+ | Выхода три: | ||
+ | * либо откатиться на **pve-kernel-5.10.6-1-pve** | ||
+ | * обновить **kube-proxy** (в мае 2021 в него смерджили патч, который позволяет не изменять значения, | ||
+ | * в конфиге **kube-proxy** дать параметру **conntrack-max-per-core** значение **0** - тогда **kube-proxy** будет использовать то значение, | ||
+ | |||
+ | ===== Proxmox br_netfilter module absent ===== | ||
+ | |||
+ | Также - серьезная проблема - отсутствует модуль **br_filter**. https:// | ||
+ | В качестве воркараунда можно поработать с дефолтным ядром **Debian**. \\ | ||
+ | Устанавливаем его: | ||
+ | sudo apt-get install linux-image-amd64 linux-headers-amd64 | ||
+ | Затем надо сделать это ядро дефолтным в конфиге **Grub**. \\ | ||
+ | Это ядро в меню **Grub** попало в подменю **Advanced...** \\ | ||
+ | Чтобы сделать его дефолтным надо получить **menuentry_id_option** для подменю, | ||
+ | Для подменю строку **menuentry_id_option** смотрим тут: | ||
+ | cat / | ||
+ | Для только что установленного не-PVE-ядра строку **menuentry_id_option** смотрим тут: | ||
+ | VER=`dpkg -l | grep linux-image | grep -v meta | awk {' | ||
+ | cat / | ||
+ | Дальше редактируем файлик **/ | ||
+ | # | ||
+ | GRUB_DEFAULT=" | ||
+ | И дальше выполняем: | ||
+ | sudo update-grub | ||
+ | Также прописываем автозагрузку **br_netfilter**: | ||
+ | echo br_netfilter | sudo tee -a / | ||
+ | Если на хосте используется **ZFS**, то надо установить пакет **zfs-dkms**: | ||
+ | sudo apt-get install zfs-dkms | ||
+ | Также, со стандартным ядром не работает AppArmor, поэтому чтобы контейнеры запускались в конфиге контейнера должно быть: | ||
+ | lxc.apparmor.profile: | ||
+ | |||
+ | ======= Kubernetes CNI ======= | ||
+ | В качетсве **CNI** можно использовать либо **flannel**: | ||
+ | kubectl apply -f https:// | ||
+ | либо **kube-router**: | ||
+ | kubectl apply -f https:// | ||
+ | ====== Kubernetes Dashboard Web UI ====== | ||
+ | |||
+ | [[https:// | ||
+ | Установка **Kubernetes Dashboard Web UI**:< | ||
+ | kubectl apply -f https:// | ||
+ | </ | ||
+ | |||
+ | Если мы админим кластер с машины, | ||
+ | < | ||
+ | kubectl proxy & | ||
+ | </ | ||
+ | |||
+ | и консоль будет доступна по адресу: | ||
+ | Если необходимо иметь доступ консоли не только с локального хоста, на котором исполняется **kubectl proxy**, то запускаем его так:< | ||
+ | kubectl proxy --address=' | ||
+ | </ | ||
+ | |||
+ | В результате, | ||
+ | Кроме того, для доступа к консоли **Kubernetes Dashboard Web UI** без **kubectl proxy** нужно сменить тип **service**' | ||
+ | kubectl -n kube-system patch service kubernetes-dashboard | ||
+ | В результате, | ||
+ | Это можно сделать и вручную, | ||
+ | kubectl -n kube-system edit service kubernetes-dashboard | ||
+ | |||
+ | ====== Ошибки ====== | ||
+ | |||
+ | ===== Failed to start cAdvisor inotify_init: | ||
+ | Нужно увеличить **inotify/ | ||
+ | Текущее значение можно посмотреть так: | ||
+ | cat / | ||
+ | Для увеличения лимита добавляем строку | ||
+ | fs.inotify.max_user_instances=999999 | ||
+ | В файл **/ | ||
+ | sysctl --system | ||
+ | Или вот одной строкой: | ||
+ | echo fs.inotify.max_user_instances=99999 | sudo tee -a / | ||
+ | ===== Файловая система контейнера ===== | ||
+ | При попытке запустить **kubelet** в контейнере, | ||
+ | Failed to start ContainerManager failed to get rootfs info: failed to get device for dir "/ | ||
+ | Так делать нельзя. Файловая система контейнера должна лежать в каком-то контейнере, | ||
+ | |||
+ | ====== Ссылки ====== | ||
+ | https:// | ||
+ | https:// | ||
+ | |||
+ | |||
+ | |||