目录
摘要:
记录k8s的operator-hub中的redis-operator的HandleRedisFinalizer处理
时序图:
核心函数:
Reconcile
// Reconcile is part of the main kubernetes reconciliation loop which aims
func (r *RedisReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
reqLogger := r.Log.WithValues("Request.Namespace", req.Namespace, "Request.Name", req.Name)
reqLogger.Info("Reconciling opstree redis controller")
instance := &redisv1beta1.Redis{}
err := r.Client.Get(context.TODO(), req.NamespacedName, instance)
if err != nil {
if errors.IsNotFound(err) {
return ctrl.Result{}, nil
}
return ctrl.Result{}, err
}
if err := k8sutils.HandleRedisFinalizer(instance, r.Client); err != nil {
return ctrl.Result{}, err
}
if err := k8sutils.AddRedisFinalizer(instance, r.Client); err != nil {
return ctrl.Result{}, err
}
err = k8sutils.CreateStandaloneRedis(instance)
if err != nil {
return ctrl.Result{}, err
}
err = k8sutils.CreateStandaloneService(instance)
if err != nil {
return ctrl.Result{}, err
}
reqLogger.Info("Will reconcile redis operator in again 10 seconds")
return ctrl.Result{RequeueAfter: time.Second * 10}, nil
}
HandleRedisFinalizer
// HandleRedisFinalizer finalize resource if instance is marked to be deleted
func HandleRedisFinalizer(cr *redisv1beta1.Redis, cl client.Client) error {
logger := finalizerLogger(cr.Namespace, RedisFinalizer)
if cr.GetDeletionTimestamp() != nil {
if controllerutil.ContainsFinalizer(cr, RedisFinalizer) {
if err := finalizeRedisServices(cr); err != nil {
return err
}
if err := finalizeRedisPVC(cr); err != nil {
return err
}
controllerutil.RemoveFinalizer(cr, RedisFinalizer)
if err := cl.Update(context.TODO(), cr); err != nil {
logger.Error(err, "Could not remove finalizer "+RedisFinalizer)
return err
}
}
}
return nil
}
finalizeRedisServices
// finalizeRedisServices delete Services
func finalizeRedisServices(cr *redisv1beta1.Redis) error {
logger := finalizerLogger(cr.Namespace, RedisFinalizer)
serviceName, headlessServiceName := cr.Name, cr.Name+"-headless"
for _, svc := range []string{serviceName, headlessServiceName} {
err := generateK8sClient().CoreV1().Services(cr.Namespace).Delete(context.TODO(), svc, metav1.DeleteOptions{})
if err != nil && !errors.IsNotFound(err) {
logger.Error(err, "Could not delete service "+svc)
return err
}
}
return nil
}
finalizeRedisPVC
// finalizeRedisPVC delete PVC
func finalizeRedisPVC(cr *redisv1beta1.Redis) error {
logger := finalizerLogger(cr.Namespace, RedisFinalizer)
PVCName := cr.Name + "-" + cr.Name + "-0"
err := generateK8sClient().CoreV1().PersistentVolumeClaims(cr.Namespace).Delete(context.TODO(), PVCName, metav1.DeleteOptions{})
if err != nil && !errors.IsNotFound(err) {
logger.Error(err, "Could not delete Persistent Volume Claim "+PVCName)
return err
}
return nil
}