无论类型如何,反序列化ObjectMeta

eli*_*rar 8 go kubernetes

TL; DR:如何在不事先metav1.ObjectMeta知道k8s API对象的情况下灵活地对其进行解码并检查其顶层结构Kind


我正在编写一个准入控制器端点,该端点根据字段将metav1.AdmissionReview对象的Request.Object.Raw字段解组为具体的对象Request.Kind-例如

if kind == "Pod" {
    var pod core.Pod
    // ...
    if _, _, err := deserializer.Decode(admissionReview.Request.Object.Raw, nil, &pod); err != nil {
        return nil, err
    }

    annotations := pod.ObjectMeta.Annotations
    // inspect/validate the annotations...
Run Code Online (Sandbox Code Playgroud)

这需要map[kind]corev1.Object预先知道所有可能的类型,或者要求用户提供我们可以使用的更灵活的类型。

我想实现的目标更接近:

var objMeta core.ObjectMeta
if _, _, err := deserializer.Decode(admissionReview.Request.Object.Raw, nil, &objMeta); err != nil {
        return nil, err
}

// if objMeta is populated, validate the fields, else
// assume it is an object that does not define an ObjectMeta
// as part of its schema.
Run Code Online (Sandbox Code Playgroud)

这可能吗?k8s API涉及面非常广泛,对于没有相关示例的现有技术,我已经对metav1 godoc,corev1 godoc和https://cs.k8s.io进行了爬网。

我找到的最接近的可能是ObjectMetaAccessor接口,但是我需要从AdmissionReview.Request.Object(type runtime.RawExtension)到runtime.Object第一个。

Nep*_*cen 0

看来有两种可能:

  1. 要么该字段Object应该已经包含正确的对象实例,使用 Go 客户端时,请在此处检查代码。
  2. 尝试使用此处的转换器