в kubernetes

Знакомство с Kubernetes. Часть 6: Сборщик мусора (Garbage Collector)


Задача сборщика мусора (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

Добавить комментарий