mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-26 21:17:23 +00:00
Move GetZoneKey function to component-helpers
This commit is contained in:
parent
e4e9c31218
commit
af045087d9
@ -51,11 +51,11 @@ import (
|
|||||||
"k8s.io/client-go/util/flowcontrol"
|
"k8s.io/client-go/util/flowcontrol"
|
||||||
"k8s.io/client-go/util/workqueue"
|
"k8s.io/client-go/util/workqueue"
|
||||||
"k8s.io/component-base/metrics/prometheus/ratelimiter"
|
"k8s.io/component-base/metrics/prometheus/ratelimiter"
|
||||||
|
utilnode "k8s.io/component-helpers/node/topology"
|
||||||
kubeletapis "k8s.io/kubelet/pkg/apis"
|
kubeletapis "k8s.io/kubelet/pkg/apis"
|
||||||
"k8s.io/kubernetes/pkg/controller"
|
"k8s.io/kubernetes/pkg/controller"
|
||||||
"k8s.io/kubernetes/pkg/controller/nodelifecycle/scheduler"
|
"k8s.io/kubernetes/pkg/controller/nodelifecycle/scheduler"
|
||||||
nodeutil "k8s.io/kubernetes/pkg/controller/util/node"
|
nodeutil "k8s.io/kubernetes/pkg/controller/util/node"
|
||||||
utilnode "k8s.io/kubernetes/pkg/util/node"
|
|
||||||
taintutils "k8s.io/kubernetes/pkg/util/taints"
|
taintutils "k8s.io/kubernetes/pkg/util/taints"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -40,10 +40,10 @@ import (
|
|||||||
v1core "k8s.io/client-go/kubernetes/typed/core/v1"
|
v1core "k8s.io/client-go/kubernetes/typed/core/v1"
|
||||||
"k8s.io/client-go/tools/cache"
|
"k8s.io/client-go/tools/cache"
|
||||||
ref "k8s.io/client-go/tools/reference"
|
ref "k8s.io/client-go/tools/reference"
|
||||||
|
utilnode "k8s.io/component-helpers/node/topology"
|
||||||
"k8s.io/klog/v2"
|
"k8s.io/klog/v2"
|
||||||
"k8s.io/kubernetes/pkg/api/legacyscheme"
|
"k8s.io/kubernetes/pkg/api/legacyscheme"
|
||||||
api "k8s.io/kubernetes/pkg/apis/core"
|
api "k8s.io/kubernetes/pkg/apis/core"
|
||||||
utilnode "k8s.io/kubernetes/pkg/util/node"
|
|
||||||
|
|
||||||
jsonpatch "github.com/evanphx/json-patch"
|
jsonpatch "github.com/evanphx/json-patch"
|
||||||
)
|
)
|
||||||
|
@ -25,9 +25,9 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
appslisters "k8s.io/client-go/listers/apps/v1"
|
appslisters "k8s.io/client-go/listers/apps/v1"
|
||||||
corelisters "k8s.io/client-go/listers/core/v1"
|
corelisters "k8s.io/client-go/listers/core/v1"
|
||||||
|
utilnode "k8s.io/component-helpers/node/topology"
|
||||||
"k8s.io/kubernetes/pkg/scheduler/framework"
|
"k8s.io/kubernetes/pkg/scheduler/framework"
|
||||||
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/helper"
|
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/helper"
|
||||||
utilnode "k8s.io/kubernetes/pkg/util/node"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// SelectorSpread is a plugin that calculates selector spread priority.
|
// SelectorSpread is a plugin that calculates selector spread priority.
|
||||||
|
2
pkg/scheduler/internal/cache/node_tree.go
vendored
2
pkg/scheduler/internal/cache/node_tree.go
vendored
@ -21,8 +21,8 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
v1 "k8s.io/api/core/v1"
|
v1 "k8s.io/api/core/v1"
|
||||||
|
utilnode "k8s.io/component-helpers/node/topology"
|
||||||
"k8s.io/klog/v2"
|
"k8s.io/klog/v2"
|
||||||
utilnode "k8s.io/kubernetes/pkg/util/node"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// nodeTree is a tree-like data structure that holds node names in each zone. Zone names are
|
// nodeTree is a tree-like data structure that holds node names in each zone. Zone names are
|
||||||
|
@ -174,42 +174,6 @@ func GetNodeIP(client clientset.Interface, name string) net.IP {
|
|||||||
return nodeIP
|
return nodeIP
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetZoneKey is a helper function that builds a string identifier that is unique per failure-zone;
|
|
||||||
// it returns empty-string for no zone.
|
|
||||||
// Since there are currently two separate zone keys:
|
|
||||||
// * "failure-domain.beta.kubernetes.io/zone"
|
|
||||||
// * "topology.kubernetes.io/zone"
|
|
||||||
// GetZoneKey will first check failure-domain.beta.kubernetes.io/zone and if not exists, will then check
|
|
||||||
// topology.kubernetes.io/zone
|
|
||||||
func GetZoneKey(node *v1.Node) string {
|
|
||||||
labels := node.Labels
|
|
||||||
if labels == nil {
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: "failure-domain.beta..." names are deprecated, but will
|
|
||||||
// stick around a long time due to existing on old extant objects like PVs.
|
|
||||||
// Maybe one day we can stop considering them (see #88493).
|
|
||||||
zone, ok := labels[v1.LabelFailureDomainBetaZone]
|
|
||||||
if !ok {
|
|
||||||
zone, _ = labels[v1.LabelTopologyZone]
|
|
||||||
}
|
|
||||||
|
|
||||||
region, ok := labels[v1.LabelFailureDomainBetaRegion]
|
|
||||||
if !ok {
|
|
||||||
region, _ = labels[v1.LabelTopologyRegion]
|
|
||||||
}
|
|
||||||
|
|
||||||
if region == "" && zone == "" {
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
// We include the null character just in case region or failureDomain has a colon
|
|
||||||
// (We do assume there's no null characters in a region or failureDomain)
|
|
||||||
// As a nice side-benefit, the null character is not printed by fmt.Print or glog
|
|
||||||
return region + ":\x00:" + zone
|
|
||||||
}
|
|
||||||
|
|
||||||
type nodeForConditionPatch struct {
|
type nodeForConditionPatch struct {
|
||||||
Status nodeStatusForPatch `json:"status"`
|
Status nodeStatusForPatch `json:"status"`
|
||||||
}
|
}
|
||||||
|
@ -266,84 +266,3 @@ func TestGetHostname(t *testing.T) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func Test_GetZoneKey(t *testing.T) {
|
|
||||||
tests := []struct {
|
|
||||||
name string
|
|
||||||
node *v1.Node
|
|
||||||
zone string
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
name: "has no zone or region keys",
|
|
||||||
node: &v1.Node{
|
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
|
||||||
Labels: map[string]string{},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
zone: "",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "has beta zone and region keys",
|
|
||||||
node: &v1.Node{
|
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
|
||||||
Labels: map[string]string{
|
|
||||||
v1.LabelFailureDomainBetaZone: "zone1",
|
|
||||||
v1.LabelFailureDomainBetaRegion: "region1",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
zone: "region1:\x00:zone1",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "has GA zone and region keys",
|
|
||||||
node: &v1.Node{
|
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
|
||||||
Labels: map[string]string{
|
|
||||||
v1.LabelTopologyZone: "zone1",
|
|
||||||
v1.LabelTopologyRegion: "region1",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
zone: "region1:\x00:zone1",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "has both beta and GA zone and region keys",
|
|
||||||
node: &v1.Node{
|
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
|
||||||
Labels: map[string]string{
|
|
||||||
v1.LabelTopologyZone: "zone1",
|
|
||||||
v1.LabelTopologyRegion: "region1",
|
|
||||||
v1.LabelFailureDomainBetaZone: "zone1",
|
|
||||||
v1.LabelFailureDomainBetaRegion: "region1",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
zone: "region1:\x00:zone1",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "has both beta and GA zone and region keys, beta labels take precedent",
|
|
||||||
node: &v1.Node{
|
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
|
||||||
Labels: map[string]string{
|
|
||||||
v1.LabelTopologyZone: "zone1",
|
|
||||||
v1.LabelTopologyRegion: "region1",
|
|
||||||
v1.LabelFailureDomainBetaZone: "zone2",
|
|
||||||
v1.LabelFailureDomainBetaRegion: "region2",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
zone: "region2:\x00:zone2",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, test := range tests {
|
|
||||||
t.Run(test.name, func(t *testing.T) {
|
|
||||||
zone := GetZoneKey(test.node)
|
|
||||||
if zone != test.zone {
|
|
||||||
t.Logf("actual zone key: %q", zone)
|
|
||||||
t.Logf("expected zone key: %q", test.zone)
|
|
||||||
t.Errorf("unexpected zone key")
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
8
staging/src/k8s.io/component-helpers/node/OWNERS
Normal file
8
staging/src/k8s.io/component-helpers/node/OWNERS
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
# See the OWNERS docs at https://go.k8s.io/owners
|
||||||
|
|
||||||
|
approvers:
|
||||||
|
- sig-node-approvers
|
||||||
|
reviewers:
|
||||||
|
- sig-node-reviewers
|
||||||
|
labels:
|
||||||
|
- sig/node
|
@ -0,0 +1,57 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2020 The Kubernetes Authors.
|
||||||
|
|
||||||
|
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 topology
|
||||||
|
|
||||||
|
import (
|
||||||
|
"k8s.io/api/core/v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
// GetZoneKey is a helper function that builds a string identifier that is unique per failure-zone;
|
||||||
|
// it returns empty-string for no zone.
|
||||||
|
// Since there are currently two separate zone keys:
|
||||||
|
// * "failure-domain.beta.kubernetes.io/zone"
|
||||||
|
// * "topology.kubernetes.io/zone"
|
||||||
|
// GetZoneKey will first check failure-domain.beta.kubernetes.io/zone and if not exists, will then check
|
||||||
|
// topology.kubernetes.io/zone
|
||||||
|
func GetZoneKey(node *v1.Node) string {
|
||||||
|
labels := node.Labels
|
||||||
|
if labels == nil {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: "failure-domain.beta..." names are deprecated, but will
|
||||||
|
// stick around a long time due to existing on old extant objects like PVs.
|
||||||
|
// Maybe one day we can stop considering them (see #88493).
|
||||||
|
zone, ok := labels[v1.LabelFailureDomainBetaZone]
|
||||||
|
if !ok {
|
||||||
|
zone, _ = labels[v1.LabelTopologyZone]
|
||||||
|
}
|
||||||
|
|
||||||
|
region, ok := labels[v1.LabelFailureDomainBetaRegion]
|
||||||
|
if !ok {
|
||||||
|
region, _ = labels[v1.LabelTopologyRegion]
|
||||||
|
}
|
||||||
|
|
||||||
|
if region == "" && zone == "" {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
// We include the null character just in case region or failureDomain has a colon
|
||||||
|
// (We do assume there's no null characters in a region or failureDomain)
|
||||||
|
// As a nice side-benefit, the null character is not printed by fmt.Print or glog
|
||||||
|
return region + ":\x00:" + zone
|
||||||
|
}
|
@ -0,0 +1,104 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2020 The Kubernetes Authors.
|
||||||
|
|
||||||
|
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 topology
|
||||||
|
|
||||||
|
import (
|
||||||
|
"k8s.io/api/core/v1"
|
||||||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Test_GetZoneKey(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
node *v1.Node
|
||||||
|
zone string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "has no zone or region keys",
|
||||||
|
node: &v1.Node{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Labels: map[string]string{},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
zone: "",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "has beta zone and region keys",
|
||||||
|
node: &v1.Node{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Labels: map[string]string{
|
||||||
|
v1.LabelFailureDomainBetaZone: "zone1",
|
||||||
|
v1.LabelFailureDomainBetaRegion: "region1",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
zone: "region1:\x00:zone1",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "has GA zone and region keys",
|
||||||
|
node: &v1.Node{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Labels: map[string]string{
|
||||||
|
v1.LabelTopologyZone: "zone1",
|
||||||
|
v1.LabelTopologyRegion: "region1",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
zone: "region1:\x00:zone1",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "has both beta and GA zone and region keys",
|
||||||
|
node: &v1.Node{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Labels: map[string]string{
|
||||||
|
v1.LabelTopologyZone: "zone1",
|
||||||
|
v1.LabelTopologyRegion: "region1",
|
||||||
|
v1.LabelFailureDomainBetaZone: "zone1",
|
||||||
|
v1.LabelFailureDomainBetaRegion: "region1",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
zone: "region1:\x00:zone1",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "has both beta and GA zone and region keys, beta labels take precedent",
|
||||||
|
node: &v1.Node{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Labels: map[string]string{
|
||||||
|
v1.LabelTopologyZone: "zone1",
|
||||||
|
v1.LabelTopologyRegion: "region1",
|
||||||
|
v1.LabelFailureDomainBetaZone: "zone2",
|
||||||
|
v1.LabelFailureDomainBetaRegion: "region2",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
zone: "region2:\x00:zone2",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, test := range tests {
|
||||||
|
t.Run(test.name, func(t *testing.T) {
|
||||||
|
zone := GetZoneKey(test.node)
|
||||||
|
if zone != test.zone {
|
||||||
|
t.Logf("actual zone key: %q", zone)
|
||||||
|
t.Logf("expected zone key: %q", test.zone)
|
||||||
|
t.Errorf("unexpected zone key")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
1
vendor/modules.txt
vendored
1
vendor/modules.txt
vendored
@ -2240,6 +2240,7 @@ k8s.io/component-base/version/verflag
|
|||||||
k8s.io/component-helpers/apimachinery/lease
|
k8s.io/component-helpers/apimachinery/lease
|
||||||
k8s.io/component-helpers/auth/rbac/reconciliation
|
k8s.io/component-helpers/auth/rbac/reconciliation
|
||||||
k8s.io/component-helpers/auth/rbac/validation
|
k8s.io/component-helpers/auth/rbac/validation
|
||||||
|
k8s.io/component-helpers/node/topology
|
||||||
k8s.io/component-helpers/scheduling/corev1
|
k8s.io/component-helpers/scheduling/corev1
|
||||||
k8s.io/component-helpers/scheduling/corev1/nodeaffinity
|
k8s.io/component-helpers/scheduling/corev1/nodeaffinity
|
||||||
k8s.io/component-helpers/storage/volume
|
k8s.io/component-helpers/storage/volume
|
||||||
|
Loading…
Reference in New Issue
Block a user