From f873cf317fd7ff511702c35aa012b293ec7e4b38 Mon Sep 17 00:00:00 2001 From: AlexsJones Date: Wed, 22 Mar 2023 15:13:34 +0000 Subject: [PATCH 1/3] reads the event stream to correlate against OOMKill events Signed-off-by: AlexsJones --- pkg/analyzer/analyzer.go | 14 ++++++++++++++ pkg/analyzer/events.go | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 pkg/analyzer/events.go diff --git a/pkg/analyzer/analyzer.go b/pkg/analyzer/analyzer.go index 1e504a5..5610a24 100644 --- a/pkg/analyzer/analyzer.go +++ b/pkg/analyzer/analyzer.go @@ -47,6 +47,18 @@ func RunAnalysis(ctx context.Context, client *kubernetes.Client, aiClient *ai.Cl failureDetails = append(failureDetails, containerStatus.State.Waiting.Message) brokenPods[fmt.Sprintf("%s/%s", pod.Namespace, pod.Name)] = failureDetails } + // This represents a container that is still being created or blocked due to conditions such as OOMKilled + if containerStatus.State.Waiting.Reason == "ContainerCreating" && pod.Status.Phase == "Pending" { + + // parse the event log and append details + evt, err := FetchLatestPodEvent(ctx, client, &pod) + if err != nil { + continue + } + + failureDetails = append(failureDetails, evt.Message) + brokenPods[fmt.Sprintf("%s/%s", pod.Namespace, pod.Name)] = failureDetails + } } } @@ -97,6 +109,8 @@ func RunAnalysis(ctx context.Context, client *kubernetes.Client, aiClient *ai.Cl return err } } + + color.Green(response) } } diff --git a/pkg/analyzer/events.go b/pkg/analyzer/events.go new file mode 100644 index 0000000..ec93074 --- /dev/null +++ b/pkg/analyzer/events.go @@ -0,0 +1,33 @@ +package analyzer + +import ( + "context" + + "github.com/k8sgpt-ai/k8sgpt/pkg/kubernetes" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +func FetchLatestPodEvent(ctx context.Context, kubernetesClient *kubernetes.Client, pod *v1.Pod) (*v1.Event, error) { + + // get the list of events + events, err := kubernetesClient.GetClient().CoreV1().Events(pod.Namespace).List(ctx, + metav1.ListOptions{ + FieldSelector: "involvedObject.name=" + pod.Name, + }) + + if err != nil { + return nil, err + } + // find most recent event + var latestEvent *v1.Event + for _, event := range events.Items { + if latestEvent == nil { + latestEvent = &event + } + if event.LastTimestamp.After(latestEvent.LastTimestamp.Time) { + latestEvent = &event + } + } + return latestEvent, nil +} From ca534b337a4b1c2dce3d0130ef69a138bb7a3d15 Mon Sep 17 00:00:00 2001 From: AlexsJones Date: Wed, 22 Mar 2023 15:17:59 +0000 Subject: [PATCH 2/3] updated the guard on the event Signed-off-by: AlexsJones --- pkg/analyzer/analyzer.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/pkg/analyzer/analyzer.go b/pkg/analyzer/analyzer.go index 5610a24..816d2b5 100644 --- a/pkg/analyzer/analyzer.go +++ b/pkg/analyzer/analyzer.go @@ -55,9 +55,10 @@ func RunAnalysis(ctx context.Context, client *kubernetes.Client, aiClient *ai.Cl if err != nil { continue } - - failureDetails = append(failureDetails, evt.Message) - brokenPods[fmt.Sprintf("%s/%s", pod.Namespace, pod.Name)] = failureDetails + if evt.Reason == "FailedCreatePodSandBox" { + failureDetails = append(failureDetails, evt.Message) + brokenPods[fmt.Sprintf("%s/%s", pod.Namespace, pod.Name)] = failureDetails + } } } From 10b290e4e3db91f7c25affb5b30154a7e0f41374 Mon Sep 17 00:00:00 2001 From: AlexsJones Date: Thu, 23 Mar 2023 09:27:06 +0000 Subject: [PATCH 3/3] updated readme copy Signed-off-by: AlexsJones --- README.md | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index f61e15e..56114cb 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,11 @@ -# k8sgpt - -
-AI Powered Kubernetes debugging for SRE, Platform and DevOps teams. -
- - - -## What is k8sgpt? `k8sgpt` is a tool for scanning your kubernetes clusters, diagnosing and triaging issues in simple english. -It reduces the mystery of kubernetes and makes it easy to understand what is going on in your cluster. +It has SRE experience codified into it's analyzers and helps to pull out the most relevent information to enrich it with AI. + + ## Usage