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 關注
- 283 瀏覽
添加回答
舉報