问题
如何获取kubernetes集群node的事件列表?
解决思路
阅读api-server和kubectl源码解决了问题
api-server
https://github.com/kubernetes/kubernetes/blob/master/pkg/kubelet/kubelet.go#L446
由代码可知,node在存储的时候是一types.UID(nodeName)作为UID的
// TODO: get the real node object of ourself,
// and use the real node name and UID.
// TODO: what is namespace for node?
nodeRef := &v1.ObjectReference{
Kind: "Node",
Name: string(nodeName),
UID: types.UID(nodeName),
Namespace: "",
}
kubectl
https://github.com/kubernetes/kubernetes/blob/master/staging/src/k8s.io/kubectl/pkg/describe/describe.go#L3255
由代码可知,kubectl在获取node事件的时候,是将ref.Name作为ref.UID从而查找事件列表的
var events *corev1.EventList
if describerSettings.ShowEvents {
if ref, err := reference.GetReference(scheme.Scheme, node); err != nil {
klog.Errorf("Unable to construct reference to '%#v': %v", node, err)
} else {
// TODO: We haven't decided the namespace for Node object yet.
ref.UID = types.UID(ref.Name)
events, _ = d.CoreV1().Events("").Search(scheme.Scheme, ref)
}
}
最终解决
构造同kubectl的获取方式
node, err := client.CoreV1().Nodes().Get(name, metav1.GetOptions{})
if err != nil {
log.Errorf("fetch node error: %v", err)
handleError(c, 500, err)
return
}
ref, err := reference.GetReference(scheme.Scheme, node)
if err != nil {
log.Errorf("Unable to construct reference to '%#v': %v", node, err)
handleError(c, 500, err)
return
}
ref.UID = types.UID(ref.Name)
eventList, err := client.CoreV1().Events(metav1.NamespaceAll).Search(scheme.Scheme, ref)
if err != nil {
log.Errorf("failed to get events: %v", err)
handleError(c, 500, err)
return
}
以上为个人在开发中遇到的问题和解决分享,如有错误和不足之处,还望批评指出,谢谢