[Jugar con client-go] Administrar la eliminación de recursos en Kubernetes: Finalizer y DeletionTimestamp

Tabla de contenido

fondo

uso

lograr

Resumir


fondo

En Kubernetes, el controlador es responsable de administrar los objetos de recursos para garantizar que siempre estén en el estado deseado. Cuando es necesario eliminar el objeto de recurso, Finalizer y DeletionTimestamp son dos campos importantes que pueden ayudar al controlador a administrar de manera segura la eliminación del objeto de recurso.

Un Finalizer es un mecanismo para realizar ciertas operaciones antes de eliminar un objeto de recurso. Por ejemplo, operaciones de limpieza antes de eliminar objetos de recursos. La lista de finalizadores se implementa como un conjunto de cadenas especificadas en el campo metadata.finalizers del objeto de recurso. Kubernetes agrega Finalizadores a la lista de Finalizadores cuando un objeto de recurso se marca para su eliminación. Una vez que se hayan ejecutado todos los Finalizadores, Kubernetes eliminará el objeto.

DeletionTimestamp es una marca de tiempo que se utiliza para marcar la hora de eliminación del objeto de recurso. Kubernetes establece una marca de tiempo en el campo DeletionTimestamp cuando se marca un objeto de recurso para su eliminación. Una vez que un objeto de recurso se marca para su eliminación, ya no se puede modificar ni actualizar.

uso

Finalizer y DeletionTimestamp están estrechamente relacionados. Cuando se marca un objeto de recurso para su eliminación, Kubernetes establece una marca de tiempo en el campo DeletionTimestamp y agrega Finalizadores a la lista de Finalizadores. Una vez que se han ejecutado todos los finalizadores, Kubernetes elimina el objeto y establece el campo DeletionTimestamp en nulo.

lograr

Aquí hay una muestra del uso de Finalizer y DeletionTimestamp del objeto de recursos de implementación:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  finalizers:
  - my-finalizer
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest

En el ejemplo anterior, la lista de finalizadores del objeto de recursos de implementación contiene un finalizador denominado my-finalizer. Cuando se elimina un objeto de recurso de implementación, Finalizer my-finalizer realizará algunas operaciones de limpieza, como eliminar el objeto de recurso ConfigMap asociado.

const (
	myFinalizerName = "my-finalizer"
)

myFinalizerNamees una constante de cadena definida en el código de ejemplo para representar el nombre del finalizador agregado al objeto de recurso de implementación. Puede configurar el nombre del finalizador según sus necesidades, solo asegúrese de usar el mismo nombre al agregar y eliminar finalizadores. En el código de ejemplo, el nombre de Finalizer es my-finalizer.

El siguiente es un ejemplo del proceso de reconciliación de Controller, que demuestra el uso de Finalizer y DeletionTimestamp:

func (c *Controller) reconcile(ctx context.Context, deployment *appsv1.Deployment) error {
	// Check if the object is being deleted
	if !deployment.ObjectMeta.DeletionTimestamp.IsZero() {
		// The object is being deleted
		if containsString(deployment.ObjectMeta.Finalizers, myFinalizerName) {
			// Run finalization logic
			if err := c.finalizeDeployment(ctx, deployment); err != nil {
				return err
			}
			// Remove the finalizer
			deployment.ObjectMeta.Finalizers = removeString(deployment.ObjectMeta.Finalizers, myFinalizerName)
			if _, err := c.kubeClient.AppsV1().Deployments(deployment.Namespace).Update(ctx, deployment, metav1.UpdateOptions{}); err != nil {
				return err
			}
		}
		return nil
	}

	// The object is not being deleted
	if !containsString(deployment.ObjectMeta.Finalizers, myFinalizerName) {
		// Add finalizer
		deployment.ObjectMeta.Finalizers = append(deployment.ObjectMeta.Finalizers, myFinalizerName)
		if _, err := c.kubeClient.AppsV1().Deployments(deployment.Namespace).Update(ctx, deployment, metav1.UpdateOptions{}); err != nil {
			return err
		}
	}

	// Handle normal reconcile logic here
	// ...
}

func (c *Controller) finalizeDeployment(ctx context.Context, deployment *appsv1.Deployment) error {
	// Perform finalization logic, such as deleting related ConfigMaps
	// ...
	return nil
}

func containsString(strs []string, str string) bool {
	for _, s := range strs {
		if s == str {
			return true
		}
	}
	return false
}

func removeString(strs []string, str string) []string {
	newStrs := []string{}
	for _, s := range strs {
		if s != str {
			newStrs = append(newStrs, s)
		}
	}
	return newStrs
}


En el ejemplo anterior, cuando el objeto de recurso de implementación se marca para su eliminación, la función de conciliación verifica si el finalizador my-finalizer está incluido en la lista de finalizadores del objeto de recurso de implementación. Si está incluida, ejecute la lógica de limpieza en la función finalizarDeployment. Una vez completada la lógica de limpieza, el finalizador my-finalizer se elimina de la lista de finalizadores. Finalmente, actualice el objeto de recurso de implementación mediante la API de Kubernetes para asegurarse de que la lista de finalizadores se actualice correctamente.

Si el objeto de recurso de implementación está marcado para su eliminación, pero la lista de finalizadores no contiene my-finalizer Finalizer, la función de reconciliación agregará my-finalizer Finalizer a la lista de finalizadores para garantizar que la lógica de limpieza se ejecute correctamente.

Resumir

Finalizer y DeletionTimestamp son mecanismos importantes para administrar la eliminación de recursos en Kubernetes. Un controlador puede usar Finalizer y DeletionTimestamp para administrar de manera segura la eliminación de objetos de recursos y realizar algunas operaciones de limpieza si es necesario. Al tratar con objetos de recursos, es importante tener en cuenta la función de Finalizer y DeletionTimestamp y asegurarse de utilizarlos correctamente para evitar la eliminación accidental de objetos de recursos.
 

Supongo que te gusta

Origin blog.csdn.net/kingu_crimson/article/details/129928445
Recomendado
Clasificación