diff --git a/README.md b/README.md index 85fc936..a80a0b4 100644 --- a/README.md +++ b/README.md @@ -24,4 +24,5 @@ kubectl doctor * orphan replicasets (desired number of replicas are bigger than 0 but the available replicas are 0) * leftover replicasets (desired number of replicas and the available # of replicas are 0) * orphan deployments (desired number of replicas are bigger than 0 but the available replicas are 0) -* lefover deployments (desired number of replicas and the available # of replicas are 0) +* leftover deployments (desired number of replicas and the available # of replicas are 0) +* leftover cronjobs (last active date is more than a month) diff --git a/pkg/plugin/cmd.go b/pkg/plugin/cmd.go index c45f5e0..0a9c3c7 100644 --- a/pkg/plugin/cmd.go +++ b/pkg/plugin/cmd.go @@ -21,7 +21,7 @@ const ( kubectl doctor ` longDesc = ` - kubectl-doctor plugin will scan the given namespace for any kind of anomalies and reports back to its user. + kubectl-doctor plugin will scan the given k8s cluster for any kind of anomalies and reports back to its user. example anomalies: * deployments that are older than 30d with 0 available, * deployments that do not have minimum availability, @@ -257,6 +257,20 @@ func (o *DoctorOptions) Run() error { // triage replicasets ends + // triage jobs starts + log.Info("---") + log.Info("Starting triage of cronjob resources across cluster") + for _, ns := range o.FetchedNamespaces { + jobsTriage, err := triage.LeftoverJobs(o.KubeCli, ns) + if err != nil { + return err + } + if len(jobsTriage.Anomalies) > 0 { + log.WithFields(log.Fields{"resource": jobsTriage.ResourceType, "Anomalies": jobsTriage.Anomalies}).Warn(jobsTriage.AnomalyType) + } + } + // triage jobs end + return nil } diff --git a/pkg/triage/job_triage.go b/pkg/triage/job_triage.go new file mode 100644 index 0000000..8ee849f --- /dev/null +++ b/pkg/triage/job_triage.go @@ -0,0 +1,28 @@ +package triage + +import ( + "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/kubernetes" + "time" +) + +// LeftoverJobs gets a kubernetes.Clientset and a specific namespace string +// then proceeds to search if there are leftover cronjobs that were inactive for more than a month +func LeftoverJobs(kubeCli *kubernetes.Clientset, namespace string) (*Triage, error) { + listOfTriages := make([]string, 0) + + jobs, err := kubeCli.BatchV1beta1().CronJobs(namespace).List(v1.ListOptions{}) + if err != nil { + return nil, err + } + currentTime := time.Now() + for _, i := range jobs.Items { + if i.Status.LastScheduleTime != nil { + if currentTime.Sub(i.Status.LastScheduleTime.Local()) > 31 { + listOfTriages = append(listOfTriages, i.GetName()) + } + } + + } + return NewTriage("CronJobs", "Found leftover cronjobs in namespace: "+namespace, listOfTriages), nil +}