From 6d8a82f423e08f9960b8899c6a8f5f8caa6c7859 Mon Sep 17 00:00:00 2001 From: Damien Grisonnet Date: Wed, 2 Dec 2020 18:28:56 +0100 Subject: [PATCH] go.mod: bump metrics-server Include a fix to the NodeMetrics and PodMetrics APIs to match k8s conventions. - NodeMetrics and PodMetrics now have labels as they can be filtered by them - Field selector is now applied to NodeMetrics and PodMetrics instead of Nodes and Pods Signed-off-by: Damien Grisonnet --- go.mod | 2 +- go.sum | 4 +- vendor/modules.txt | 2 +- .../metrics-server/pkg/api/node.go | 67 ++++++++++++------- .../sigs.k8s.io/metrics-server/pkg/api/pod.go | 17 +++++ 5 files changed, 63 insertions(+), 29 deletions(-) diff --git a/go.mod b/go.mod index d2245609..f0192e3e 100644 --- a/go.mod +++ b/go.mod @@ -23,7 +23,7 @@ require ( k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6 k8s.io/metrics v0.19.3 k8s.io/sample-apiserver v0.18.5 - sigs.k8s.io/metrics-server v0.3.7-0.20201028092756-2a1d1385123b + sigs.k8s.io/metrics-server v0.4.1-0.20201126131427-ebfc64a74ae4 ) // forced by the inclusion of sigs.k8s.io/metrics-server's use of this in their go.mod diff --git a/go.sum b/go.sum index ed6bc93a..5ef99793 100644 --- a/go.sum +++ b/go.sum @@ -725,8 +725,8 @@ sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7 h1:uuHDyjllyzRyCI sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.9 h1:rusRLrDhjBp6aYtl9sGEvQJr6faoHoDLd0YcUBTZguI= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.9/go.mod h1:dzAXnQbTRyDlZPJX2SUPEqvnB+j7AJjtlox7PEwigU0= -sigs.k8s.io/metrics-server v0.3.7-0.20201028092756-2a1d1385123b h1:k12QeCO75SLSkSwHNlZuj42D69i851Lx2qjGEtubB2M= -sigs.k8s.io/metrics-server v0.3.7-0.20201028092756-2a1d1385123b/go.mod h1:799PonU8Bq6Yj4ZXBhZxRt86C8Zv9tvrNypHVrduK/I= +sigs.k8s.io/metrics-server v0.4.1-0.20201126131427-ebfc64a74ae4 h1:7xwQXqnQnBCVgx0ywo/1g0A3HWsHNMDU7unQv9v8oX4= +sigs.k8s.io/metrics-server v0.4.1-0.20201126131427-ebfc64a74ae4/go.mod h1:799PonU8Bq6Yj4ZXBhZxRt86C8Zv9tvrNypHVrduK/I= sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= sigs.k8s.io/structured-merge-diff/v3 v3.0.0 h1:dOmIZBMfhcHS09XZkMyUgkq5trg3/jRyJYFZUiaOp8E= sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= diff --git a/vendor/modules.txt b/vendor/modules.txt index 2a6212bf..2c7994d9 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -808,7 +808,7 @@ k8s.io/utils/trace # sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.9 sigs.k8s.io/apiserver-network-proxy/konnectivity-client/pkg/client sigs.k8s.io/apiserver-network-proxy/konnectivity-client/proto/client -# sigs.k8s.io/metrics-server v0.3.7-0.20201028092756-2a1d1385123b +# sigs.k8s.io/metrics-server v0.4.1-0.20201126131427-ebfc64a74ae4 sigs.k8s.io/metrics-server/pkg/api # sigs.k8s.io/structured-merge-diff/v4 v4.0.1 sigs.k8s.io/structured-merge-diff/v4/fieldpath diff --git a/vendor/sigs.k8s.io/metrics-server/pkg/api/node.go b/vendor/sigs.k8s.io/metrics-server/pkg/api/node.go index 7cae179f..deb528c3 100644 --- a/vendor/sigs.k8s.io/metrics-server/pkg/api/node.go +++ b/vendor/sigs.k8s.io/metrics-server/pkg/api/node.go @@ -84,41 +84,53 @@ func (m *nodeMetrics) List(ctx context.Context, options *metainternalversion.Lis klog.Error(errMsg) return &metrics.NodeMetricsList{}, errMsg } - if options != nil && options.FieldSelector != nil { - newNodes := make([]*v1.Node, 0, len(nodes)) - fields := make(fields.Set, 2) - for _, node := range nodes { - for k := range fields { - delete(fields, k) - } - fieldsSet := generic.AddObjectMetaFieldsSet(fields, &node.ObjectMeta, true) - if !options.FieldSelector.Matches(fieldsSet) { - continue - } - newNodes = append(newNodes, node) - } - nodes = newNodes - } - names := make([]string, len(nodes)) - for i, node := range nodes { - names[i] = node.Name - } // maintain the same ordering invariant as the Kube API would over nodes - sort.Strings(names) + sort.Slice(nodes, func(i, j int) bool { + return nodes[i].Name < nodes[j].Name + }) - metricsItems, err := m.getNodeMetrics(names...) + metricsItems, err := m.getNodeMetrics(nodes...) if err != nil { errMsg := fmt.Errorf("Error while fetching node metrics for selector %v: %v", labelSelector, err) klog.Error(errMsg) return &metrics.NodeMetricsList{}, errMsg } + if options != nil && options.FieldSelector != nil { + newMetrics := make([]metrics.NodeMetrics, 0, len(metricsItems)) + fields := make(fields.Set, 2) + for _, metric := range metricsItems { + for k := range fields { + delete(fields, k) + } + fieldsSet := generic.AddObjectMetaFieldsSet(fields, &metric.ObjectMeta, false) + if !options.FieldSelector.Matches(fieldsSet) { + continue + } + newMetrics = append(newMetrics, metric) + } + metricsItems = newMetrics + } + return &metrics.NodeMetricsList{Items: metricsItems}, nil } func (m *nodeMetrics) Get(ctx context.Context, name string, opts *metav1.GetOptions) (runtime.Object, error) { - nodeMetrics, err := m.getNodeMetrics(name) + node, err := m.nodeLister.Get(name) + if err != nil { + errMsg := fmt.Errorf("Error while getting node %v: %v", name, err) + klog.Error(errMsg) + if errors.IsNotFound(err) { + // return not-found errors directly + return nil, err + } + return nil, errMsg + } + if node == nil { + return nil, errors.NewNotFound(m.groupResource, name) + } + nodeMetrics, err := m.getNodeMetrics(node) if err == nil && len(nodeMetrics) == 0 { err = fmt.Errorf("no metrics known for node %q", name) } @@ -188,18 +200,23 @@ func addNodeMetricsToTable(table *metav1beta1.Table, nodes ...metrics.NodeMetric } } -func (m *nodeMetrics) getNodeMetrics(names ...string) ([]metrics.NodeMetrics, error) { +func (m *nodeMetrics) getNodeMetrics(nodes ...*v1.Node) ([]metrics.NodeMetrics, error) { + names := make([]string, len(nodes)) + for i, node := range nodes { + names[i] = node.Name + } timestamps, usages := m.metrics.GetNodeMetrics(names...) res := make([]metrics.NodeMetrics, 0, len(names)) - for i, name := range names { + for i, node := range nodes { if usages[i] == nil { continue } res = append(res, metrics.NodeMetrics{ ObjectMeta: metav1.ObjectMeta{ - Name: name, + Name: node.Name, CreationTimestamp: metav1.NewTime(myClock.Now()), + Labels: node.Labels, }, Timestamp: metav1.NewTime(timestamps[i].Timestamp), Window: metav1.Duration{Duration: timestamps[i].Window}, diff --git a/vendor/sigs.k8s.io/metrics-server/pkg/api/pod.go b/vendor/sigs.k8s.io/metrics-server/pkg/api/pod.go index 81131cde..afc55e94 100644 --- a/vendor/sigs.k8s.io/metrics-server/pkg/api/pod.go +++ b/vendor/sigs.k8s.io/metrics-server/pkg/api/pod.go @@ -120,6 +120,22 @@ func (m *podMetrics) List(ctx context.Context, options *metainternalversion.List return &metrics.PodMetricsList{}, errMsg } + if options != nil && options.FieldSelector != nil { + newMetrics := make([]metrics.PodMetrics, 0, len(metricsItems)) + fields := make(fields.Set, 2) + for _, metric := range metricsItems { + for k := range fields { + delete(fields, k) + } + fieldsSet := generic.AddObjectMetaFieldsSet(fields, &metric.ObjectMeta, true) + if !options.FieldSelector.Matches(fieldsSet) { + continue + } + newMetrics = append(newMetrics, metric) + } + metricsItems = newMetrics + } + return &metrics.PodMetricsList{Items: metricsItems}, nil } @@ -246,6 +262,7 @@ func (m *podMetrics) getPodMetrics(pods ...*v1.Pod) ([]metrics.PodMetrics, error Name: pod.Name, Namespace: pod.Namespace, CreationTimestamp: metav1.NewTime(myClock.Now()), + Labels: pod.Labels, }, Timestamp: metav1.NewTime(timestamps[i].Timestamp), Window: metav1.Duration{Duration: timestamps[i].Window},