Знакомство с Kubernetes. Часть 6: Сборщик мусора (Garbage Collector)
Jun 4, 2018 07:16 · 465 words · 3 minute read
Задача сборщика мусора (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
все, в следующей статье цикла рассмотрим образы.