Настройка отдельного диска под образы контейнеров
Вы можете выделить отдельный диск под хранение образов контейнеров на каждом worker-узле. Это обезопасит следующие ресурсы системы:
-
Неиспользуемые образы от удаления сборщиком мусора (garbage collector), если в файловой системе worker-узла останется меньше 15% свободного места.
-
Запущенные поды от вытеснения, если в файловой системе worker-узла останется меньше 1% свободного места.
Представленные пороги системы Kubernetes являются значениями по умолчанию.
Настройка отдельного диска для образов контейнеров состоит из следующих этапов:
| Редактирование конфигураций контроллеров DaemonSet делается один раз в самом начале. Настройку отдельного диска для образов необходимо провести для каждого worker-узла. |
Редактирование конфигураций контроллеров DaemonSet
| Редактирование конфигураций контроллеров DaemonSet производится один раз в самом начале. |
Чтобы изменить контроллеры DaemonSet:
-
Подключитесь к кластеру.
-
Измените контроллеры DaemonSet, выполнив команды:
cat << EOF > daemonset-affinity-patch.yml spec: template: spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: marked-for-drain operator: NotIn values: - "true" EOF kubectl patch daemonsets.apps -n <namespace> vector-daemon --type=merge -p "$(cat daemonset-affinity-patch.yml)" kubectl patch daemonsets.apps -n ingress-nginx ingress-nginx-controller --type=merge -p "$(cat daemonset-affinity-patch.yml)" kubectl patch daemonsets.apps -n metallb-system metallb-speaker --type=merge -p "$(cat daemonset-affinity-patch.yml)" kubectl patch daemonsets.apps -n kube-prometheus-stack promtail --type=merge -p "$(cat daemonset-affinity-patch.yml)" kubectl patch daemonsets.apps -n kube-prometheus-stack loki-canary --type=merge -p "$(cat daemonset-affinity-patch.yml)" kubectl patch daemonsets.apps -n kube-prometheus-stack kube-prometheus-stack-prometheus-node-exporter --type=merge -p "$(cat daemonset-affinity-patch.yml)" kubectl patch daemonsets.apps -n kube-system calico-node --type=merge -p "$(cat daemonset-affinity-patch.yml)" kubectl patch daemonsets.apps -n kube-system kube-proxy --type=merge -p "$(cat daemonset-affinity-patch.yml)" kubectl patch daemonsets.apps -n kube-system nodelocaldns --type=merge -p "$(cat daemonset-affinity-patch.yml)"Здесь:
-
<namespace>— название пространства имен, в котором установлена система.
Изменение контроллеров DaemonSet позволяет приостановить создание и распределение подов этих контроллеров на worker-узле с меткой marked-for-drain. -
Настройка отдельного диска на worker-узлах
Настройка отдельного диска на worker-узлах состоит из следующих этапов:
| Представленные действия необходимо выполнить для каждого worker-узла. |
Подготовка worker-узла к настройке отдельного диска
На данном этапе происходит отключение необходимых служб и вытеснение подов на выбранном worker-узле. Для этого:
-
Подключитесь к кластеру.
-
Проверьте все поды выбранного worker-узла, выполнив команду:
kubectl get pods --field-selector spec.nodeName=<node_name> -A -o wideЗдесь:
-
<node_name>— название выбранного worker-узла.
Проверка подов необходима, чтобы обозначить, какие из них будут недоступны при их перераспределении на другие worker-узлы. Из-за этого часть функционала системы может быть недоступна на время переноса образов контейнеров на отдельный диск. -
-
Переведите выбранный worker-узел в drain-режим, выполнив команду:
kubectl drain <node_name> --delete-emptydir-dataЗдесь:
-
<node_name>— название выбранного worker-узла.
Операция drain позволяет перераспределить все поды с выбранного worker-узла.
В процессе выполнения операции worker-узел помечается как Unschedulable (непланируемый) — это предотвращает появление на worker-узле новых подов. Затем начинается процесс вытеснения (evict) подов с worker-узла. Во время этого процесса система завершает работу запущенных контейнеров.
-
-
Установите метку
marked-for-drainдля выбранного worker-узла, выполнив команду:kubectl label nodes <node_name> marked-for-drain=trueЗдесь:
-
<node_name>— название выбранного worker-узла.
-
-
Подключитесь к выбранному worker-узлу.
-
После того как Kubernetes вытеснил все поды с worker-узла, удалите под
nginx-proxy, так как он используется для взаимодействия с kube-apiserver. Для этого:-
Перенесите манифест пода в домашнюю директорию на выбранном worker-узле, выполнив команду:
sudo mv /etc/kubernetes/manifests/nginx-proxy.yml /root/Перенос файла манифеста необходим, чтобы закрыть kubelet доступ к файлу. Kubelet отслеживает статус пода nginx-proxy. Если удалить подnginx-proxy, то kubelet заново запустит его из файла манифеста. -
Удалите под
nginx-proxy, выполнив команду:kubectl delete pod -n kube-system nginx-proxy-<node_name> --forceЗдесь:
-
<node_name>— название выбранного worker-узла.
-
-
-
Остановите kubelet на worker-узле, выполнив команду:
sudo systemctl stop kubelet -
Остановите containerd на worker-узле, выполнив команду:
sudo systemctl stop containerd
Настройка отдельного диска и перенос образов контейнеров
В данном разделе приведены шаги по переносу содержимого containerd на отдельный том на примере виртуального диска, эмулирующего физическое устройство.
Чтобы настроить отдельный диск с образами контейнеров:
-
Подключитесь к кластеру.
-
Проверьте размер текущего диска, выполнив команду:
sudo fdisk -l /dev/sdaЕсли измененный размер не отображается, запустите принудительное сканирование этого диска, выполнив команду:
sudo sh -c "echo 1 > /sys/block/sda/device/rescan"После сканирования снова проверьте размер текущего диска, выполнив команду:
sudo fdisk -l /dev/sda -
Инициируйте создание нового раздела для образов контейнеров, выполнив команду:
sudo fdisk /dev/sdaПосле выполнения команды откроется утилита fdisk для управления разделами диска. В утилите создайте новый диск для образов контейнера. Для этого:
-
Создайте новый раздел диска, введя значение
nи нажав клавишу ENTER. Отобразятся поля для первичной настройки и создания раздела:-
Введите порядковый номер (partition number) нового раздела диска и нажмите клавишу ENTER.
-
Введите первый сектор (first sector) доступного пространства раздела и нажмите клавишу ENTER.
-
Введите последний сектор (last sector) доступного пространства раздела и нажмите клавишу ENTER.
-
-
Проверьте наличие нового раздела, введя значение
pи нажав клавишу ENTER. Отобразится список доступных разделов диска. -
Измените тип нового раздела на LVM, введя значение
tи нажав клавишу ENTER. Отобразятся поля для смены типа раздела:-
Введите порядковый номер (partition number) созданного раздела и нажмите клавишу ENTER.
-
Введите значение
30и нажмите клавишу ENTER. Тип созданного раздела изменится на LVM.
-
-
Проверьте, что тип корректно изменился, введя значение
pи нажав клавишу ENTER. Отобразится список разделов. В столбцеTYPEдолжно отображаться соответствующее значение. -
Сохраните изменения и закройте утилиту fdisk, введя значение
wи нажав клавишу ENTER.Чтобы вывести список доступных команд утилиты fdisk, введите значение mв командную строку и нажмите клавишу ENTER.
-
-
Создайте новую группу томов, выполнив команду:
sudo vgcreate vg_containerd /dev/<disk_name>Здесь:
-
<disk_name>— название раздела, созданного на предыдущем шаге.
Чтобы отобразить все созданные физические тома LVM, выполните команду:
sudo pvdisplayЧтобы отобразить все группы томов, выполните команду:
sudo vgdisplay -
-
Создайте логический том, выполнив команду:
sudo lvcreate -l 100%FREE -n lv_containerd vg_containerdЧтобы отобразить все логические тома, выполните команду:
sudo lvdisplay -
Отформатируйте LVM-раздел в необходимую файловую систему:
sudo mkfs.<fs_tag> /dev/vg_containerd/lv_containerdЗдесь:
-
<fs_tag>— тег файловой системы.
-
-
Создайте временную директорию для образов контейнеров, выполнив команду:
sudo mkdir -p /mnt/containerd -
Смонтируйте логический том
lv_containerdво временную директорию, выполнив команду:sudo mount /dev/vg_containerd/lv_containerd /mnt/containerd -
Проверьте размер директории с образами контейнеров, выполнив команду:
du -sh /var/lib/containerd -
Перенесите во временную директорию содержимое директории
/var/lib/containerd, выполнив команду:sudo rsync -a /var/lib/containerd/ /mnt/containerd/Процесс переноса может занять определенное время в зависимости от размера каталога и производительности диска. -
Размонтируйте временный том
/mnt/containerdи смонтируйте его в/var/lib/containerd, выполнив команду:sudo umount /mnt/containerd echo "/dev/mapper/vg_containerd-lv_containerd /var/lib/containerd <fs-tag> nodev,defaults 0 0" >> /etc/fstab mount -aЗдесь:
-
<fs_tag>— тег файловой системы.
-
Запуск служб и возвращение worker-узла в рабочее состояние
Чтобы вернуть worker-узел в рабочее состояние:
-
Подключитесь к кластеру.
-
Подключитесь к выбранному worker-узлу.
-
Запустите службу containerd, выполнив команду:
sudo systemctl start containerd -
Запустите службу kubelet, выполнив команду:
sudo systemctl start kubelet -
Верните манифест
nginx-proxyв изначальную директорию, выполнив команду:sudo mv /root/nginx-proxy.yml /etc/kubernetes/manifests/Kubelet автоматически создаст под
nginx-proxyиз файла манифеста. Дождитесь успешного запуска подаnginx-proxy. -
Снимите метку
marked-for-drainс выбранного worker-узла, выполнив команду:kubectl label nodes <node_name> marked-for-drain-Здесь:
-
<node_name>— название выбранного worker-узла.
-
-
Сделайте worker-узел доступным для назначения подов, выполнив команду:
kubectl uncordon <node_name>Здесь:
-
<node_name>— название выбранного worker-узла.
-
-
Проверьте, что все поды worker-узла корректно запустились, выполнив команду:
kubectl get pods --field-selector spec.nodeName=<node_name> -A -o wideЗдесь:
-
<node_name>— название выбранного worker-узла.
Отобразится список всех подов worker-узла. Убедитесь, что поды контроллеров DaemonSet корректно запустились после снятия метки
marked-for-drainс worker-узла.После возвращения worker-узла в рабочее состояние под
ingress-nginx-controllerможет не запуститься. Подробности по решению данной проблемы приведены в разделе Ошибки при запуске пода ingress-nginx-controller. -
Была ли полезна эта страница?