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