diff --git a/contrib/mesos/pkg/flagutil/cadvisor.go b/contrib/mesos/pkg/flagutil/cadvisor.go new file mode 100644 index 00000000000..ed49bb9d1bb --- /dev/null +++ b/contrib/mesos/pkg/flagutil/cadvisor.go @@ -0,0 +1,51 @@ +/* +Copyright 2016 The Kubernetes Authors All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package flagutil + +import ( + "flag" + + // TODO(jdef) kill this once cadvisor flags are no longer configured by + // global variables. Importing it this way guarantees that the global flag + // variables are initialized. + _ "github.com/google/cadvisor/manager" + // kubelet attempts to customize default values for some cadvisor flags, so + // make sure that we pick these up. + _ "k8s.io/kubernetes/pkg/kubelet/cadvisor" +) + +// FlagFunc retrieves a specific flag instance; returns nil if the flag is not configured. +type FlagFunc func() *flag.Flag + +// NameValue returns the name and value of a flag, if it exists, otherwise empty strings. +func (ff FlagFunc) NameValue() (name, value string) { + if f := ff(); f != nil { + name, value = f.Name, f.Value.String() + } + return +} + +func flagFunc(name string) FlagFunc { return func() *flag.Flag { return flag.Lookup(name) } } + +// Cadvisor fields return the configured values of cadvisor global flags +var Cadvisor = struct { + HousekeepingInterval FlagFunc + GlobalHousekeepingInterval FlagFunc +}{ + flagFunc("housekeeping_interval"), + flagFunc("global_housekeeping_interval"), +} diff --git a/contrib/mesos/pkg/minion/server.go b/contrib/mesos/pkg/minion/server.go index b20ecc56298..c30f0765f1f 100644 --- a/contrib/mesos/pkg/minion/server.go +++ b/contrib/mesos/pkg/minion/server.go @@ -33,6 +33,7 @@ import ( "gopkg.in/natefinch/lumberjack.v2" kubeletapp "k8s.io/kubernetes/cmd/kubelet/app" exservice "k8s.io/kubernetes/contrib/mesos/pkg/executor/service" + "k8s.io/kubernetes/contrib/mesos/pkg/flagutil" "k8s.io/kubernetes/contrib/mesos/pkg/hyperkube" "k8s.io/kubernetes/contrib/mesos/pkg/minion/config" "k8s.io/kubernetes/contrib/mesos/pkg/minion/tasks" @@ -177,9 +178,18 @@ func (ms *MinionServer) launchExecutorServer(containerID string) <-chan struct{} // disable resource-container; mesos slave doesn't like sub-containers yet executorArgs = append(executorArgs, "--kubelet-cgroups=") - if ms.cgroupRoot != "" { - executorArgs = append(executorArgs, "--cgroup-root="+ms.cgroupRoot) + + appendOptional := func(name, value string) { + if value != "" { + executorArgs = append(executorArgs, "--"+name+"="+value) + } } + appendOptional("cgroup-root", ms.cgroupRoot) + + // forward global cadvisor flag values to the executor + // TODO(jdef) remove this code once cadvisor global flags have been cleaned up + appendOptional(flagutil.Cadvisor.HousekeepingInterval.NameValue()) + appendOptional(flagutil.Cadvisor.GlobalHousekeepingInterval.NameValue()) // forward containerID so that the executor may pass it along to containers that it launches var ctidOpt tasks.Option diff --git a/contrib/mesos/pkg/scheduler/service/service.go b/contrib/mesos/pkg/scheduler/service/service.go index 5864157fe61..6ed077ad09f 100644 --- a/contrib/mesos/pkg/scheduler/service/service.go +++ b/contrib/mesos/pkg/scheduler/service/service.go @@ -50,6 +50,7 @@ import ( "k8s.io/kubernetes/contrib/mesos/pkg/election" execcfg "k8s.io/kubernetes/contrib/mesos/pkg/executor/config" + "k8s.io/kubernetes/contrib/mesos/pkg/flagutil" "k8s.io/kubernetes/contrib/mesos/pkg/hyperkube" minioncfg "k8s.io/kubernetes/contrib/mesos/pkg/minion/config" "k8s.io/kubernetes/contrib/mesos/pkg/podutil" @@ -495,6 +496,10 @@ func (s *SchedulerServer) prepareExecutorInfo(hks hyperkube.Interface) (*mesos.E appendOptional("host-network-sources", s.kubeletHostNetworkSources) appendOptional("network-plugin", s.kubeletNetworkPluginName) + // TODO(jdef) this code depends on poorly scoped cadvisor flags, will need refactoring soon + appendOptional(flagutil.Cadvisor.HousekeepingInterval.NameValue()) + appendOptional(flagutil.Cadvisor.GlobalHousekeepingInterval.NameValue()) + log.V(1).Infof("prepared executor command %q with args '%+v'", ci.GetValue(), ci.Arguments) // Create mesos scheduler driver.