Finalizadores são chaves qualificadas por namespace que instruem o Kubernetes a aguardar até que condições específicas sejam satisfeitas antes de excluir completamente os recursos marcados para exclusão. Os finalizadores notificam os controladores para que limpem os recursos que pertenciam ao objeto excluído.
Quando você solicita ao Kubernetes a exclusão de um objeto que tem finalizadores especificados, a API do Kubernetes marca o objeto para exclusão preenchendo o campo .metadata.deletionTimestamp e retorna um código de status 202 (HTTP "Accepted"). O objeto de destino permanece em um estado de encerramento enquanto a camada de gerenciamento, ou outros componentes, executa as ações definidas pelos finalizadores. Após a conclusão dessas ações, o controlador remove os finalizadores correspondentes do objeto de destino. Quando o campo metadata.finalizers fica vazio, o Kubernetes considera a exclusão concluída e exclui o objeto.
Você pode usar finalizadores para controlar a coleta de lixo de recursos. Por exemplo, você pode definir um finalizador para limpar recursos da API ou infraestrutura relacionados antes que o controlador exclua o objeto que está sendo finalizado.
Você pode usar finalizadores para controlar a coleta de lixo de objetos, notificando os controladores para que executem tarefas específicas de limpeza antes de excluir o recurso de destino.
Os finalizadores geralmente não especificam o código a ser executado. Em vez disso, costumam ser listas de chaves em um recurso específico, semelhantes às anotações. O Kubernetes especifica alguns finalizadores automaticamente, mas você também pode especificar seus próprios finalizadores.
Ao criar um recurso usando um arquivo de manifesto, você pode especificar finalizadores no campo metadata.finalizers. Quando você tenta excluir o recurso, o servidor de API que processa a solicitação de exclusão identifica os valores no campo finalizers e executa as seguintes ações:
metadata.deletionTimestamp com o horário em que você iniciou a exclusão.metadata.finalizers.202 (HTTP "Accepted").O controlador que gerencia esse finalizador detecta a atualização do objeto que define o campo metadata.deletionTimestamp, indicando que a exclusão do objeto foi solicitada. O controlador então tenta satisfazer os requisitos dos finalizadores especificados para esse recurso. Sempre que uma condição de um finalizador é satisfeita, o controlador remove a chave correspondente do campo finalizers do recurso. Quando o campo finalizers fica vazio, um objeto com o campo deletionTimestamp definido é excluído automaticamente. Você também pode usar finalizadores para impedir a exclusão de recursos não gerenciados.
Um exemplo comum de finalizador é kubernetes.io/pv-protection, que impede a exclusão acidental de objetos PersistentVolume. Quando um objeto PersistentVolume está em uso por um Pod, o Kubernetes adiciona o finalizador pv-protection. Se você tentar excluir o PersistentVolume, ele entra no estado Terminating, mas o controlador não consegue excluí-lo porque o finalizador existe. Quando o Pod deixa de usar o PersistentVolume, o Kubernetes remove o finalizador pv-protection, e o controlador exclui o volume.
Quando você exclui um objeto usando DELETE, o Kubernetes adiciona o registro de data e hora da exclusão desse objeto e, em seguida, começa imediatamente a restringir alterações no campo .metadata.finalizers do objeto, que agora está com a exclusão pendente. Você pode remover finalizadores existentes (excluindo uma entrada da lista finalizers), mas não pode adicionar um novo finalizador. Você também não pode modificar o campo deletionTimestamp de um objeto depois que ele é definido.
Após a solicitação de exclusão, você não pode restaurar esse objeto. A única opção é excluí-lo e criar um novo objeto semelhante.
example.com/finalizer-name. O Kubernetes exige esse formato; o servidor de API rejeita operações de escrita em objetos quando a alteração usa nomes não qualificados para qualquer finalizador personalizado.Assim como as labels, as referências de proprietário descrevem os relacionamentos entre objetos no Kubernetes, mas são usadas para uma finalidade diferente. Quando um controlador gerencia objetos como Pods, ele usa labels para acompanhar alterações em grupos de objetos relacionados. Por exemplo, quando um Job cria um ou mais Pods, o controlador de Job aplica labels a esses Pods e acompanha alterações em quaisquer Pods no cluster com a mesma label.
O controlador de Job também adiciona referências de proprietário a esses Pods, apontando para o Job que os criou. Se você excluir o Job enquanto esses Pods estiverem em execução, o Kubernetes usa as referências de proprietário (e não as labels) para determinar quais Pods no cluster precisam de limpeza.
O Kubernetes também processa finalizadores quando identifica referências de proprietário em um recurso marcado para exclusão.
Em algumas situações, os finalizadores podem bloquear a exclusão de objetos dependentes, o que pode fazer com que o objeto proprietário marcado para exclusão permaneça por mais tempo do que o esperado sem ser completamente excluído. Nessas situações, você deve verificar os finalizadores e as referências de proprietário no objeto proprietário e nos objetos dependentes para identificar a causa do problema.