如何在 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 执行以下操作。
- kubectl 在 ExampleCR 上创建
- ExampleCR 上的 kubectl 更新
- 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 在管理器启动之前已注册到该方案。
我正在开发 Operator-SDK。在我的操作员控制器中,我想对 go api 模块不可用的自定义资源(例如 ExampleCR)执行 CRUD 操作
假设 ExampleCR 没有 go api(我可以访问 yaml 中的 crd 定义)。我正在观看 Deployment
对象以及每当创建或更新 Deployment
对象时。我想在我的控制器代码中对 ExampleCR 执行以下操作。
- kubectl 在 ExampleCR 上创建
- ExampleCR 上的 kubectl 更新
- 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 在管理器启动之前已注册到该方案。