0

我正在研究 Operator-SDK。在我的操作员控制器中,我想对 go api 模块不可用的自定义资源(例如 ExampleCR)执行 CRUD 操作

假设 ExampleCR 没有 go api(我可以访问 yaml 中的 crd 定义)。我正在观察Deployment对象以及何时Deployment创建或更新对象。我想在我的控制器代码中对 ExampleCR 执行以下操作。

  1. 在 ExampleCR 上创建 kubectl
  2. ExampleCR 上的 kubectl 更新
  3. kubectl 上 ExampleCR
4

1 回答 1

0

我能够使用 unstructured.Unstructured 类型解决这个问题。

使用以下示例,您可以在控制器 ( Ref ) 中查看 CR (ExampleCR )。

// You can also watch unstructured objects
u := &unstructured.Unstructured{}
u.SetGroupVersionKind(schema.GroupVersionKind{
    Kind:    "ExampleCR",
    Group:   "",
    Version: "version", // set version here
})
//watch for primary resource
err = c.Watch(&source.Kind{Type: u}, &handler.EnqueueRequestForObject{})
//watch for secondary resource
err = c.Watch(&source.Kind{Type: u}, &handler.EnqueueRequestForOwner{
    IsController: true,
    OwnerType:    &ownerVersion.OwnerType{}})

完成此操作后,控制器将收到对帐请求。

CRUD 操作将与我们对其他类型(例如 Pod)的操作相同。

可以使用以下方法创建对象

func newExampleCR() (*unstructured.Unstructured)
    &unstructured.Unstructured{
        Object: map[string]interface{}{
            "apiVersion": "version", //set version here
            "kind":       "ExampleCR", // set CR name here
            "metadata": map[string]interface{}{
                "name": "demo-deployment",
            },
            "spec": map[string]interface{}{
                //spec goes here
            },
        },
    }
}

可以在此处找到部署对象的完整示例

注意:在启动管理器之前,您必须确保 CRD 已在方案中注册。

于 2020-12-23T09:44:41.640 回答