Назад | Перейти на главную страницу

Почему модули на узле, который был воссоздан после вытеснения, застревают в ContainerCreating?

У меня был модуль, созданный развертыванием на вытесняемом узле в кластере Google Kubernetes Engine. Узел был выгружен и воссоздан. Было несколько событий FailedCreatePodSandBox с жалобами:

сеть: stat / var / lib / calico / nodename: нет такого файла или каталога: убедитесь, что контейнер calico / node запущен и смонтирован / var / lib / calico /

Вышеупомянутые события кажутся временными, пока сеть Calico не будет полностью запущена на узле. Однако последняя запись о событии, упомянутая «kubectl describe», отличается:

Предупреждение FailedCreatePodSandBox 95s (x3 over 101s) kubelet, (в сочетании с аналогичными событиями): не удалось создать изолированную программную среду модуля: ошибка rpc: code = Unknown desc = не удалось настроить контейнер для песочницы «a1afa2a61b7b2260997f4b4719b9c315698d0016af47902923c сеть pod_podd_dd0016af47902923c. настроить сеть модуля "pod_name": Pod "pod_name" недействителен: spec: Forbidden: обновления модуля не могут изменять поля, кроме spec.containers[*].image, spec.initContainers[*].image, spec.activeDeadlineSeconds или spec.tolerations (только дополнения к существующим допускам)

Последнее мероприятие включало в себя всю спецификацию модуля в формате JSON. Модуль оставался в состоянии ContainerCreating в течение нескольких часов, поэтому я предположил, что он никогда не восстановится. Затем я вручную удалил модуль, и при развертывании сразу же был создан новый модуль, который быстро запустился на том же узле. Нужно ли что-то изменить в спецификации модуля для воссозданного узла?

Я попытался смоделировать приоритетное прерывание, сбросив узел, но в этом случае модуль сразу вернулся в рабочее состояние. Кажется, что хотя имя узла в обоих случаях остается неизменным, должна быть какая-то существенная разница между воссозданием вытесненного экземпляра и сбросом экземпляра без его воссоздания.

Кажется, я столкнулся с ошибкой, но я не уверен, в самом ли это Kubernetes, в версии Kubernetes от GKE или в вытеснении Google Cloud Platform. Очевидно, я не единственный человек, у которого есть эта проблема, так как https://github.com/GoogleCloudPlatform/k8s-node-termination-handler существуют. Теперь я использую k8s-node-termination-handler, и он помогает обойти проблему. Возможно, это восполнение пробела в функциональности GKE?

Проблема может быть связана не только с GKE, но и с самим Kubernetes. На странице выпуска Kubernetes на github мы видим «https://github.com/kubernetes/kubernetes/issues/62666#issue-314798540”, Который относится к удалению пакета, но имеет аналогичную ошибку, полученную вами:

 “ spec: Forbidden: pod updates may not change fields other than `spec.containers[].image`, `spec.initContainers[].image`, `spec.activeDeadlineSeconds` or `spec.tolerations` (only additions to existing tolerations)" 

Если вы снова столкнетесь с подобной проблемой, я рекомендую открыть Частный выпуск здесь здесь и укажите полную информацию об ошибке, которую вы можете получить, версию GKE и т. д.

Кстати, когда узел вытесняется, узлы удаляются и воссоздаются заново, поэтому сброс не может иметь такого же воздействия.