Как читать в YAML для создания объектов в Kubernetes Go Operator вместо жесткого кодирования?

Я работаю над пользовательским оператором Kubernetes на Голанге, так как он отошел от оператора, сгенерированного на основе существующих схем шлемов. Как я понимаю, вы можете создать Pod (или Job в примере, которым я поделюсь):

func returnJob(cr *myApi.MyCRObject) *batchv1.Job {
    return &batchv1.Job{
        ObjectMeta: metav1.ObjectMeta{
            Name: cr.Name,
            Namespace: cr.Namespace,
        },
        Spec: batchv1.JobSpec{
            BackOffLimit: 0,
            Template: apiv1.PodTemplateSpec{
                ObjectMeta: metav1.ObjectMeta{
                    Name: cr.Name
                },
                Spec: apiv1.PodSpec{
                    RestartPolicy: "Never",
                    ServiceAccountName: "",
                    SecurityContext: apiv1.SecurityContext{
                        RunAsUser: "",
                        FsGroup: ""
                    },
                    ImagePullSecrets: apiv1.ImagePullSecrets{
                        Name: ""
                    },
                    Volumes: []apiv1.Volumes{
                        {
                            Name: "config",
                            ConfigMap: apiv1.ConfigMap{
                                Name: cr.Name + "-config"
                            }
                        }
                    },
                    Containers: []apiv1.Container{
                        {
                            Name:  "container",
                            Image: "prefix/image:tag",
                            ImagePullPolicy: "Always",
                            WorkingDir: "installdir",
                            SecurityContext: apiv1.SecurityContext{
                                RunAsUser: "",
                                FsGroup: ""
                            },
                            Env: []apiv1.Env{
                                {
                                    Name: "KEY",
                                    Value: "VAL"
                                },
                                {
                                    Name: "NAME",
                                    Value: cr.Name
                                }
                            }
                            Command: []string{
                                "mycommand",
                                "-x"
                            },
                            Resources: apiv1.Resources{
                                Requests: apiv1.Requests{
                                    Cpu: 1,
                                    Memory: "1G"
                                },
                                Limits: apiv1.Limits{
                                    Cpu: 1,
                                    Memory: "1G"
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

Затем в другом месте вызова Reconcile задание фактически создается в Kubernetes:

    job := returnJob(instance)

    // Set instance as the owner and controller
    if err := controllerutil.SetControllerReference(instance, job, r.scheme); err != nil {
        return reconcile.Result{}, err
    }

    // Check if this Job already exists
    found := &batchv1.Job{}
    err = r.client.Get(context.TODO(), types.NamespacedName{Name: job.Name, Namespace: job.Namespace}, found)
    if err != nil && errors.IsNotFound(err) {
        reqLogger.Info("Creating a new Job", "Job.Namespace", job.Namespace, "Job.Name", job.Name)
        err = r.client.Create(context.TODO(), job)
        if err != nil {
            return reconcile.Result{}, err
        }

        // Job created successfully - don't requeue
        return reconcile.Result{}, nil
    } else if err != nil {
        return reconcile.Result{}, err
    }

Это... явно не оптимально. Я не могу найти отличный способ заполнить такие вещи, как "Изображение" или разрешить переопределения для "Ресурсов" и т. Д., И это все, во-вторых, это массивный хард-кодированный шарик (я удалил информацию идентификации и около 120 строк из спецификация выше, такие вещи, как дополнительные объемы и другие контейнеры).

Я хотел бы просто иметь возможность извлечь из существующего YAML-файла в манифесте (что ранее использовалось с диаграммами рулевого управления и операторами рулевого управления) и вернуть его в формате Go, необходимом из такого метода, как этот.

Я искал в интернете что-то вроде этого, но пока просто не так много ресурсов Go или k8s Operators, поэтому я решил спросить здесь.

Ребята, какие идеи или решения вы нашли?

0 ответов

Другие вопросы по тегам