From b8b532b974be2b2157ad82761005fb0a5866a85b Mon Sep 17 00:00:00 2001 From: Yu-Ju Hong Date: Sat, 15 Aug 2015 08:40:19 -0700 Subject: [PATCH] Proposal: add pod lifecycle event generator for kubelet --- docs/proposals/pleg.png | Bin 0 -> 49079 bytes .../pod-lifecycle-event-generator.md | 230 ++++++++++++++++++ 2 files changed, 230 insertions(+) create mode 100644 docs/proposals/pleg.png create mode 100644 docs/proposals/pod-lifecycle-event-generator.md diff --git a/docs/proposals/pleg.png b/docs/proposals/pleg.png new file mode 100644 index 0000000000000000000000000000000000000000..f15c5d83dadd3ee30bf4687f1b02302240ea807a GIT binary patch literal 49079 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 + + + +WARNING +WARNING +WARNING +WARNING +WARNING + +

PLEASE NOTE: This document applies to the HEAD of the source tree

+ +If you are using a released version of Kubernetes, you should +refer to the docs that go with that version. + +Documentation for other releases can be found at +[releases.k8s.io](http://releases.k8s.io). + +-- + + + + + +# Kubelet: Pod Lifecycle Event Generator (PLEG) + +In Kubernetes, Kubelet is a per-node daemon that manages the pods on the node, +driving the pod states to match their pod specifications (specs). To achieve +this, Kubelet needs to react to changes in both (1) pod specs and (2) the +container states. For the former, Kubelet watches the pod specs changes from +multiple sources; for the latter, Kubelet polls the container runtime +periodically (e.g., 10s) for the latest states for all containers. + +Polling incurs non-negligible overhead as the number of pods/containers increases, +and is exacerbated by Kubelet's parallelism -- one worker (goroutine) per pod, which +queries the container runtime individually. Periodic, concurrent, large number +of requests causes high CPU usage spikes (even when there is no spec/state +change), poor performance, and reliability problems due to overwhelmed container +runtime. Ultimately, it limits Kubelet's scalability. + +(Related issues reported by users: [#10451](https://issues.k8s.io/10451), +[#12099](https://issues.k8s.io/12099), [#12082](https://issues.k8s.io/12082)) + +## Goals and Requirements + +The goal of this proposal is to improve Kubelet's scalability and performance +by lowering the pod management overhead. + - Reduce unnecessary work during inactivity (no spec/state changes) + - Lower the concurrent requests to the container runtime. + +The design should be generic so that it can support different container runtimes +(e.g., Docker and rkt). + +## Overview + +This proposal aims to replace the periodic polling with a pod lifecycle event +watcher. + +![pleg](pleg.png) + +## Pod Lifecycle Event + +A pod lifecycle event interprets the underlying container state change at the +pod-level abstraction, making it container-runtime-agnostic. The abstraction +shields Kubelet from the runtime specifics. + +```go +type PodLifeCycleEventType string + +const ( + ContainerStarted PodLifeCycleEventType = "ContainerStarted" + ContainerStopped PodLifeCycleEventType = "ContainerStopped" + NetworkSetupCompleted PodLifeCycleEventType = "NetworkSetupCompleted" + NetworkFailed PodLifeCycleEventType = "NetworkFailed" +) + +// PodLifecycleEvent is an event reflects the change of the pod state. +type PodLifecycleEvent struct { + // The pod ID. + ID types.UID + // The type of the event. + Type PodLifeCycleEventType + // The accompanied data which varies based on the event type. + Data interface{} +} +``` + +Using Docker as an example, starting of a POD infra container would be +translated to a NetworkSetupCompleted`pod lifecycle event. + + +## Detect Changes in Container States Via Relisting + +In order to generate pod lifecycle events, PLEG needs to detect changes in +container states. We can achieve this by periodically relisting all containers +(e.g., docker ps). Although this is similar to Kubelet's polling today, it will +only be performed by a single thread (PLEG). This means that we still +benefit from not having all pod workers hitting the container runtime +concurrently. Moreover, only the relevant pod worker would be woken up +to perform a sync. + +The upside of relying on relisting is that it is container runtime-agnostic, +and requires no external dependency. + +### Relist period + +The shorter the relist period is, the sooner that Kubelet can detect the +change. Shorter relist period also implies higher cpu usage. Moreover, the +relist latency depends on the underlying container runtime, and usually +increases as the number of containers/pods grows. We should set a default +relist period based on measurements. Regardless of what period we set, it will +likely be significantly shorter than the current pod sync period (10s), i.e., +Kubelet will detect container changes sooner. + + +## Impact on the Pod Worker Control Flow + +Kubelet is responsible for dispatching an event to the appropriate pod +worker based on the pod ID. Only one pod worker would be woken up for +each event. + +Today, the pod syncing routine in Kubelet is idempotent as it always +examines the pod state and the spec, and tries to drive to state to +match the spec by performing a series of operations. It should be +noted that this proposal does not intend to change this property -- +the sync pod routine would still perform all necessary checks, +regardless of the event type. This trades some efficiency for +reliability and eliminate the need to build a state machine that is +compatible with different runtimes. + +## Leverage Upstream Container Events + +Instead of relying on relisting, PLEG can leverage other components which +provide container events, and translate these events into pod lifecycle +events. This will further improve Kubelet's responsiveness and reduce the +resource usage caused by frequent relisting. + +The upstream container events can come from: + +(1). *Event stream provided by each container runtime* + +Docker's API exposes an [event +stream](https://docs.docker.com/reference/api/docker_remote_api_v1.17/#monitor-docker-s-events). +Nonetheless, rkt does not support this yet, but they will eventually support it +(see [coreos/rkt#1193](https://github.com/coreos/rkt/issues/1193)). + +(2). *cgroups event stream by cAdvisor* + +cAdvisor is integrated in Kubelet to provide container stats. It watches cgroups +containers using inotify and exposes an event stream. Even though it does not +support rkt yet, it should be straightforward to add such a support. + +Option (1) may provide richer sets of events, but option (2) has the advantage +to be more universal across runtimes, as long as the container runtime uses +cgroups. Regardless of what one chooses to implement now, the container event +stream should be easily swappable with a clearly defined interface. + +Note that we cannot solely rely on the upstream container events due to the +possibility of missing events. PLEG should relist infrequently to ensure no +events are missed. + +## Generate Expected Events + +*This is optional for PLEGs which performs only relisting, but required for +PLEGs that watch upstream events.* + +A pod worker's actions could lead to pod lifecycle events (e.g., +create/kill a container), which the worker would not observe until +later. The pod worker should ignore such events to avoid unnecessary +work. + +For example, assume a pod has two containers, A and B. The worker + + - Creates container A + - Receives an event `(ContainerStopped, B)` + - Receives an event `(ContainerStarted, A)` + + +The worker should ignore the `(ContainerStarted, A)` event since it is +expected. Arguably, the worker could process `(ContainerStopped, B)` +as soon as it receives the event, before observing the creation of +A. However, it is desirable to wait until the expected event +`(ContainerStarted, A)` is observed to keep a consistent per-pod view +at the worker. Therefore, the control flow of a single pod worker +should adhere to the following rules: + +1. Pod worker should process the events sequentially. +2. Pod worker should not start syncing until it observes the outcome of its own + actions in the last sync to maintain a consistent view. + +In other words, a pod worker should record the expected events, and +only wake up to perform the next sync until all expectations are met. + + - Creates container A, records an expected event `(ContainerStarted, A)` + - Receives `(ContainerStopped, B)`; stores the event and goes back to sleep. + - Receives `(ContainerStarted, A)`; clears the expectation. Proceeds to handle + `(ContainerStopped, B)`. + +We should set an expiration time for each expected events to prevent the worker +from being stalled indefinitely by missing events. + +## TODOs for v1.2 + +For v1.2, we will add a generic PLEG which relists periodically, and leave +adopting container events for future work. We will also *not* implement the +optimization that generate and filters out expected events to minimize +redundant syncs. + +- Add a generic PLEG using relisting. Modify the container runtime interface + to provide all necessary information to detect container state changes + in `GetPods()` (#13571). + +- Benchmark docker to adjust relising frequency. + +- Fix/adapt features that rely on frequent, periodic pod syncing. + * Liveness/Readiness probing: Create a separate probing manager using + explicitly container probing period [#10878](https://issues.k8s.io/10878). + * Instruct pod workers to set up a wake-up call if syncing failed, so that + it can retry. + + + + +[![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/proposals/pod-lifecycle-event-generator.md?pixel)]() +