клиент kubernetes go смотреть ресурс только один раз - PullRequest
0 голосов
/ 20 апреля 2020

В моем приложении есть концепция, чтобы удалить JOB, а затем просто воссоздать его. Я попытался удалить задание, затем просто поспать некоторое время и попытаться воссоздать его.

, но я не убежден, что это решение не является оптимистичным c.

Итак, после того, как что-то произошло, из моего кода я буду запускать функцию в Goroutine.

вот код внутри функции.

func CreateGenerateJob() {
    err = clientset.BatchV1().Jobs("default").Delete(jobName, nil)
    if err != nil {
        logrus.Errorf("could not delete job: %v", err)
    }

    time.Sleep(60*time.Second)

    createdJob, err :=  clientset.BatchV1().Jobs("default").Create(job)
    if err != nil {
        logrus.Fatalf("could not create job: %v", err)
    }

}

Это совсем не хорошо. Но у меня была идея следить за удаленными ресурсами.

Поэтому перед удалением задания я добавил функцию наблюдения:

func CreateGenerateJob() {

    watchForTheJob(clientset)

    err = clientset.BatchV1().Jobs("default").Delete(jobName, nil)
    if err != nil {
        logrus.Errorf("could not delete job: %v", err)
    }

}

Содержание функции следующее:

func watchForTheJob(clientset kubernetes.Interface) {
    kubeInformerFactory := kubeinformers.NewSharedInformerFactory(clientset, time.Second*30)
    svcInformer := kubeInformerFactory.Batch().V1().Jobs().Informer()

    svcInformer.AddEventHandler(cache.ResourceEventHandlerFuncs{
        DeleteFunc: func(obj interface{}) {
            logrus.Infof("service deleted: %s \n", obj)
            // Now I can create the Job.
            createdJob, err :=  clientset.BatchV1().Jobs("default").Create(job)
            if err != nil {
              logrus.Fatalf("could not create job: %v", err)
            }
            logrus.Infof("job created: %s", createdJob.Name)
        },
    },)

    stop := make(chan struct{})
    defer close(stop)
    kubeInformerFactory.Start(stop)
    for {
        time.Sleep(time.Second)
    }
}

Проблема в том, что я Я не уверен, что работа действительно доступна или нет. (может ли удаление произойти или нет)

Так как я запускаю весь код этого пакета в программе.

go adapter.CreateGenerateJob()

Я хотел бы выйти из Goroutine после успешного создания задания, независимо от того, было ли задание удалено -> затем воссоздано или только создано.

это может быть решением, если при наблюдении за работой, а затем после ее создания просто выйти из события наблюдения.

Любое, решение для этого.

...