Как читать в 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, поэтому я решил спросить здесь.
Ребята, какие идеи или решения вы нашли?