Kubernetes(简称为k8s)的资源 finalizers 是一种机制,用于控制资源对象在删除时的处理逻辑。当一个资源对象被标记为删除时,finalizer 会确保在实际删除之前执行一些特定的操作。
以下是一个使用 finalizers 的示例:
- 创建一个名为
myresource.yaml的资源定义文件,内容如下:
apiVersion: v1
kind: MyResource
metadata:
name: my-resource
finalizers:
- my-finalizer.example.com
- 应用该资源定义文件创建 Kubernetes 资源对象:
$ kubectl apply -f myresource.yaml
- 删除该资源对象:
$ kubectl delete myresource my-resource
- 在删除过程中,Kubernetes 将会调用与 finalizer 关联的处理逻辑。可以使用自定义控制器或 Webhook 来实现这个逻辑。例如,在 Go 编写的自定义控制器中可以通过编写一个 Finalize 方法来执行所需的操作:
func (c *MyResourceController) Finalize(obj *v1.MyResource) error {
// 执行必要的清理操作
// 删除 finalizer 标记
obj.Finalizers = removeString(obj.Finalizers, "my-finalizer.example.com")
// 更新资源对象状态和元数据,并提交到 API Server
_, err := c.clientset.ExampleV1().MyResources(obj.Namespace).Update(context.TODO(), obj, metav1.UpdateOptions{})
if err != nil {
return err
}
return nil
}
以上示例中,my-finalizer.example.com 是一个自定义的 finalizer 标识符。在删除资源对象时,Kubernetes 会调用控制器的 Finalize 方法来执行清理操作,并在完成后将该标识符从 finalizers 列表中移除。
通过使用 finalizers,您可以确保在删除资源对象之前执行必要的清理操作,以确保系统状态的一致性和稳定性。
内容由零声教学AI助手提供,问题来源于学员提问




