Менеджер по выселению 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%
Другие вопросы по тегам