如何在 go api 不可用的第 3 方自定义资源上执行 CRUD

How to perform CRUD on 3rd-party Custom Resource for which go api is not available

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

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

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

我能够使用 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
            },
        },
    }
}

部署对象的完整示例here

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