kubernetes获取node的事件列表

1 篇文章 0 订阅
1 篇文章 0 订阅

问题

如何获取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
	}

以上为个人在开发中遇到的问题和解决分享,如有错误和不足之处,还望批评指出,谢谢

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值