У меня был модуль, созданный развертыванием на вытесняемом узле в кластере 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 и т. д.
Кстати, когда узел вытесняется, узлы удаляются и воссоздаются заново, поэтому сброс не может иметь такого же воздействия.