2 回答
TA贡献1802条经验 获得超10个赞
我最近发现了一种方法可以做到这一点,让我在这里描述一下:
快速免责声明:我使用了admission/v1,但从未使用admission/v1beta1 进行过测试,它的工作原理应该是相同的。
的数据类型admissionReview.Request.Object为runtime.RawExtension,并且提供了将 转换为 a 的k8s.io/apimachinery/pkg/runtime方法。该方法称为. 从那里,您可以轻松地转换为数据类型,该数据类型具有可以通过简单的 getter 方法访问的对象的所有字段。runtime.RawExtensionruntime.Objectruntime.Convert_runtime_RawExtension_To_runtime_Object(...)unstructured.UnstructuredMetaV1
这是一个可以让您完成此任务的代码片段:
import (
// ...
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime"
// ...
)
// ...
func dummyFunc(ar *v1.AdmissionReview) {
// ...
var obj runtime.Object
var scope conversion.Scope // While not actually used within the function, need to pass in
err := runtime.Convert_runtime_RawExtension_To_runtime_Object(&ar.Request.Object, &obj, scope)
if err != nil {
// ...
}
innerObj, err := runtime.DefaultUnstructuredConverter.ToUnstructured(obj)
if err != nil {
// ...
}
u := unstructured.Unstructured{Object: innerObj}
// Now the `u` variable has all the meta info available with simple getters.
// Sample:
labels := u.GetLabels()
kind := u.GetKind()
// etc.
// ...
}
TA贡献1906条经验 获得超3个赞
我相信你找不到你要找的东西,因为在解码对象时,Kubernetes 使用GetObjectKind并将结果与方案进行比较,以将对象转换为具体类型,而不是使用一些通用的方法并与字段交互对象的具体类型而不知道它的具体类型。
所以你可以使用反射来代替,比如:
k8sObjValue := reflect.ValueOf(admissionReview.Request.Object.Raw).Elem()
k8sObjObjectMeta := k8sObjValue.FieldByName("ObjectMeta")
annotations, ok := k8sObjObjectMeta.FieldByName("Annotations").Interface().(map[string]string)
if !ok {
panic("failed to retrieve annotations")
}
编辑:
或者更接近您的要求,转换为 ObjectMeta 对象
k8sObjValue := reflect.ValueOf(admissionReview.Request.Object.Raw).Elem()
objMeta, ok := k8sObjValue.FieldByName("ObjectMeta").Interface().(core.ObjectMeta)
if !ok {
panic("failed to retrieve object metadata")
}
- 2 回答
- 0 关注
- 203 浏览
添加回答
举报