Менеджер по выселению Kubernetes выселяет стручки самолета управления, чтобы вернуть эфемерное хранилище
Я использую Kubernetes v1.13.0. Мой мастер также работает как рабочий узел, поэтому на нем работают модули рабочей нагрузки, кроме модулей управления.
Журналы kubelet на моем мастере показывают следующие строки:
eviction_manager.go: 340] менеджер по выселению: должен выселить стручок, чтобы вернуть эфемерное хранилище eviction_manager.go:358] менеджер по выселению: pods ранжированы для выселения: kube-controller-manager-vm2_kube-system(1631c2c238e0c5117acac446b26d9f8c), kube-apiserver-vm2_kube-system(ce43eba098d219b2b6b4) -9b1 (0) b9b1 (0) b9b1 (0) b9b1 (0) b9 (b3) -bb1 (0) b9 (b3) -b6 (b3) -bb1 (0) b3 (0) b9 (0) - 0 (0) - bd (0) - 0 (0).
Как только модуль куб-аписервер выселяется, кластер становится непригодным для использования.
Что я могу сделать, чтобы это исправить? Должен ли я добавить больше эфемерной памяти? Как бы я поступил так? Что значит добавить больше места в корневой раздел на моем хосте?
Насколько я понимаю, эфемерное хранилище состоит из /var/log
а также /var/lib/kubelet
папки, которые оба попадают под корневой раздел.
df -h
на моем хосте показывает:
Используемый размер файловой системы. Используется. Используется%. /dev/vda1 39G 33G 6,2G 85% /
Таким образом, похоже, что корневому разделу осталось много памяти, и на диске нет давления. Так, что вызывает эту проблему? Некоторые из моих рабочих контейнеров, должно быть, делают что-то сумасшедшее с хранилищем, но это все еще 6G, кажется, много места.
Будет ли добавление дополнительного пространства в корневой раздел временно решить эту проблему?
kubectl describe vm2
дает следующую информацию:
Условия: Тип Состояние LastHeartbeatTime LastTransitionTime Причина Сообщение ---- ------ ----------------- --------------- --- ------ ------- MemoryPressure False Пт, 11 января 2019 21:25:43 +0000 ср, 05 дек 2018 19:16:41 +0000 KubeletHasSufficientMemory kubelet достаточно памяти доступно DiskPressure False Пт, 11 января 2019 21:25:43 +0000 пт, 11 января 2019 20:58:07 +0000 KubeletHasNoDiskPressure kubelet не имеет давления на диске PIDPressure False Пт, 11 января 2019 21:25:43 +0000 ср, 05 дек 2018 19:16:41 +0000 KubeletHasSufficientPID Kubelet имеет достаточный PID, доступный Готовый Пт, 11 января 2019 21:25:43 +0000 Чт, 06 дек. 2018 17:00:02 +0000 KubeletReady kubelet публикует состояние готовности. AppArmor включен. Емкость: процессор: 8: эфемерное хранилище: 40593708Ki largepages-1Gi: 0 largepages-2Mi: 0 память: 32946816Ki pods: 110 Возможность выделения: процессор: 8 ephemeral-storage: 37411161231 32844416Ки стручков: 110
Мне кажется, что на эфемерное хранилище оказывалось давление, и менеджер по выселению пытается освободить часть хранилища, выселяя наименее недавно использованные капсулы. Но он не должен выселять стручки плоскости управления, в противном случае кластер непригоден для использования.
В настоящее время Кубеле выселяет стручки самолета управления. Затем я пытаюсь вручную запустить аписервер и другие модули плоскости управления, добавляя и удаляя пробел в /etc/kubernetes/manifests
файлы. Это действительно запускает apiserver, но затем он снова выселяется. В идеале, Kubelet должен гарантировать, что статические /etc/kubernetes/manifests
всегда включены и правильно управляются.
Я пытаюсь понять, что здесь происходит, и как решить эту проблему, чтобы мой кластер kubernetes стал более устойчивым, и мне не нужно продолжать перезапускать сервер вручную.
1 ответ
У меня была такая же проблема, и я решил ее, изменив порог для выселения.
Смотря на /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
Я имею:
[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
# This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
# This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use
# the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file.
EnvironmentFile=-/etc/default/kubelet
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS
так что я вижу мой файл конфигурации для Kubelet /var/lib/kubelet/config.yaml
Открытие, что я изменил настройки evitionHard, чтобы быть (я думаю, что они были 10 или 15% раньше):
...
evictionHard:
imagefs.available: 1%
memory.available: 100Mi
nodefs.available: 1%
nodefs.inodesFree: 1%
...
Также есть --experimental-allocatable-ignore-eviction
( https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/) настройка, которая должна полностью отключить выселение.
Это из-за того, что ваш параметр конфигурации kubelet для вытеснения nodefs и imagefs % слишком велик, установите его ниже, тогда проблемы будут решены: Измените конфигурацию в /var/lib/kubelet/config.yaml
Определите вытеснение раздела и установите меньшее значение в процентах следующим образом:
evictionHard:
imagefs.available: 1%
memory.available: 100Mi
nodefs.available: 1%
nodefs.inodesFree: 1%