2

我正在使用 Golang 开发一个自定义 Kubernetes Operator,作为对基于现有 Helm Charts 生成的 Operator 的一种转变。据我了解,创建 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
    }

这……很明显不是最优的。我看不到填充诸如“图像”之类的内容或允许覆盖“资源”等内容的好方法,而这仅次于它是一个巨大的硬编码 blob(我删除了识别信息和大约 120 行)上面的规范,诸如附加卷和其他容器之类的东西)。

我希望能够从清单中的现有 YAML 文件中提取(以前与 Helm 图表和 Helm 操作符一起使用的文件),并从诸如此类的方法以 Go 需要的格式返回该文件。

我一直在互联网上搜索类似的东西,但是那里还没有很多 Go 或 k8s Operators 资源,所以我想我会在这里问。

你们有什么想法或解决方案吗?

4

0 回答 0