В этой статье в основном рассматривается процесс выполнения пода при его удалении.
задачи kube-apiserver
Обычно мы используем команду kubectl для удаления пода или напрямую вызываем интерфейс, предоставляемый apiserver через протокол http, для удаления пода. Следовательно, источником удаления Pod должен быть apiserver.
В предыдущем анализе kube-apiserver было проанализировано, что архитектура обработки http kube-apiserver использует go-restful. Среди них для удаления вызов естественноDELETEинтерфейс. Метод заключается в следующем (находится вkubernetes/staging/src/k8s.io/apiserver/pkg/endpoints/install.go下的registerResourceHandlers方法)
restfulDeleteResource
restfulDeleteResourceПродолжайте инкапсулировать обработчик и вызовитеDeleteResourceметод.DeleteResourceМетод очень длинный, но финальный вызов все равноDELETEМетоды, как показано нижеDELETEметод находится вstaging/src/k8s.io/apiserver/pkg/registry/generic/registry/store.goВниз. существуетDELETEметод, самый важныйupdateForGracefulDeletionAndFinalizersметод, основная функция этого метода — изменить некоторую внутреннюю информацию пода, по сути, изменить два поля пода:DeletionTimestampа такжеDeletionGracePeriodSeconds, который вызываетBeforeDeleteметодкубелет задачи
Анализируя код kubelet ранее, мы знаем, что kubelet отслеживает изменения apiserver через listwatch.
Способ запуска следующий:
Глубокий анализ
Мы знаем, что если удаление Pod не принудительно удаляется, это фактически элегантное удаление, то есть изящное удаление. По умолчанию это изящное время составляет 30 секунд, т.е.grace-periodвремя. В задании kube-apiserver пройтиupdateForGracefulDeletionAndFinalizersметод установлен для PodDeletionTimestampиDeletionGracePeriodSecondsДва поля, в настоящее время Pod определяется как изящное состояние. Вернитесь к коду и завершите вызовupdateForGracefulDeletionAndFinalizersПосле метода ниже приводится заключение
Все верно, реальная ситуация действительно такова, каждый раз, когда он удаляется, логика обработки аписервера прерывается. Следующий шаг — повторное знакомство с kubelet.
Когда Kubelet вызывает интерфейс удаления apiserver, будет заранее принято решение, и цепочка вызовов
canBeDeleted-->PodResourcesAreReclaimed. существуетPodResourcesAreReclaimedВ методе основная задача — определить, были ли полностью закрыты и очищены ресурсы в поде, в том числеcontainers,processes,volumesа такжеcgroup sandboxресурс.canBeDeletedМетод возвращает true, и kubelet вызывает интерфейс удаления API-сервера, чтобы снова удалить Pod. Однако, в отличие от изящного удаления, у этого вызова есть еще одинdeleteOptionsполеСуммировать
При изящном удалении подов:
1. Обработчик apiserver выполняется дважды, первый раз в основном для изменения информации о поде и установкиDeletionTimestampиDeletionGracePeriodSecondsинформация, перейдите в базу данных etcd во второй раз, чтобы удалить информацию Pod;
2. Обнаружив, что ресурсы в Pod полностью освобождены, kubelet запускает второе событие удаления, и Pod принудительно удаляется;
3. Операция DELETE kubelet фактически прослушивает событие обновления Pod.После удаления Pod выполняется операция REMOVE;
4. Поток обработки:客户端请求删除Pod-->apiserver更新Pod信息-->kubelet优雅释放Pod资源-->kubelet请求删除Pod-->apiserver删除etcd中Pod信息-->kubelet完成最终Pod的资源清理.