kubelet: add cgroup manager metrics
This commit is contained in:
parent
61e7d1ebf1
commit
ccd87fca3f
@ -30,6 +30,7 @@ go_library(
|
|||||||
"//pkg/kubelet/cm/util:go_default_library",
|
"//pkg/kubelet/cm/util:go_default_library",
|
||||||
"//pkg/kubelet/events:go_default_library",
|
"//pkg/kubelet/events:go_default_library",
|
||||||
"//pkg/kubelet/eviction/api:go_default_library",
|
"//pkg/kubelet/eviction/api:go_default_library",
|
||||||
|
"//pkg/kubelet/metrics:go_default_library",
|
||||||
"//pkg/kubelet/qos:go_default_library",
|
"//pkg/kubelet/qos:go_default_library",
|
||||||
"//pkg/util:go_default_library",
|
"//pkg/util:go_default_library",
|
||||||
"//pkg/util/mount:go_default_library",
|
"//pkg/util/mount:go_default_library",
|
||||||
|
@ -22,6 +22,7 @@ import (
|
|||||||
"path"
|
"path"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/golang/glog"
|
"github.com/golang/glog"
|
||||||
libcontainercgroups "github.com/opencontainers/runc/libcontainer/cgroups"
|
libcontainercgroups "github.com/opencontainers/runc/libcontainer/cgroups"
|
||||||
@ -29,6 +30,7 @@ import (
|
|||||||
cgroupsystemd "github.com/opencontainers/runc/libcontainer/cgroups/systemd"
|
cgroupsystemd "github.com/opencontainers/runc/libcontainer/cgroups/systemd"
|
||||||
libcontainerconfigs "github.com/opencontainers/runc/libcontainer/configs"
|
libcontainerconfigs "github.com/opencontainers/runc/libcontainer/configs"
|
||||||
"k8s.io/apimachinery/pkg/util/sets"
|
"k8s.io/apimachinery/pkg/util/sets"
|
||||||
|
"k8s.io/kubernetes/pkg/kubelet/metrics"
|
||||||
)
|
)
|
||||||
|
|
||||||
// libcontainerCgroupManagerType defines how to interface with libcontainer
|
// libcontainerCgroupManagerType defines how to interface with libcontainer
|
||||||
@ -237,6 +239,11 @@ func (m *cgroupManagerImpl) Exists(name CgroupName) bool {
|
|||||||
|
|
||||||
// Destroy destroys the specified cgroup
|
// Destroy destroys the specified cgroup
|
||||||
func (m *cgroupManagerImpl) Destroy(cgroupConfig *CgroupConfig) error {
|
func (m *cgroupManagerImpl) Destroy(cgroupConfig *CgroupConfig) error {
|
||||||
|
start := time.Now()
|
||||||
|
defer func() {
|
||||||
|
metrics.CgroupManagerLatency.WithLabelValues("destroy").Observe(metrics.SinceInMicroseconds(start))
|
||||||
|
}()
|
||||||
|
|
||||||
cgroupPaths := m.buildCgroupPaths(cgroupConfig.Name)
|
cgroupPaths := m.buildCgroupPaths(cgroupConfig.Name)
|
||||||
|
|
||||||
// we take the location in traditional cgroupfs format.
|
// we take the location in traditional cgroupfs format.
|
||||||
@ -329,6 +336,11 @@ func (m *cgroupManagerImpl) toResources(resourceConfig *ResourceConfig) *libcont
|
|||||||
|
|
||||||
// Update updates the cgroup with the specified Cgroup Configuration
|
// Update updates the cgroup with the specified Cgroup Configuration
|
||||||
func (m *cgroupManagerImpl) Update(cgroupConfig *CgroupConfig) error {
|
func (m *cgroupManagerImpl) Update(cgroupConfig *CgroupConfig) error {
|
||||||
|
start := time.Now()
|
||||||
|
defer func() {
|
||||||
|
metrics.CgroupManagerLatency.WithLabelValues("update").Observe(metrics.SinceInMicroseconds(start))
|
||||||
|
}()
|
||||||
|
|
||||||
// Extract the cgroup resource parameters
|
// Extract the cgroup resource parameters
|
||||||
resourceConfig := cgroupConfig.ResourceParameters
|
resourceConfig := cgroupConfig.ResourceParameters
|
||||||
resources := m.toResources(resourceConfig)
|
resources := m.toResources(resourceConfig)
|
||||||
@ -364,6 +376,10 @@ func (m *cgroupManagerImpl) Update(cgroupConfig *CgroupConfig) error {
|
|||||||
|
|
||||||
// Create creates the specified cgroup
|
// Create creates the specified cgroup
|
||||||
func (m *cgroupManagerImpl) Create(cgroupConfig *CgroupConfig) error {
|
func (m *cgroupManagerImpl) Create(cgroupConfig *CgroupConfig) error {
|
||||||
|
start := time.Now()
|
||||||
|
defer func() {
|
||||||
|
metrics.CgroupManagerLatency.WithLabelValues("create").Observe(metrics.SinceInMicroseconds(start))
|
||||||
|
}()
|
||||||
|
|
||||||
// we take the location in traditional cgroupfs format.
|
// we take the location in traditional cgroupfs format.
|
||||||
abstractCgroupFsName := string(cgroupConfig.Name)
|
abstractCgroupFsName := string(cgroupConfig.Name)
|
||||||
|
@ -29,7 +29,6 @@ go_library(
|
|||||||
"//pkg/api:go_default_library",
|
"//pkg/api:go_default_library",
|
||||||
"//pkg/api/v1:go_default_library",
|
"//pkg/api/v1:go_default_library",
|
||||||
"//pkg/kubelet/api/v1alpha1/runtime:go_default_library",
|
"//pkg/kubelet/api/v1alpha1/runtime:go_default_library",
|
||||||
"//pkg/kubelet/cm:go_default_library",
|
|
||||||
"//pkg/kubelet/events:go_default_library",
|
"//pkg/kubelet/events:go_default_library",
|
||||||
"//pkg/kubelet/util/format:go_default_library",
|
"//pkg/kubelet/util/format:go_default_library",
|
||||||
"//pkg/kubelet/util/ioutils:go_default_library",
|
"//pkg/kubelet/util/ioutils:go_default_library",
|
||||||
|
@ -33,7 +33,6 @@ import (
|
|||||||
"k8s.io/client-go/tools/record"
|
"k8s.io/client-go/tools/record"
|
||||||
"k8s.io/kubernetes/pkg/api/v1"
|
"k8s.io/kubernetes/pkg/api/v1"
|
||||||
runtimeapi "k8s.io/kubernetes/pkg/kubelet/api/v1alpha1/runtime"
|
runtimeapi "k8s.io/kubernetes/pkg/kubelet/api/v1alpha1/runtime"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/cm"
|
|
||||||
"k8s.io/kubernetes/pkg/kubelet/events"
|
"k8s.io/kubernetes/pkg/kubelet/events"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/util/format"
|
"k8s.io/kubernetes/pkg/kubelet/util/format"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/util/ioutils"
|
"k8s.io/kubernetes/pkg/kubelet/util/ioutils"
|
||||||
@ -53,7 +52,7 @@ type RuntimeHelper interface {
|
|||||||
GetClusterDNS(pod *v1.Pod) (dnsServers []string, dnsSearches []string, useClusterFirstPolicy bool, err error)
|
GetClusterDNS(pod *v1.Pod) (dnsServers []string, dnsSearches []string, useClusterFirstPolicy bool, err error)
|
||||||
// GetPodCgroupParent returns the the CgroupName identifer, and its literal cgroupfs form on the host
|
// GetPodCgroupParent returns the the CgroupName identifer, and its literal cgroupfs form on the host
|
||||||
// of a pod.
|
// of a pod.
|
||||||
GetPodCgroupParent(pod *v1.Pod) (cm.CgroupName, string)
|
GetPodCgroupParent(pod *v1.Pod) string
|
||||||
GetPodDir(podUID types.UID) string
|
GetPodDir(podUID types.UID) string
|
||||||
GeneratePodHostNameAndDomain(pod *v1.Pod) (hostname string, hostDomain string, err error)
|
GeneratePodHostNameAndDomain(pod *v1.Pod) (hostname string, hostDomain string, err error)
|
||||||
// GetExtraSupplementalGroupsForPod returns a list of the extra
|
// GetExtraSupplementalGroupsForPod returns a list of the extra
|
||||||
|
@ -20,7 +20,6 @@ go_library(
|
|||||||
tags = ["automanaged"],
|
tags = ["automanaged"],
|
||||||
deps = [
|
deps = [
|
||||||
"//pkg/api/v1:go_default_library",
|
"//pkg/api/v1:go_default_library",
|
||||||
"//pkg/kubelet/cm:go_default_library",
|
|
||||||
"//pkg/kubelet/container:go_default_library",
|
"//pkg/kubelet/container:go_default_library",
|
||||||
"//pkg/util/term:go_default_library",
|
"//pkg/util/term:go_default_library",
|
||||||
"//pkg/volume:go_default_library",
|
"//pkg/volume:go_default_library",
|
||||||
|
@ -19,7 +19,6 @@ package testing
|
|||||||
import (
|
import (
|
||||||
kubetypes "k8s.io/apimachinery/pkg/types"
|
kubetypes "k8s.io/apimachinery/pkg/types"
|
||||||
"k8s.io/kubernetes/pkg/api/v1"
|
"k8s.io/kubernetes/pkg/api/v1"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/cm"
|
|
||||||
kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
|
kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -41,8 +40,8 @@ func (f *FakeRuntimeHelper) GenerateRunContainerOptions(pod *v1.Pod, container *
|
|||||||
return &opts, false, nil
|
return &opts, false, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *FakeRuntimeHelper) GetPodCgroupParent(pod *v1.Pod) (cm.CgroupName, string) {
|
func (f *FakeRuntimeHelper) GetPodCgroupParent(pod *v1.Pod) string {
|
||||||
return "", ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *FakeRuntimeHelper) GetClusterDNS(pod *v1.Pod) ([]string, []string, bool, error) {
|
func (f *FakeRuntimeHelper) GetClusterDNS(pod *v1.Pod) ([]string, []string, bool, error) {
|
||||||
|
@ -267,9 +267,10 @@ func (kl *Kubelet) GeneratePodHostNameAndDomain(pod *v1.Pod) (string, string, er
|
|||||||
}
|
}
|
||||||
|
|
||||||
// GetPodCgroupParent gets pod cgroup parent from container manager.
|
// GetPodCgroupParent gets pod cgroup parent from container manager.
|
||||||
func (kl *Kubelet) GetPodCgroupParent(pod *v1.Pod) (cm.CgroupName, string) {
|
func (kl *Kubelet) GetPodCgroupParent(pod *v1.Pod) string {
|
||||||
pcm := kl.containerManager.NewPodContainerManager()
|
pcm := kl.containerManager.NewPodContainerManager()
|
||||||
return pcm.GetPodContainerName(pod)
|
_, cgroupParent := pcm.GetPodContainerName(pod)
|
||||||
|
return cgroupParent
|
||||||
}
|
}
|
||||||
|
|
||||||
// GenerateRunContainerOptions generates the RunContainerOptions, which can be used by
|
// GenerateRunContainerOptions generates the RunContainerOptions, which can be used by
|
||||||
@ -277,7 +278,7 @@ func (kl *Kubelet) GetPodCgroupParent(pod *v1.Pod) (cm.CgroupName, string) {
|
|||||||
func (kl *Kubelet) GenerateRunContainerOptions(pod *v1.Pod, container *v1.Container, podIP string) (*kubecontainer.RunContainerOptions, bool, error) {
|
func (kl *Kubelet) GenerateRunContainerOptions(pod *v1.Pod, container *v1.Container, podIP string) (*kubecontainer.RunContainerOptions, bool, error) {
|
||||||
var err error
|
var err error
|
||||||
useClusterFirstPolicy := false
|
useClusterFirstPolicy := false
|
||||||
_, cgroupParent := kl.GetPodCgroupParent(pod)
|
cgroupParent := kl.GetPodCgroupParent(pod)
|
||||||
opts := &kubecontainer.RunContainerOptions{CgroupParent: cgroupParent}
|
opts := &kubecontainer.RunContainerOptions{CgroupParent: cgroupParent}
|
||||||
hostname, hostDomainName, err := kl.GeneratePodHostNameAndDomain(pod)
|
hostname, hostDomainName, err := kl.GeneratePodHostNameAndDomain(pod)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -114,7 +114,7 @@ func (m *kubeGenericRuntimeManager) generatePodSandboxConfig(pod *v1.Pod, attemp
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_, cgroupParent := m.runtimeHelper.GetPodCgroupParent(pod)
|
cgroupParent := m.runtimeHelper.GetPodCgroupParent(pod)
|
||||||
podSandboxConfig.Linux = m.generatePodSandboxLinuxConfig(pod, cgroupParent)
|
podSandboxConfig.Linux = m.generatePodSandboxLinuxConfig(pod, cgroupParent)
|
||||||
if len(portMappings) > 0 {
|
if len(portMappings) > 0 {
|
||||||
podSandboxConfig.PortMappings = portMappings
|
podSandboxConfig.PortMappings = portMappings
|
||||||
|
@ -32,6 +32,7 @@ const (
|
|||||||
PodStartLatencyKey = "pod_start_latency_microseconds"
|
PodStartLatencyKey = "pod_start_latency_microseconds"
|
||||||
PodStatusLatencyKey = "generate_pod_status_latency_microseconds"
|
PodStatusLatencyKey = "generate_pod_status_latency_microseconds"
|
||||||
ContainerManagerOperationsKey = "container_manager_latency_microseconds"
|
ContainerManagerOperationsKey = "container_manager_latency_microseconds"
|
||||||
|
CgroupManagerOperationsKey = "cgroup_manager_latency_microseconds"
|
||||||
DockerOperationsLatencyKey = "docker_operations_latency_microseconds"
|
DockerOperationsLatencyKey = "docker_operations_latency_microseconds"
|
||||||
DockerOperationsKey = "docker_operations"
|
DockerOperationsKey = "docker_operations"
|
||||||
DockerOperationsErrorsKey = "docker_operations_errors"
|
DockerOperationsErrorsKey = "docker_operations_errors"
|
||||||
@ -90,6 +91,14 @@ var (
|
|||||||
},
|
},
|
||||||
[]string{"operation_type"},
|
[]string{"operation_type"},
|
||||||
)
|
)
|
||||||
|
CgroupManagerLatency = prometheus.NewSummaryVec(
|
||||||
|
prometheus.SummaryOpts{
|
||||||
|
Subsystem: KubeletSubsystem,
|
||||||
|
Name: CgroupManagerOperationsKey,
|
||||||
|
Help: "Latency in microseconds for cgroup manager operations. Broken down by method.",
|
||||||
|
},
|
||||||
|
[]string{"operation_type"},
|
||||||
|
)
|
||||||
PodWorkerStartLatency = prometheus.NewSummary(
|
PodWorkerStartLatency = prometheus.NewSummary(
|
||||||
prometheus.SummaryOpts{
|
prometheus.SummaryOpts{
|
||||||
Subsystem: KubeletSubsystem,
|
Subsystem: KubeletSubsystem,
|
||||||
@ -182,6 +191,7 @@ func Register(containerCache kubecontainer.RuntimeCache) {
|
|||||||
prometheus.MustRegister(PodStatusLatency)
|
prometheus.MustRegister(PodStatusLatency)
|
||||||
prometheus.MustRegister(DockerOperationsLatency)
|
prometheus.MustRegister(DockerOperationsLatency)
|
||||||
prometheus.MustRegister(ContainerManagerLatency)
|
prometheus.MustRegister(ContainerManagerLatency)
|
||||||
|
prometheus.MustRegister(CgroupManagerLatency)
|
||||||
prometheus.MustRegister(SyncPodsLatency)
|
prometheus.MustRegister(SyncPodsLatency)
|
||||||
prometheus.MustRegister(PodWorkerStartLatency)
|
prometheus.MustRegister(PodWorkerStartLatency)
|
||||||
prometheus.MustRegister(ContainersPerPodCount)
|
prometheus.MustRegister(ContainersPerPodCount)
|
||||||
|
@ -106,6 +106,7 @@ func GetKubeletLatencyMetrics(ms metrics.KubeletMetrics) KubeletLatencyMetrics {
|
|||||||
kubeletmetrics.PodStartLatencyKey,
|
kubeletmetrics.PodStartLatencyKey,
|
||||||
kubeletmetrics.PodStatusLatencyKey,
|
kubeletmetrics.PodStatusLatencyKey,
|
||||||
kubeletmetrics.ContainerManagerOperationsKey,
|
kubeletmetrics.ContainerManagerOperationsKey,
|
||||||
|
kubeletmetrics.CgroupManagerOperationsKey,
|
||||||
kubeletmetrics.DockerOperationsLatencyKey,
|
kubeletmetrics.DockerOperationsLatencyKey,
|
||||||
kubeletmetrics.PodWorkerStartLatencyKey,
|
kubeletmetrics.PodWorkerStartLatencyKey,
|
||||||
kubeletmetrics.PLEGRelistLatencyKey,
|
kubeletmetrics.PLEGRelistLatencyKey,
|
||||||
|
Loading…
Reference in New Issue
Block a user