blob: a0f673e09a9790f07f250545122c101cfe378f76 [file] [log] [blame] [view]
# Kubernetes Checker Production Manual
The goal of this service is to monitor our Kubernetes (k8s) cluster and pipe relevant metrics into
Prometheus, so we can get alerts based on them.
When dealing with k8s pods/containers/deployments, it is handy to reference:
<https://github.com/skia-dev/textfiles/blob/master/kubectl-cheatsheet.md>
This app syncs https://skia.googlesource.com/k8s-config/ and uses it to generate some metrics.
One instance of k8s-checker should run on each production GCE cluster where we run our services.
As of now, we do not run it in any skolo clusters.
# Alerts
Items below here should include target links from alerts.
## K8sCheckerLiveness
This alert signifies that the k8s-checker service is running, but has failed to update the metrics
about its cluster recently. It normally attempts to do so once per minute.
Check out the logs of the relevant k8s-checker service.
If the data for this alert is missing, that probably means k8s-checker is not running.
Key metrics: liveness_k8s_checker_s
## TooManyPodRestarts
This alert triggers if a pod has restarted many times since it was deployed. This can indicate a
rare crash (e.g. nil dereference) or a burst of restarts due to an external dependency outage.
To gather more information, use `kubectl logs -f <pod_name>` to get the current logs from the
container (to see if it is currently running ok) and `kubectl logs -f <pod_name> --previous`
to attempt to ascertain the cause of the previous restarts.
`kubectl describe <pod_name> | grep -A 5 "Last State"` can also give information about the previous
life of the pod (e.g "Reason: Error" or "Reason: OOMKilled").
Ways to address the alert include deploying a new (hopefully fixed) version of the container or
explicitly re-deploying the current version to reset the restart count metric. Contact the service
owner to discuss the best mitigation approach.
Key metrics: pod_restart_count
## PodRestartingFrequently
This alert triggers if a pod has restarted multiple times in the last hour. This can indicate a
currently down or crash-looping service.
The same advice as the TooManyPodRestarts alert applies.
Key metrics: pod_restart_count
## EvictedPod
A pod has been evicted, commonly for using too much memory.
To get the reason, try `k describe pod <pod_name> | grep -A 4 "Status"`. Contact the service owner
with this reason, file a bug if necessary, and then clean up the Evicted pod with
`kubectl delete pod <pod_name> --grace-period=0 --force`
Key metrics: evicted_pod_metric
## DirtyCommittedK8sImage
A dirty image has been commited to the prod checkout prod checkout. Check with the service owner
and/or the image author to see if they are done experimenting and if we can land/push a clean image.
Key metrics: dirty_committed_image_metric
## DirtyRunningK8sConfig
A dirty image has been running in production for at least two hours. Check with the service owner
and/or the image author to see if they are done experimenting and if we can land/push a clean image.
Key metrics: dirty_config_metric
## StaleK8sImage
The same k8s image has been running in production for at least 30 days. We should push an updated
image soon to pick up new changes and ensure things continue to work (and aren't secretly broken
for weeks).
Contact the service owner to see if the image can be updated.
Key metrics: stale_image_metric
## CheckedInK8sAppNotRunning
An app has a checked in .yaml file, but it currently is not running in production. This might mean
that a service owner forgot to push it after checking it in, or somehow it has stopped being run.
Check with the service owner to see if it needs to be deployed.
Known exceptions:
- Gold has some test server configs for doing integration tests of goldpushk. These shouldn't be
running unless those tests are being run manually.
Key metrics: app_running_metric
## CheckedInK8sContainerNotRunning
A container exists in a checked in .yaml file, but it currently is not running in production.
This might mean that a service owner forgot to push it after checking it in, or somehow it has
stopped being run.
Check with the service owner to see if it needs to be deployed.
Key metrics: container_running_metric
## RunningK8sAppNotCheckedIn
An app is running in production, but does not belong to a checked in .yaml file.
This typically happens if someone is testing out a new service. Reach out to them for more details.
Key metrics: running_app_has_config_metric
## RunningK8sContainerNotCheckedIn
A container is running in production, but does not belong to a checked in .yaml file.
This typically happens if someone is testing out a new service. Reach out to them for more details.
Key metrics: running_container_has_config_metric
## AppRunningInDefaultNamespace
An app is running in the default namespace. This is undesirable for
organizational reasons and because we use namespaces as security boundaries. If
this app was pushed to the default namespace by accident, delete it and re-push
to the correct namespace. Otherwise, create a namespace following the example
of the other apps in the cluster.
Key metrics: pod_running
## K8sFailedScheduling
The Kubernetes cluster is failing to schedule a pod. This may be because the
node pool needs to scale up, or because the pod is requesting too many
resources. Read the associated message field or investigate cluster logs to
determine the cause and appropriate resolution.
Key metrics: k8s_events
## PodUnschedulable
The Kubernetes cluster is failing to schedule a pod. This may be because the
node pool needs to scale up, or because the pod is requesting too many
resources. Read the associated message field or investigate cluster logs to
determine the cause and appropriate resolution.
Key metrics: pod_unschedulable
## K8sFailedScaleUp
The Kubernetes cluster is failing to scale up the node pool. This may be because
the node pool is at its upper limit, or because we've exceeded our quota. Read
the associated message field or investigate cluster logs to determine the cause
and appropriate resolution.
Key metrics: k8s_events