使用操作员更新自定义资源 (CR) 的最佳方法

问题描述 投票:0回答:1

我开发了一个监控我开发的 CR 的操作员,假设它的类型是 MyCustomResource1。然后,它基本上执行任何操作员所做的操作,在协调循环中,它使当前集群状态更接近所需状态。

现在,在我的 CR 规范中,有一个像这样的字段

elastic_configuration:
    cpu: 2
    memory: 4Gi

CR 作为协调循环的一部分,确保出现具有 N 个 Pod 的 Elasticsearch 集群,内存和 CPU 字段分别由字段 elastic_configuration.cpuelastic_configuration.memory 确定。

现在 K8S 中实际的 Elasticsearch 集群由 ECK 操作员启动(它监视自己的 Elasticsearch 类型的 CR),但我希望内存和 CPU 的值成为 MyCustomResource1 规范的一部分

每当用户想要增加 Elasticsearch pod 的 CPU 和内存时,他们应该编辑我的 CR 中的 elastic_configuration.cpuelastic_configuration.memory 字段的值。 我编写的运算符在其协调循环中将识别这些值已更改,并将更新由 ECK 运算符监视的 Elasticsearch 资源规范的相应字段。

问题是我的运营商更新 CR 的最佳方式是什么?

网上最流行的解决方案建议使用非结构化对象,但我发现重复将所有内容转换为map[string]interface{},然后将其转换为某种所需的类型有点乏味。

我想到的另一个解决方案是,因为我使用的是 ECK 版本 2.13.0,所以我可以 克隆整个存储库,或者复制代表 Elasticsearch 资源的相关结构(当然是从 2.13.0 开始), 更新我的操作员协调循环中的结构字段,然后通过某些 K8S 客户端以某种方式使用该结构来更新 CR,我知道我在这里的细节很少,但这是一个高级想法,我想到了一个,但我'我不确定是否可以实施)

TLDR;以编程方式更新自定义资源(例如 Go 中 K8S 中的 Elasticsearch)的正确方法是什么?

elasticsearch kubernetes
1个回答
0
投票

ECK 运算符 是一个普通的 Go Kubebuilder 运算符。 这意味着可以导入其 API 类型。 只要他们在您的计划中注册,您就可以与他们正常互动。

在您的

main.go
文件中,将其与其他方案初始化一起放置

import elasticsearchv1 "github.com/elastic/cloud-on-k8s/v2/pkg/apis/elasticsearch/v1"

func init() {
    utilruntime.Must(elasticsearchv1.AddToScheme(scheme))

    utilruntime.Must(yourgroupv1.AddToScheme(scheme))
    // +kubebuilder:scaffold:scheme
}

然后在协调器中,您可以正常使用此类型与(控制器运行时风格)Kubernetes 运算符。

func (r *YourReconciler) updateElasticSearch(ctx context.Context, obj *yourgroupv1.Object) error {
    es := &elasticsearchv1.Elasticsearch{}
    name := types.NamespacedName{
        Namespace: obj.GetNamespace(),
        Name: obj.GetName()  // this will be the name of the Elasticsearch object, change if needed
    }
    err := r.Get(ctx, name, es)
    if err != nil {
        return err
    }
    ...
    err = r.Update(ctx, es)
    if err != nil {
        return err
    }
}

这与您与任何核心 Kubernetes API 对象交互的方式相同,但您需要首先将它们导入控制器运行时环境。

此处有一项强制性法律说明。 ECK 操作员许可证 是专门针对 Elasticsearch 的非标准定制许可证;它不是“标准”开源许可证。 将其作为库纳入您的运营商将带来一些义务,并且“限制”下的第一段可能适用于您。 请咨询您当地的法律团队。 (很多东西都是 Apache 或 BSD 许可的,这些许可更好理解。)

© www.soinside.com 2019 - 2024. All rights reserved.