Home

Awesome

GitHub release CI PkgGoDev

Kubbernecker

Project Status: Alpha

Kubbernecker is tools that helps to check the number of changes made to Kubernetes resources. It provides two tools: kubbernecker-metrics and kubectl-kubbernecker.

kubbernecker-metrics is an exporter that exposes the number of changes made to Kubernetes resources as Prometheus metrics. It helps to monitor the changes made to resources within a Kubernetes cluster.

kubectl-kubbernecker is a kubectl plugin that shows the number of changes made to Kubernetes resources and the manager who made the changes. It helps to quickly check the changes made to resources within a Kubernetes cluster.

The name of Kubbernecker comes from rubbernecker. It is like staring at a fight between Kubernetes controllers.

Motivation

In a Kubernetes cluster, different controllers may continuously edit the same resource, leading to a race condition. It can cause increased loads on kube-apiserver and performance issues. Kubbernecker helps to solve these problems by checking the number of changes made to Kubernetes resources.

Installation

kubbernecker-metrics

You need to add this repository to your Helm repositories:

$ helm repo add kubbernecker https://zoetrope.github.io/kubbernecker/
$ helm repo update

To install the chart with the release name kubbernecker using a dedicated namespace(recommended):

$ helm install --create-namespace --namespace kubbernecker kubbernecker kubbernecker/kubbernecker

Specify parameters using --set key=value[,key=value] argument to helm install. Alternatively a YAML file that specifies the values for the parameters can be provided like this:

$ helm install --create-namespace --namespace kubbernecker kubbernecker -f values.yaml kubbernecker/kubbernecker

Values:

KeyTypeDefaultDescription
image.repositorystring"ghcr.io/zoetrope/kubbernecker"Kubbernecker image repository to use.
image.tagstring{{ .Chart.AppVersion }}Kubbernecker image tag to use.
image.imagePullPolicystringIfNotPresentimagePullPolicy applied to Kubbernecker image.
resourcesobject{"requests":{"cpu":"100m","memory":"20Mi"}}Specify resources.
config.targetResourceslist[] (See values.yaml)Target Resources. If this is empty, all resources will be the target.
config.namespaceSelectorlist{} (See values.yaml)Selector of the namespace to which the target resource belongs. If this is empty, all namespaces will be the target.
config.enableClusterResourcesboolfalseIf targetResources is empty, whether to include cluster-scope resources in the target. If targetResources is not empty, this field will be ignored.

kubectl-kubbernecker

Download the binary and put it in a directory of your PATH. The following is an example to install the plugin in /usr/local/bin.

$ OS=$(go env GOOS)
$ ARCH=$(go env GOARCH)
$ curl -L -sS https://github.com/zoetrope/kubbernecker/releases/latest/download/kubectl-kubbernecker_${OS}-${ARCH}.tar.gz \
  | tar xz -C /usr/local/bin kubectl-kubbernecker

NOTE: In the future, this tool will be able to be installed by krew.

Usage

kubbernecker-metrics

kubbernecker-metrics exposes the following metrics:

NameTypeDescriptionLabels
kubbernecker_resource_events_totalcounterTotal number of events for Kubernetes resources.group: group </br> version: version </br> kind: kind </br>namespace: namespace </br> event_type: event type ("add", "update" or "delete") </br> resource_name: resource name

kubectl-kubbernecker

kubectl-kubbernecker has two subcommands:

watch sub-command prints the number of times a resource is updated.

$ kubectl kubbernecker watch -n default configmap
{
  "gvk": {
    "group": "",
    "version": "v1",
    "kind": "ConfigMap"
  },
  "namespaces": {
    "default": {
      "resources": {
        "test-cm": {
          "add": 0,
          "delete": 0,
          "update": 9
        }
      }
    }
  }
}

blame sub-command prints the name of managers that updated the given resource.

$ kubectl kubbernecker blame -n default configmap test-cm
{
  "managers": {
    "manager1": {
      "update": 4
    },
    "manager2": {
      "update": 4
    }
  },
  "lastUpdate": "2023-02-17T22:25:20+09:00"
}

Development

Tools for developing kubbernecker are managed by aqua. Please install aqua as described in the following page:

https://aquaproj.github.io/docs/reference/install

Then install the tools.

$ cd /path/to/kubbernecker
$ aqua i -l

You can start development with tilt.

$ make start-dev
$ tilt up