记一次 velero 生产还原事故

共计 1624 个字符,预计需要花费 5 分钟才能阅读完成。

事故:

集群在迁移两周后,机房因为供电不足,断电。导致数据被重新还原。

导致原因:

Velero在还原成功之后,会给恢复成功的pod加一个initContainer,会导致下次pod在没有重建的情况下发生重启异常。因此在还原成功之后,需要对应用进行清理,防止下次集群异常导致,数据被还原的问题。因此需要下面代码对恢复的容器进行重建,清理initContainers

代码:

/*
Copyright © 2024 NAME HERE <EMAIL ADDRESS>
*/
package main

import (
    "context"
    "fmt"
    "log"
    "strings"

    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/tools/clientcmd"
)

func main() {
    config, err := clientcmd.BuildConfigFromFlags("", clientcmd.RecommendedHomeFile)
    if err != nil {
        log.Fatalf("Error building kubeconfig: %s", err.Error())
    }

    // Create a new clientset which includes all the main Kubernetes APIs
    clientset, err := kubernetes.NewForConfig(config)
    if err != nil {
        log.Fatalf("Error creating Kubernetes client: %s", err.Error())
    }

    // Get the list of all namespaces
    namespaces, err := clientset.CoreV1().Namespaces().List(context.TODO(), metav1.ListOptions{})
    if err != nil {
        log.Fatalf("Error listing namespaces: %s", err.Error())
    }

    // Iterate over each namespace
    for _, ns := range namespaces.Items {
        namespace := ns.Name

        // Get the list of all pods in the current namespace
        pods, err := clientset.CoreV1().Pods(namespace).List(context.TODO(), metav1.ListOptions{})
        if err != nil {
            log.Fatalf("Error listing pods in namespace %s: %s", namespace, err.Error())
        }

        // Iterate over each pod and check the conditions
        for _, pod := range pods.Items {
            if len(pod.Spec.InitContainers) > 0 {
                for _, c := range pod.Spec.InitContainers {
                    if strings.Contains(c.Image, "velero/velero-restore-helper") {
                        // Delete the pod
                        err := clientset.CoreV1().Pods(namespace).Delete(context.TODO(), pod.Name, metav1.DeleteOptions{})
                        if err != nil {
                            log.Fatalf("Error deleting pod %s in namespace %s: %s", pod.Name, namespace, err.Error())
                        }
                        fmt.Printf("Deleted pod %s in namespace %s\n", pod.Name, namespace)
                    }
                }
            }
        }
    }
}
正文完
 0
评论(没有评论)