英文:
How can I get events messages from a pod from Kubernetes using client-go API?
问题
你可以使用client-go Kubernetes API来获取Pod的事件消息,类似于使用kubectl describe pod命令的效果。你可以通过以下步骤来实现:
- 导入必要的包:
 
import (
    "fmt"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/tools/clientcmd"
)
- 创建一个Kubernetes客户端:
 
config, err := clientcmd.BuildConfigFromFlags("", "/path/to/kubeconfig")
if err != nil {
    panic(err.Error())
}
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
    panic(err.Error())
}
- 使用客户端获取Pod的事件:
 
podName := "spark-t2f59"
namespace := "spark"
events, err := clientset.CoreV1().Events(namespace).Search(clientset.CoreV1().Events(namespace).List(context.TODO(), metav1.ListOptions{}), metav1.ObjectReference{
    Kind:      "Pod",
    Name:      podName,
    Namespace: namespace,
})
if err != nil {
    panic(err.Error())
}
for _, event := range events.Items {
    fmt.Printf("Type: %s, Reason: %s, Age: %s, From: %s, Message: %s\n", event.Type, event.Reason, event.Age, event.Source.Component, event.Message)
}
请注意,你需要将/path/to/kubeconfig替换为你的kubeconfig文件的路径。此外,你还需要根据你的需求修改podName和namespace。
这样,你就可以使用client-go获取与kubectl describe pod相同的事件输出了。
英文:
How can I get events messages from a pod, like this command using client-go Kubernetes API:
kubectl describe pod spark-t2f59 -n spark
Events:
  Type     Reason             Age   From                Message
  ----     ------             ----  ----                -------
  Warning  FailedScheduling   104s  default-scheduler   0/19 nodes are available: 15 Insufficient cpu, 19 Insufficient memory.
  Warning  FailedScheduling   104s  default-scheduler   0/19 nodes are available: 15 Insufficient cpu, 19 Insufficient memory.
  Warning  FailedScheduling   45s   default-scheduler   0/20 nodes are available: 16 Insufficient cpu, 20 Insufficient memory.
  Warning  FailedScheduling   34s   default-scheduler   0/20 nodes are available: 16 Insufficient cpu, 20 Insufficient memory.
  Normal   NotTriggerScaleUp  97s   cluster-autoscaler  pod didn't trigger scale-up (it wouldn't fit if a new node is added): 1 Insufficient memory, 1 max node group size reached
Is there a way to get the same output of events but using client-go instead of kubectl??
答案1
得分: 8
由于您知道命名空间和Pod名称,您可以执行以下操作:
package main
import (
	"context"
	"fmt"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/rest"
)
func main() {
	config, _ := rest.InClusterConfig()
	clientset, _ := kubernetes.NewForConfig(config)
	events, _ := clientset.CoreV1().Events("spark").List(context.TODO(), metav1.ListOptions{FieldSelector: "involvedObject.name=spark-t2f59", TypeMeta: metav1.TypeMeta{Kind: "Pod"}})
	for _, item := range events.Items {
		fmt.Println(item)
	}
}
英文:
Since you know the namespace and the pod name, you can do:
package main
import (
	"context"
	"fmt"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/rest"
)
func main() {
	config, _ := rest.InClusterConfig()
	clientset, _ := kubernetes.NewForConfig(config)
	events, _ := clientset.CoreV1().Events("spark").List(context.TODO(),metav1.ListOptions{FieldSelector: "involvedObject.name=spark-t2f59", TypeMeta: metav1.TypeMeta{Kind: "Pod"}})
	for _, item := range events.Items {
		fmt.Println(item)
	}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论