07. Сборщик мусора (Garbage Collector) - Kishinskiy/Starting-with-Kubernetes GitHub Wiki
Задача сборщика мусора (Garbage Collector) в Kubernetes заключается в удалении определенных объектов, которые больше не имеют владельца. Давайте разберемся, что это значит!
Некоторые сущности (объекты) в Kubernetes могут быть владельцами других объектов. Например, набор реплик (ReplicaSet) является владельцем нескольких подов (Pods). В данном примере объекты-поды будут зависимыми от объекта-владельца (набора реплик). Каждый зависимый объект имеет поле metadata.ownerReferences, которое указывает на объект-владелец.
Чаще всего, Kubernetes автоматически устанавливает значение поля ownerReference. Начиная с версии 1.8, значение ownerReference автоматически устанавливается для объектов, созданных с помощью ReplicationController, 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) каскадном удалении объект-владелец сначала переходит в состояние “удаление в процессе” (deletion in progress). В этом состоянии выполняется следующее:
объект по-прежнему можно увидеть через REST API; устанавливается значение deletionTimestamp объекта; поле metadata.finalizers содержит значение “foregroundDeletion”. После перехода объекта-владельца в состояние “удаление в процессе” сборщик мусора (Garbage Collector) удаляет зависимые объекты. Как только будут удалены все блокирующие зависимости (объекты с ownerReference.blockOwnerDeletion=true), сборщик мусора удалит и объект-владелец.
При фоновом (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
На этом с “уборкой мусора” в кластере Kubernetes все, в следующей статье цикла рассмотрим образы.