K8s Q A Garbage Collector
Garbage Collector
Garbage Collector в Kubernetes заключается в удалении определенных объектов, которые больше не имеют владельца.
Некоторые сущности (объекты) в Kubernetes могут быть владельцами других объектов.
Например, ReplicaSet является владельцем нескольких Pods
В данном примере объекты-поды будут зависимыми от объекта-владельца.
Каждый зависимый объект имеет поле metadata.ownerReferences, которое указывает на объект-владелец.
Чаще всего, Kubernetes автоматически устанавливает значение поля ownerReference.
Начиная с версии 1.8, значение ownerReference автоматически устанавливается для объектов, созданных с помощью:
- ReplicaSet
- StatefulSet
- DaemonSet
- Deployment
- Job
- CronJob.
Есть возможность самостоятельно указать отношения между объектами-владельцами и зависимыми объектами вручную, установив поле ownerReference при описании манифеста в yaml-файле.
Рассмотрим конкретный пример. Конфигурационный файл (манифест) для набора реплик из трех элементов выглядит так:
apiVersion: extensions/v1beta1 kind: ReplicaSet metadata: name: my-repset spec: replicas: 3 selector: matchLabels: pod-is-for: garbage-collection-example template: metadata: labels: pod-is-for: garbage-collection-example spec: containers: - name: nginx image: nginx
Сохраним данное описание в файле my-repset.yaml и запустим его в кластере Kubernetes командой:
kubectl create -f my-repset.yaml
Получим информацию о запущенных подах в кластере (вывод сильно сокращен):
kubectl get pods --output=yaml
apiVersion: v1 kind: Pod metadata: ... ownerReferences: - apiVersion: extensions/v1beta1 controller: true blockOwnerDeletion: true kind: ReplicaSet name: my-repset uid: d9607e19-f88f-11e6-a518-42010a800195 ...
При удалении объекта-владельца есть возможность автоматически удалять зависимые объекты - такое удаление называется каскадным удалением.
Существует также два режима каскадного удаления:
- фоновое (background)
- приоритетное (foreground)
Если при удалении объекта-владельца зависимые объекты не удаляются автоматически, то они становятся осиротевшими (orphaned).
foreground
При приоритетном (foreground) каскадном удалении объект-владелец сначала переходит в состояние “удаление в процессе” (deletion in progress). В этом состоянии выполняется следующее:
объект по-прежнему можно увидеть через REST API; устанавливается значение deletionTimestamp объекта; поле metadata.finalizers содержит значение “foregroundDeletion”. После перехода объекта-владельца в состояние “удаление в процессе” сборщик мусора (Garbage Collector) удаляет зависимые объекты. Как только будут удалены все блокирующие зависимости (объекты с ownerReference.blockOwnerDeletion=true), сборщик мусора удалит и объект-владелец.
background
При фоновом (background) каскадном удалении Kubernetes немедленно удаляет объект-владелец, а сборщик мусора (Garbage Collector) удаляет зависимые объекты в фоновом режиме.
Управлять политикой каскадного удаления можно изменяя поле propagationPolicy в аргументе deleteOptions при удалении объекта. Допустимые значения данного поля - “Orphan”, “Foreground” или “Background”. Пример удаления зависимых объектов в фоновом режиме:
kubectl proxy --port=8080 curl -X DELETE localhost:8080/apis/extensions/v1beta1/namespaces/default/replicasets/my-repset \ -d '{"kind":"DeleteOptions","apiVersion":"v1","propagationPolicy":"Background"}' \ -H "Content-Type: application/json"
Пример удаления зависимых объектов в приоритетном режиме:
kubectl proxy --port=8080 curl -X DELETE localhost:8080/apis/extensions/v1beta1/namespaces/default/replicasets/my-repset \ -d '{"kind":"DeleteOptions","apiVersion":"v1","propagationPolicy":"Foreground"}' \ -H "Content-Type: application/json"
Оставить “осиротевшие” зависимости можно так:
kubectl proxy --port=8080 curl -X DELETE localhost:8080/apis/extensions/v1beta1/namespaces/default/replicasets/my-repset \ -d '{"kind":"DeleteOptions","apiVersion":"v1","propagationPolicy":"Orphan"}' \ -H "Content-Type: application/json"
Утилита kubectl также поддерживает каскадное удаление. Чтобы автоматически удалить зависимые объекты с помощью kubectl нужно использовать параметр --cascade со значением true (установлено по умолчанию).
Не удалять (оставить) зависимые объекты в кластере можно так:
kubectl delete replicaset my-repset --cascade=false