User Tools

Site Tools


Sidebar

Me
Здравствуйте!

Меня зовут Михаил Усик!
Я системный администратор
и наполняю эту wiki,
решая разнообразные IT-задачки.

Я всегда готов помочь Вам
наладить IT-инфраструктуру
за скромное вознаграждение!

mike@autosys.tk
+7 (977) 887-96-23

proxmox:how_to_start_kubernetes_inside_proxmox_lxc_container

Задача

Есть хост Proxmox 5.4.
Для экспериментов мне требуется периодически поднимать кластер kubernetes (на момент написания - версия 1.16.0).
Я не хочу использовать виртуальные машины, а хочу использовать контейнеры. В первую очередь из-за некоторых аппаратных ограничений (мой хост довольно слабый - Pentium J5005 и 24Gb памяти DDR4).
В качестве инструмента развертывания я использую ansible.

Настройки хоста Proxmox 5.x/6

Вот тут есть описание профиля контейнера, с которыми все должно работать. Но я пока это не применял. https://discuss.linuxcontainers.org/t/not-able-to-run-kubernetes-inside-docker-inside-lxd/4643/3

модули ядра

В /etc/modules добавляем:

overlay
aufs

и чтобы не переазгружаться выполняем:

/sbin/lsmod | /bin/grep overlay || /sbin/modprobe overlay
/sbin/lsmod | /bin/grep aufs || /sbin/modprobe aufs

Failed to start cAdvisor inotify_init: too many open files

Нужно увеличить inotify/max_user_instances
Текущее значение можно посмотреть так:

cat /proc/sys/fs/inotify/max_user_instances

Для увеличения лимита добавляем строку

fs.inotify.max_user_instances=999999

В файл /etc/sysctl.conf и применяем:

sysctl --system

Или вот одной строкой:

echo fs.inotify.max_user_instances=99999 | sudo tee -a /etc/sysctl.conf && sudo sysctl --system

Файловая система контейнера

При попытке запустить kubelet в контейнере, файловая система которого лежит просто в директории хоста, вываливается ошибка:

Failed to start ContainerManager failed to get rootfs info: failed to get device for dir "/var/lib/kubelet": could not find device with major: 0, minor: 49 in cached partitions map

Так делать нельзя. Файловая система контейнера должна лежать в каком-то контейнере, который будет смонтирован как loop-устройство(например по-умолчанию - в qcow2).

Параметры контейнеров

Запустить master-node в unprivileged контейнере пока не удалось, потому что нужен доступ к настройкам (в частности ядра memory overcommit). То есть при создании контейнера мнимаем галку unprivileged.
Объем swap - 0.

Параметры контейнера в Proxmox 5.x

К стандартным настройкам добавляем:

lxc.apparmor.profile: unconfined
lxc.cap.drop:
lxc.cgroup.devices.allow: a
lxc.mount.auto: proc:rw sys:rw

Параметры контейнера в Proxmox 6

К стандартным настройкам добавляем:

mp0: /boot,mp=/boot
mp1: /lib/modules,mp=/lib/modules
lxc.hook.autodev: sh -c "mknod -m 0644 ${LXC_ROOTFS_MOUNT}/dev/kmsg c 1 11"
lxc.apparmor.profile: unconfined
lxc.cap.drop:
lxc.cgroup.devices.allow: a
lxc.mount.auto: proc:rw sys:rw

Kubernetes CNI

В качетсве CNI можно использовать либо flannel:

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

либо kube-router:

kubectl apply -f https://raw.githubusercontent.com/cloudnativelabs/kube-router/master/daemonset/kubeadm-kuberouter.yaml

Kubernetes Dashboard Web UI

https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/#welcome-view
Установка Kubernetes Dashboard Web UI:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/aio/deploy/recommended/kubernetes-dashboard.yaml

Если мы админим кластер с машины, где есть kubectl и браузер, то для того, чтобы локально пользоваться Kubernetes Dashboard Web UI достаточно запустить:

kubectl proxy &

и консоль будет доступна по адресу: http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/.
Если необходимо иметь доступ консоли не только с локального хоста, на котором исполняется kubectl proxy, то запускаем его так:

kubectl proxy --address='0.0.0.0' --accept-hosts='^*$'

В результате, консоль будет доступна и с других хостов.
Кроме того, для доступа к консоли Kubernetes Dashboard Web UI без kubectl proxy нужно сменить тип service'а который предоставляет доступ к pod'у kubernetes-dashboard. Вместо установленного по-умолчанию ClusterIP нужно сделать NodePort:

kubectl -n kube-system patch service kubernetes-dashboard  -p '{"spec":{"type":"NodePort"}}'

В результате, dashboard будет доступен на IP-адресе master-ноды.
Это можно сделать и вручную, отредактировав service, который предоставляет доступ к pod'у kubernetes-dashboard, где в качестве .spec.type указать NodePort:

kubectl -n kube-system edit service kubernetes-dashboard

Ссылки

Discussion

Enter your comment. Wiki syntax is allowed:
K D O E P
 
proxmox/how_to_start_kubernetes_inside_proxmox_lxc_container.txt · Last modified: 2019/11/08 12:17 by admin