Właściciele i obiekty zależne

W Kubernetes, niektóre obiektywłaścicielami innych obiektów. Na przykład, ReplicaSet jest właścicielem zestawu Podów. Te obiekty podległe są zależnościami ich właściciela.

Własność różni się od mechanizmu etykiet i selektorów, który również używany jest przez niektóre zasoby. Na przykład, rozważmy Serwis, który tworzy obiekty EndpointSlice. Serwis używa etykiet, aby umożliwić warstwie sterowania określenie, które obiekty EndpointSlice są używane przez ten Serwis. Oprócz etykiet, każdy EndpointSlice zarządzany w imieniu Serwisu ma referencje do właściciela. Referencje do właściciela pomagają różnym częściom Kubernetesa unikać ingerowania w obiekty, którymi nie zarządzają.

Referencje właściciela w specyfikacjach obiektów

Obiekty zależne posiadają pole metadata.ownerReferences, które odnosi się do obiektu właściciela. Prawidłowe odniesienie właściciela składa się z nazwy obiektu oraz UID w tym samym namespace co obiekt zależny. Kubernetes automatycznie ustawia wartość tego pola dla obiektów, które są zależne od innych obiektów, takich jak ReplicaSets, DaemonSets, Deployments, Jobs i CronJobs oraz ReplicationControllers. Możesz również skonfigurować te relacje ręcznie, zmieniając wartość tego pola. Jednak zazwyczaj nie jest to konieczne, ponieważ Kubernetes może automatycznie zarządzać tymi relacjami.

Obiekty zależne mają również pole ownerReferences.blockOwnerDeletion, które przyjmuje wartość logiczną i kontroluje, czy konkretne zależności mogą zablokować usunięcie obiektu nadrzędnego w procesie oczyszczania (ang. garbage collection). Kubernetes automatycznie ustawia to pole na true, jeśli kontroler (na przykład kontroler Deployment) ustawia wartość pola metadata.ownerReferences. Możesz także ręcznie ustawić wartość pola blockOwnerDeletion, aby kontrolować, które obiekty zależne blokują mechanizm czyszczenia (garbage collection).

Kontroler wejścia (ang. admission controller) Kubernetesa zarządza dostępem użytkowników do zmiany tego pola dla zależnych zasobów, na podstawie uprawnień do usuwania właściciela. Chroni to przed opóźnianiem usuwania obiektów nadrzędnych przez nieuprawnionych użytkowników.

Własność i finalizatory

Gdy polecisz Kubernetesowi usunięcie zasobu, serwer API pozwala kontrolerowi zarządzającemu przetworzyć wszelkie zasady finalizatora dla tego zasobu. Finalizatory zapobiegają przypadkowemu usunięciu zasobów, które klaster może wciąż potrzebować do prawidłowego funkcjonowania. Na przykład, jeśli spróbujesz usunąć PersistentVolume, który jest nadal używany przez Pod, usunięcie nie nastąpi natychmiast, ponieważ PersistentVolume ma na sobie finalizator kubernetes.io/pv-protection. Zamiast tego, volume pozostaje w statusie Terminating do momentu, gdy Kubernetes usunie finalizator, co następuje dopiero wtedy, gdy PersistentVolume nie jest już powiązany z Podem.

Kubernetes dodaje także finalizatory do zasobu właściciela, gdy używasz kaskadowego usuwania w trybie pierwszoplanowym lub osieroconym. W przypadku usuwania pierwszoplanowego, dodaje finalizator foreground, tak aby kontroler musiał usunąć zasoby zależne, które również mają ownerReferences.blockOwnerDeletion=true przed usunięciem właściciela. Jeśli określisz politykę usuwania osieroconego, Kubernetes dodaje finalizator orphan, aby kontroler ignorował zasoby zależne po usunięciu obiektu właściciela.

Co dalej?