K8s Q A Garbage Collector

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску


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