From b20236497bf8c836d88522a01969815c81720579 Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Fri, 22 May 2020 22:41:33 +0200 Subject: [PATCH] k8s,node: Reuse retrieveNodeInformation to retrieve node labels When creating the host endpoint, we need to retrieve existing node labels. Instead of making a new API call, we can reuse retrieveNodeInformation() to get those labels. Signed-off-by: Paul Chaignon --- pkg/endpointmanager/manager.go | 16 +++++--------- pkg/k8s/init.go | 2 ++ pkg/k8s/node.go | 2 ++ pkg/k8s/node_test.go | 4 ++++ pkg/node/labels.go | 29 +++++++++++++++++++++++++ pkg/node/types/node.go | 3 +++ pkg/node/types/zz_generated.deepcopy.go | 7 ++++++ 7 files changed, 52 insertions(+), 11 deletions(-) create mode 100644 pkg/node/labels.go diff --git a/pkg/endpointmanager/manager.go b/pkg/endpointmanager/manager.go index d9d0d2250d81..1e9613947d2f 100644 --- a/pkg/endpointmanager/manager.go +++ b/pkg/endpointmanager/manager.go @@ -27,7 +27,6 @@ import ( "github.com/cilium/cilium/pkg/endpoint/regeneration" "github.com/cilium/cilium/pkg/endpointmanager/idallocator" "github.com/cilium/cilium/pkg/identity/cache" - "github.com/cilium/cilium/pkg/k8s" "github.com/cilium/cilium/pkg/labels" "github.com/cilium/cilium/pkg/labelsfilter" "github.com/cilium/cilium/pkg/lock" @@ -35,6 +34,7 @@ import ( "github.com/cilium/cilium/pkg/logging/logfields" "github.com/cilium/cilium/pkg/metrics" monitorAPI "github.com/cilium/cilium/pkg/monitor/api" + "github.com/cilium/cilium/pkg/node" "github.com/cilium/cilium/pkg/option" "github.com/cilium/cilium/pkg/policy" "github.com/prometheus/client_golang/prometheus" @@ -479,16 +479,10 @@ func (mgr *EndpointManager) AddHostEndpoint(ctx context.Context, owner regenerat epLabels := labels.Labels{} epLabels.MergeLabels(labels.LabelHost) - if k8s.IsEnabled() { - // Retrieve k8s labels. - if k8sNode, err := k8s.GetNode(k8s.Client(), nodeName); err != nil { - log.WithError(err).Warning("Kubernetes node resource representing own node is not available, cannot set Labels") - } else { - newLabels := labels.Map2Labels(k8sNode.GetLabels(), labels.LabelSourceK8s) - newIdtyLabels, _ := labelsfilter.Filter(newLabels) - epLabels.MergeLabels(newIdtyLabels) - } - } + // Initialize with known node labels. + newLabels := labels.Map2Labels(node.GetLabels(), labels.LabelSourceK8s) + newIdtyLabels, _ := labelsfilter.Filter(newLabels) + epLabels.MergeLabels(newIdtyLabels) // Give the endpoint a security identity newCtx, cancel := context.WithTimeout(ctx, launchTime) diff --git a/pkg/k8s/init.go b/pkg/k8s/init.go index 06056c453add..55c77c4feb96 100644 --- a/pkg/k8s/init.go +++ b/pkg/k8s/init.go @@ -226,6 +226,8 @@ func GetNodeSpec(nodeName string) error { if nodeIP6 != nil { node.SetIPv6(nodeIP6) } + + node.SetLabels(n.Labels) } else { // if node resource could not be received, fail if // PodCIDR requirement has been requested diff --git a/pkg/k8s/node.go b/pkg/k8s/node.go index abb52da812f7..77c215f7aba7 100644 --- a/pkg/k8s/node.go +++ b/pkg/k8s/node.go @@ -204,6 +204,8 @@ func ParseNode(k8sNode *slim_corev1.Node, source source.Source) *nodeTypes.Node } } + newNode.Labels = k8sNode.GetLabels() + return newNode } diff --git a/pkg/k8s/node_test.go b/pkg/k8s/node_test.go index 61bd6b6920a6..363ee5e53c98 100644 --- a/pkg/k8s/node_test.go +++ b/pkg/k8s/node_test.go @@ -38,6 +38,9 @@ func (s *K8sSuite) TestParseNode(c *C) { annotation.V4CIDRName: "10.254.0.0/16", annotation.V6CIDRName: "f00d:aaaa:bbbb:cccc:dddd:eeee::/112", }, + Labels: map[string]string{ + "type": "m5.xlarge", + }, }, Spec: slim_corev1.NodeSpec{ PodCIDR: "10.1.0.0/16", @@ -50,6 +53,7 @@ func (s *K8sSuite) TestParseNode(c *C) { c.Assert(n.IPv4AllocCIDR.String(), Equals, "10.1.0.0/16") c.Assert(n.IPv6AllocCIDR, NotNil) c.Assert(n.IPv6AllocCIDR.String(), Equals, "f00d:aaaa:bbbb:cccc:dddd:eeee::/112") + c.Assert(n.Labels["type"], Equals, "m5.xlarge") // No IPv6 annotation k8sNode = &slim_corev1.Node{ diff --git a/pkg/node/labels.go b/pkg/node/labels.go new file mode 100644 index 000000000000..f10334a34b62 --- /dev/null +++ b/pkg/node/labels.go @@ -0,0 +1,29 @@ +// Copyright 2020 Authors of Cilium +// +// 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 node + +var ( + labels map[string]string +) + +// GetLabels returns the labels of this node. +func GetLabels() map[string]string { + return labels +} + +// SetLabels sets the labels of this node. +func SetLabels(l map[string]string) { + labels = l +} diff --git a/pkg/node/types/node.go b/pkg/node/types/node.go index c3059c3e78a7..a7469d5a5757 100644 --- a/pkg/node/types/node.go +++ b/pkg/node/types/node.go @@ -166,6 +166,9 @@ type Node struct { // Key index used for transparent encryption or 0 for no encryption EncryptionKey uint8 + + // Node labels + Labels map[string]string } // Fullname returns the node's full name including the cluster name if a diff --git a/pkg/node/types/zz_generated.deepcopy.go b/pkg/node/types/zz_generated.deepcopy.go index 2d574b739e06..deb65c1322ee 100644 --- a/pkg/node/types/zz_generated.deepcopy.go +++ b/pkg/node/types/zz_generated.deepcopy.go @@ -71,6 +71,13 @@ func (in *Node) DeepCopyInto(out *Node) { *out = make(net.IP, len(*in)) copy(*out, *in) } + if in.Labels != nil { + in, out := &in.Labels, &out.Labels + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } return }