我正在构建一个基于sample-controller的小 k8s控制器。
我正在使用以下事件处理程序侦听 ServiceAccount 事件:
...
serviceAccountInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
AddFunc: controller.enqueueServiceAccount,
DeleteFunc: controller.enqueueServiceAccount,
})
...
func (c *Controller) enqueueServiceAccount(obj interface{}) {
var key string
var err error
if key, err = cache.MetaNamespaceKeyFunc(obj); err != nil {
utilruntime.HandleError(err)
return
}
c.workqueue.Add(key)
}
Run Code Online (Sandbox Code Playgroud)
这工作正常;我的事件正在进入并且enqueueServiceAccount()函数正在被调用。
这是我第一次接触 Golang,我不知道如何从obj.
我倾倒了对象,go-spew可以确认它有一个ObjectMeta. 我只是不确定如何将它转换为可以访问的某个对象ObjectMeta- 从那里应该很容易获得注释(在这种情况下,该对象没有任何注释,它是<nil>值之一。
(*v1.ServiceAccount)(0xc0002c1010)(&ServiceAccount{ObjectMeta:{kube-proxy kube-system /api/v1/namespaces/kube-system/serviceaccounts/kube-proxy d2013421-92c8-44ae-b6d8-202231ea557c 234 0 2021-04-29 18:40:20 +0100 BST <nil> <nil> map[eks.amazonaws.com/component:kube-proxy k8s-app:kube-proxy] map[kubectl.kubernetes.io/last-applied-configuration:{"apiVersion":"v1","kind":"ServiceAccount","metadata":{"annotations":{},"labels":{"eks.amazonaws.com/component":"kube-proxy","k8s-app":"kube-proxy"},"name":"kube-proxy","namespace":"kube-system"}}
Run Code Online (Sandbox Code Playgroud)
如何访问此对象的注释?
您可以使用MetaAccessor:
import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
)
var metaAccessor = metav1.NewAccessor()
func (c *Controller) enqueueServiceAccount(obj interface{}) {
if typed, ok := obj.(runtime.Object); ok {
annotations, err := metaAccessor.Annotations(typed)
}
}
Run Code Online (Sandbox Code Playgroud)
但通常人们倾向于使用控制器运行时。
| 归档时间: |
|
| 查看次数: |
53 次 |
| 最近记录: |