From 2c01edf9eaad3f7f5d486ce53b06e0f85668f01c Mon Sep 17 00:00:00 2001 From: derekwaynecarr Date: Tue, 10 May 2016 17:12:01 -0400 Subject: [PATCH] Add eviction-pressure-transition-period flag to kubelet --- cmd/integration/integration.go | 5 +-- cmd/kubelet/app/options/options.go | 50 ++++++++++++++++-------------- cmd/kubelet/app/server.go | 19 ++++++++---- hack/verify-flags/known-flags.txt | 1 + pkg/apis/componentconfig/types.go | 2 ++ pkg/kubelet/eviction/types.go | 8 +++++ pkg/kubelet/kubelet.go | 2 +- pkg/kubemark/hollow_kubelet.go | 1 + 8 files changed, 55 insertions(+), 33 deletions(-) diff --git a/cmd/integration/integration.go b/cmd/integration/integration.go index 7bd412544ee..a26264a8886 100644 --- a/cmd/integration/integration.go +++ b/cmd/integration/integration.go @@ -237,6 +237,7 @@ func startComponents(firstManifestURL, secondManifestURL string) (string, string 3*time.Second, /* NodeStatusUpdateFrequency */ 10*time.Second, /* SyncFrequency */ 10*time.Second, /* OutOfDiskTransitionFrequency */ + 10*time.Second, /* EvictionPressureTransitionPeriod */ 40, /* MaxPods */ cm, net.ParseIP("127.0.0.1")) @@ -269,8 +270,8 @@ func startComponents(firstManifestURL, secondManifestURL string) (string, string 3*time.Second, /* NodeStatusUpdateFrequency */ 10*time.Second, /* SyncFrequency */ 10*time.Second, /* OutOfDiskTransitionFrequency */ - - 40, /* MaxPods */ + 10*time.Second, /* EvictionPressureTransitionPeriod */ + 40, /* MaxPods */ cm, net.ParseIP("127.0.0.1")) diff --git a/cmd/kubelet/app/options/options.go b/cmd/kubelet/app/options/options.go index 3584f9343b4..a58dacac7ba 100644 --- a/cmd/kubelet/app/options/options.go +++ b/cmd/kubelet/app/options/options.go @@ -117,30 +117,31 @@ func NewKubeletServer() *KubeletServer { OOMScoreAdj: int32(qos.KubeletOOMScoreAdj), LockFilePath: "", PodInfraContainerImage: GetDefaultPodInfraContainerImage(), - Port: ports.KubeletPort, - ReadOnlyPort: ports.KubeletReadOnlyPort, - RegisterNode: true, // will be ignored if no apiserver is configured - RegisterSchedulable: true, - RegistryBurst: 10, - RegistryPullQPS: 5.0, - KubeletCgroups: "", - ResolverConfig: kubetypes.ResolvConfDefault, - RktPath: "", - RktAPIEndpoint: rkt.DefaultRktAPIServiceEndpoint, - RktStage1Image: "", - RootDirectory: defaultRootDir, - RuntimeCgroups: "", - SerializeImagePulls: true, - StreamingConnectionIdleTimeout: unversioned.Duration{Duration: 4 * time.Hour}, - SyncFrequency: unversioned.Duration{Duration: 1 * time.Minute}, - SystemCgroups: "", - ReconcileCIDR: true, - KubeAPIQPS: 5.0, - KubeAPIBurst: 10, - ExperimentalFlannelOverlay: experimentalFlannelOverlay, - OutOfDiskTransitionFrequency: unversioned.Duration{Duration: 5 * time.Minute}, - HairpinMode: componentconfig.PromiscuousBridge, - BabysitDaemons: false, + Port: ports.KubeletPort, + ReadOnlyPort: ports.KubeletReadOnlyPort, + RegisterNode: true, // will be ignored if no apiserver is configured + RegisterSchedulable: true, + RegistryBurst: 10, + RegistryPullQPS: 5.0, + KubeletCgroups: "", + ResolverConfig: kubetypes.ResolvConfDefault, + RktPath: "", + RktAPIEndpoint: rkt.DefaultRktAPIServiceEndpoint, + RktStage1Image: "", + RootDirectory: defaultRootDir, + RuntimeCgroups: "", + SerializeImagePulls: true, + StreamingConnectionIdleTimeout: unversioned.Duration{Duration: 4 * time.Hour}, + SyncFrequency: unversioned.Duration{Duration: 1 * time.Minute}, + SystemCgroups: "", + ReconcileCIDR: true, + KubeAPIQPS: 5.0, + KubeAPIBurst: 10, + ExperimentalFlannelOverlay: experimentalFlannelOverlay, + OutOfDiskTransitionFrequency: unversioned.Duration{Duration: 5 * time.Minute}, + HairpinMode: componentconfig.PromiscuousBridge, + BabysitDaemons: false, + EvictionPressureTransitionPeriod: unversioned.Duration{Duration: 5 * time.Minute}, }, } } @@ -255,4 +256,5 @@ func (s *KubeletServer) AddFlags(fs *pflag.FlagSet) { fs.StringVar(&s.EvictionHard, "eviction-hard", s.EvictionHard, "A set of eviction thresholds (e.g. memory.available<1Gi) that if met would trigger a pod eviction.") fs.StringVar(&s.EvictionSoft, "eviction-soft", s.EvictionSoft, "A set of eviction thresholds (e.g. memory.available<1.5Gi) that if met over a corresponding grace period would trigger a pod eviction.") fs.StringVar(&s.EvictionSoftGracePeriod, "eviction-soft-grace-period", s.EvictionSoftGracePeriod, "A set of eviction grace periods (e.g. memory.available=1m30s) that correspond to how long a soft eviction threshold must hold before triggering a pod eviction.") + fs.DurationVar(&s.EvictionPressureTransitionPeriod.Duration, "eviction-pressure-transition-period", s.EvictionPressureTransitionPeriod.Duration, "Duration for which the kubelet has to wait before transitioning out of an eviction pressure condition.") } diff --git a/cmd/kubelet/app/server.go b/cmd/kubelet/app/server.go index 91d0bbd5c4e..bf2cc623d9e 100644 --- a/cmd/kubelet/app/server.go +++ b/cmd/kubelet/app/server.go @@ -188,6 +188,10 @@ func UnsecuredKubeletConfig(s *options.KubeletServer) (*KubeletConfig, error) { if err != nil { return nil, err } + evictionConfig := eviction.Config{ + PressureTransitionPeriod: s.EvictionPressureTransitionPeriod.Duration, + Thresholds: thresholds, + } return &KubeletConfig{ Address: net.ParseIP(s.Address), @@ -267,8 +271,8 @@ func UnsecuredKubeletConfig(s *options.KubeletServer) (*KubeletConfig, error) { HairpinMode: s.HairpinMode, BabysitDaemons: s.BabysitDaemons, ExperimentalFlannelOverlay: s.ExperimentalFlannelOverlay, - NodeIP: net.ParseIP(s.NodeIP), - Thresholds: thresholds, + NodeIP: net.ParseIP(s.NodeIP), + EvictionConfig: evictionConfig, }, nil } @@ -513,7 +517,7 @@ func SimpleKubelet(client *clientset.Clientset, configFilePath string, cloud cloudprovider.Interface, osInterface kubecontainer.OSInterface, - fileCheckFrequency, httpCheckFrequency, minimumGCAge, nodeStatusUpdateFrequency, syncFrequency, outOfDiskTransitionFrequency time.Duration, + fileCheckFrequency, httpCheckFrequency, minimumGCAge, nodeStatusUpdateFrequency, syncFrequency, outOfDiskTransitionFrequency, evictionPressureTransitionPeriod time.Duration, maxPods int, containerManager cm.ContainerManager, clusterDNS net.IP) *KubeletConfig { imageGCPolicy := kubelet.ImageGCPolicy{ @@ -524,7 +528,9 @@ func SimpleKubelet(client *clientset.Clientset, DockerFreeDiskMB: 256, RootFreeDiskMB: 256, } - + evictionConfig := eviction.Config{ + PressureTransitionPeriod: evictionPressureTransitionPeriod, + } kcfg := KubeletConfig{ Address: net.ParseIP(address), CAdvisorInterface: cadvisorInterface, @@ -582,6 +588,7 @@ func SimpleKubelet(client *clientset.Clientset, VolumePlugins: volumePlugins, Writer: &io.StdWriter{}, OutOfDiskTransitionFrequency: outOfDiskTransitionFrequency, + EvictionConfig: evictionConfig, } return &kcfg } @@ -783,7 +790,7 @@ type KubeletConfig struct { Writer io.Writer VolumePlugins []volume.VolumePlugin OutOfDiskTransitionFrequency time.Duration - Thresholds []eviction.Threshold + EvictionConfig eviction.Config ExperimentalFlannelOverlay bool NodeIP net.IP @@ -880,7 +887,7 @@ func CreateAndInitKubelet(kc *KubeletConfig) (k KubeletBootstrap, pc *config.Pod kc.ContainerRuntimeOptions, kc.HairpinMode, kc.BabysitDaemons, - kc.Thresholds, + kc.EvictionConfig, kc.Options, ) diff --git a/hack/verify-flags/known-flags.txt b/hack/verify-flags/known-flags.txt index 738199d6da3..223ceeadeb6 100644 --- a/hack/verify-flags/known-flags.txt +++ b/hack/verify-flags/known-flags.txt @@ -121,6 +121,7 @@ event-ttl eviction-hard eviction-soft eviction-soft-grace-period +eviction-pressure-transition-period executor-bindall executor-logv executor-path diff --git a/pkg/apis/componentconfig/types.go b/pkg/apis/componentconfig/types.go index ab7912b015a..ffef22ce0fd 100644 --- a/pkg/apis/componentconfig/types.go +++ b/pkg/apis/componentconfig/types.go @@ -349,6 +349,8 @@ type KubeletConfiguration struct { EvictionSoft string `json:"evictionSoft,omitempty"` // Comma-delimeted list of grace periods for each soft eviction signal. For example, 'memory.available=30s'. EvictionSoftGracePeriod string `json:"evictionSoftGracePeriod,omitempty"` + // Duration for which the kubelet has to wait before transitioning out of an eviction pressure condition. + EvictionPressureTransitionPeriod unversioned.Duration `json:"evictionPressureTransitionPeriod,omitempty"` } type KubeSchedulerConfiguration struct { diff --git a/pkg/kubelet/eviction/types.go b/pkg/kubelet/eviction/types.go index 63d39fe875f..2790d450fbf 100644 --- a/pkg/kubelet/eviction/types.go +++ b/pkg/kubelet/eviction/types.go @@ -38,6 +38,14 @@ const ( OpLessThan ThresholdOperator = "LessThan" ) +// Config holds information about how eviction is configured. +type Config struct { + // PressureTransitionPeriod is duration the kubelet has to wait before transititioning out of a pressure condition. + PressureTransitionPeriod time.Duration + // Thresholds define the set of conditions monitored to trigger eviction. + Thresholds []Threshold +} + // Threshold defines a metric for when eviction should occur. type Threshold struct { // Signal defines the entity that was measured. diff --git a/pkg/kubelet/kubelet.go b/pkg/kubelet/kubelet.go index 66974abbca3..c51cfe3239a 100644 --- a/pkg/kubelet/kubelet.go +++ b/pkg/kubelet/kubelet.go @@ -223,7 +223,7 @@ func NewMainKubelet( containerRuntimeOptions []kubecontainer.Option, hairpinMode string, babysitDaemons bool, - thresholds []eviction.Threshold, + evictionConfig eviction.Config, kubeOptions []Option, ) (*Kubelet, error) { if rootDirectory == "" { diff --git a/pkg/kubemark/hollow_kubelet.go b/pkg/kubemark/hollow_kubelet.go index 3ea315e231d..18115d92152 100644 --- a/pkg/kubemark/hollow_kubelet.go +++ b/pkg/kubemark/hollow_kubelet.go @@ -72,6 +72,7 @@ func NewHollowKubelet( 10*time.Second, /* NodeStatusUpdateFrequency */ 10*time.Second, /* SyncFrequency */ 5*time.Minute, /* OutOfDiskTransitionFrequency */ + 5*time.Minute, /* EvictionPressureTransitionPeriod */ maxPods, containerManager, nil,