共计 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)
}
}
}
}
}
}
正文完