1.2 Operations

Find all Pod logs containing "ERROR:"

Retrieve all Pods in the "default" namespace, obtain their logs, and
filter down to only the Pods whose logs contain the string "Error:". Return
the logs grouped by Pod name.

Query:

import {Client, query, transform} from "carbonql";

const c = Client.fromFile(<string>process.env.KUBECONFIG);
const podLogs =
  // Get pods in `default` namespace.
  from pod in c.core.v1.Pod.list("default")
  // Find logs that include the string "error:".
  let logs = c.core.v1.Pod.logs(pod.metadata.name, pod.metadata.ns)
  where logs.toLowerCase().includes("error:")
  select new{pod = pod, logs = logs};

podLogs.subscribe(({pod, logs}) => {
  // Print all the name of the pod and its logs.
  console.log(pod.metadata.name);
  console.log(logs);
});

Output:

mysql-5-66f5b49b8f-5r48g
error: database is uninitialized and password option is not specified
  You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD

mysql-859645bdb9-w29z7
error: database is uninitialized and password option is not specified
  You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD

mysql-8-7d4f8d46d7-hrktb
error: database is uninitialized and password option is not specified
  You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD

Diff last two rollouts of an application

Search for a Deployment named "nginx", and obtain the last 2
revisions in its rollout history. Then use the jsondiffpatch library to diff
these two revisions.

NOTE: a history of rollouts is not retained by default, so you'll need to
create the deployment with .spec.revisionHistoryLimit set to a number larger
than 2. (See documentation for DeploymentSpec)

Query:

import {Client, query, transform} from "carbonql";
const jsondiff = require("jsondiffpatch");

const c = Client.fromFile(<string>process.env.KUBECONFIG);
const history =
  // For each Deployment...
  from d in c.apps.v1beta1.Deployment.list()
  // ...get all ReplicaSets that are owned by it
  let rss =
      (from rs in c.extensions.v1beta1.ReplicaSet.list()
      where
          (from ownerRef in rs.metadata.ownerReferences
          where ownerRef.name == d.metadata.name
          select ownerRef).Count() > 0
      orderby rs.metadata.annotations["deployment.kubernetes.io/revision"]
      select rs)
  // ... and take the two that are last chronologically.
  from rs in rss.TakeLast(2)
  select rs;

history.forEach(rollout => {
  jsondiff.console.log(jsondiff.diff(rollout[0], rollout[1]))
});

Output:



Find all Pods scheduled on nodes with high memory pressure

Search for all Kubernetes Pods scheduled on nodes where status conditions
report high memory pressure.

Query:

import {Client, query} from "carbonql";

const c = Client.fromFile(<string>process.env.KUBECONFIG);
const pressured =
  from pod in c.core.v1.Pod.list()
  group pod by pod.spec.nodeName into podsOnNode
  join node in c.core.v1.Node.list() on podsOnNode.Key equals node.metadata.name
  where
      (from condition in node.status.conditions
      where condition.type == "MemoryPressure" && condition.status == "True").Count() >= 1
  select new{node = node, pods = podsOnNode};

pressured.forEach(({node, pods}) => {
  console.log(node.metadata.name);
  pods.forEach(pod => console.log(`    ${pod.metadata.name}`));
});

Output:

node3
    redis-6f8cf9fbc4-qnrhb
    redis2-687c5bbccd-rzjl5

Aggregate cluster-wide error and warning Events into a report

Search for all Kubernetes Events that are classified as "Warning" or
"Error", and report them grouped by the type of Kubernetes object that caused
them.

In this example, there are warnings being emitted from both Nodes and
from [Pods][pods], so we group them together by their place of origin.

Query:

import {client, query} from "carbonql";

const c = Client.fromFile(<string>process.env.KUBECONFIG);
const warningsAndErrors =
  from e in c.core.v1.Event.list()
  where e.type == "Warning" || e.type == "Error"
  group e by e.involvedObject.kind;

warningsAndErrors.forEach(events => {
  console.log(`kind: ${events.key}`);
  events.forEach(e =>
    console.log(`  ${e.type}\t(x${e.count})\t${e.involvedObject.name}\n    Message: ${e.message}`));
});

Output:

kind: Node
  Warning    (1946 times)    minikube    Failed to start node healthz on 0: listen tcp: address 0: missing port in address
kind: Pod
  Warning    (7157 times)    mysql-5-66f5b49b8f-5r48g    Back-off restarting failed container
  Warning    (7153 times)    mysql-8-7d4f8d46d7-hrktb    Back-off restarting failed container
  Warning    (6931 times)    mysql-859645bdb9-w29z7    Back-off restarting failed container

results matching ""

    No results matching ""