From b86c60f8519feb13801583f795bf2898928bb817 Mon Sep 17 00:00:00 2001 From: Adam Harrison Date: Mon, 23 Oct 2017 17:32:59 +0100 Subject: [PATCH] Update README --- README.md | 134 +++++++++++++++++++++++++++++++++++-- img/logo.png | Bin 0 -> 15937 bytes img/slack-notification.png | Bin 0 -> 7345 bytes 3 files changed, 128 insertions(+), 6 deletions(-) create mode 100644 img/logo.png create mode 100644 img/slack-notification.png diff --git a/README.md b/README.md index 1f42f385c..fd3795b27 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,26 @@ + + * [Introduction](#introduction) +* [Kubernetes & OS Compatibility](#kubernetes-&-os-compatibility) +* [Installation](#installation) * [Configuration](#configuration) * [Reboot Sentinel File & Period](#reboot-sentinel-file-&-period) * [Blocking Reboots via Alerts](#blocking-reboots-via-alerts) + * [Prometheus Metrics](#prometheus-metrics) + * [Slack Notifications](#slack-notifications) * [Overriding Lock Configuration](#overriding-lock-configuration) +* [Operation](#operation) + * [Testing](#testing) + * [Disabling Reboots](#disabling-reboots) + * [Manual Unlock](#manual-unlock) * [Building](#building) ## Introduction Kured (KUbernetes REboot Daemon) is a Kubernetes daemonset that -performs safe automatic node reboots when it is requested by the -package management system of the underlying OS. +performs safe automatic node reboots when the need to do so is +indicated by the package management system of the underlying OS. * Watches for the presence of a reboot sentinel e.g. `/var/run/reboot-required` * Utilises a lock in the API server to ensure only one node reboots at @@ -18,6 +28,32 @@ package management system of the underlying OS. * Optionally defers reboots in the presence of active Prometheus alerts * Cordons & drains worker nodes before reboot, uncordoning them after +## Kubernetes & OS Compatibility + +The daemon image contains a 1.7.x `k8s.io/client-go` and `kubectl` +binary for the purposes of maintaining the lock and draining worker +nodes. Whilst it has only been tested on a 1.7.x cluster, Kubernetes +typically has good forwards/backwards compatibility so there is a +reasonable chance it will work on adjacent versions; please file an +issue if this is not the case. + +Additionally, the image contains a `systemctl` binary from Ubuntu +16.04 in order to command reboots. Again, although this has not been +tested against other systemd distributions there is a good chance that +it will work. + +## Installation + +To obtain a default installation without Prometheus alerting interlock +or Slack notifications: + +``` +kubectl apply -f https://github.com/weaveworks/kured/releases/download/1.0.0/kured-ds.yaml +``` + +If you want to customise the installation, download the manifest and +edit it in accordance with the following section before application. + ## Configuration The following arguments can be passed to kured via the daemonset pod template: @@ -28,17 +64,19 @@ Flags: --ds-name string namespace containing daemonset on which to place lock (default "kube-system") --ds-namespace string name of daemonset on which to place lock (default "kured") --lock-annotation string annotation in which to record locking node (default "weave.works/kured-node-lock") - --period int reboot check period in minutes (default 60) + --period duration reboot check period (default 1h0m0s) --prometheus-url string Prometheus instance to probe for active alerts --reboot-sentinel string path to file whose existence signals need to reboot (default "/var/run/reboot-required") + --slack-hook-url string slack hook URL for reboot notfications + --slack-username string slack username for reboot notfications (default "kured") ``` ### Reboot Sentinel File & Period By default kured checks for the existence of `/var/run/reboot-required` every sixty minutes; you can override these -values with `--reboot-sentinel` and `--period`. Each instance of the -reboot uses a random offset derived from the period on startup so that +values with `--reboot-sentinel` and `--period`. Each replica of the +daemon uses a random offset derived from the period on startup so that nodes don't all contend for the lock simultaneously. ### Blocking Reboots via Alerts @@ -55,9 +93,56 @@ By default the presence of *any* active (pending or firing) alerts will block reboots, however you can ignore specific alerts: ``` ---alert-filter-regexp=^(BenignAlert|AnotherBenignAlert|...$ +--alert-filter-regexp=^(RebootRequired|AnotherBenignAlert|...$ +``` + +An important application of this filter will become apparent in the +next section. + +### Prometheus Metrics + +Each kured pod exposes a single gauge metric (`:8080/metrics`) that +indicates the presence of the sentinel file: + +``` +# HELP kured_reboot_required OS requires reboot due to software updates. +# TYPE kured_reboot_required gauge +kured_reboot_required{node="ip-xxx-xxx-xxx-xxx.ec2.internal"} 0 ``` +The purpose of this metric is to power an alert which will summon an +operator if the cluster cannot reboot itself automatically for a +prolonged period: + +``` +# Alert if a reboot is required for any machines. Acts as a failsafe for the +# reboot daemon, which will not reboot nodes if there are pending alerts save +# this one. +ALERT RebootRequired + IF max(kured_reboot_required) != 0 + FOR 24h + LABELS { severity="warning" } + ANNOTATIONS { + summary = "Machine(s) require being rebooted, and the reboot daemon has failed to do so for 24 hours", + impact = "Cluster nodes more vulnerable to security exploits. Eventually, no disk space left.", + description = "Machine(s) require being rebooted, probably due to kernel update.", + } +``` + +If you choose to employ such an alert and have configured kured to +probe for active alerts before rebooting, be sure to specify +`--alert-filter-regexp=^RebootRequired$` to avoid deadlock! + +### Slack Notifications + +If you specify a Slack hook via `--slack-hook-url`, kured will notify +you immediately prior to rebooting a node: + + + +We recommend setting `--slack-username` to be the name of the +environment, e.g. `dev` or `prod`. + ### Overriding Lock Configuration The `--ds-name` and `--ds-namespace` arguments should match the name and @@ -69,6 +154,43 @@ Similarly `--lock-annotation` can be used to change the name of the annotation kured will use to store the lock, but the default is almost certainly safe. +## Operation + +The example commands in this section assume that you have not +overriden the default lock annotation, daemonset name or namespace; +if you have, you will have to adjust the commands accordingly. + +### Testing + +You can test your configuration by provoking a reboot on a node: + +``` +sudo touch /var/run/reboot-required +``` + +### Disabling Reboots + +If you need to temporarily stop kured from rebooting any nodes, you +can take the lock manually: + +``` +kubectl -n kube-system annotate ds kured weave.works/kured-node-lock='{"nodeID":"manual"}' +``` + +Don't forget to release it afterwards! + +### Manual Unlock + +In exceptional circumstances, such as a node experiencing a permanent +failure whilst rebooting, manual intervention may be required to +remove the cluster lock: + +``` +kubectl -n kube-system annotate ds kured weave.works/kured-node-lock- +``` +> NB the `-` at the end of the command is important - it instructs +> `kubectl` to remove that annotation entirely. + ## Building ``` diff --git a/img/logo.png b/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..50bd41c2e386609b0d7c29f49b20367c8c66bd75 GIT binary patch literal 15937 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 JQ7vW=_&-FpS33Xz literal 0 HcmV?d00001 diff --git a/img/slack-notification.png b/img/slack-notification.png new file mode 100644 index 0000000000000000000000000000000000000000..b8797c8b2db927f1b4ebe83488fb37c6cb78b2c7 GIT binary patch literal 7345 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 literal 0 HcmV?d00001