我正在使用 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 资源,所以我想我会在这里问。
你们有什么想法或解决方案吗?