Merge pull request #101534 from kassarl/issue-98281

Use GA topology labels for Azuredisk
This commit is contained in:
Kubernetes Prow Robot 2021-05-07 13:32:00 -07:00 committed by GitHub
commit 160cdbbdca
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 39 additions and 24 deletions

View File

@ -361,19 +361,19 @@ func (p *azureDiskProvisioner) Provision(selectedNode *v1.Node, allowedTopologie
})
}
} else {
// Set node affinity labels based on fault domains.
// Set node affinity labels based on topology.
// This is required because unzoned AzureDisk can't be attached to zoned nodes.
// There are at most 3 fault domains available in each region.
// There are at most 3 Availability Zones per supported Azure region.
// Refer https://docs.microsoft.com/en-us/azure/virtual-machines/windows/manage-availability.
for i := 0; i < 3; i++ {
requirements := []v1.NodeSelectorRequirement{
{
Key: v1.LabelFailureDomainBetaRegion,
Key: v1.LabelTopologyRegion,
Operator: v1.NodeSelectorOpIn,
Values: []string{diskController.GetLocation()},
},
{
Key: v1.LabelFailureDomainBetaZone,
Key: v1.LabelTopologyZone,
Operator: v1.NodeSelectorOpIn,
Values: []string{strconv.Itoa(i)},
},

View File

@ -269,6 +269,11 @@ func TestTranslateInTreeStorageClassToCSI(t *testing.T) {
},
{
name: "some translated topology",
options: NewStorageClass(map[string]string{}, generateToplogySelectors(v1.LabelTopologyZone, []string{"foo"})),
expOptions: NewStorageClass(map[string]string{}, generateToplogySelectors(AzureDiskTopologyKey, []string{"foo"})),
},
{
name: "some translated topology with beta labels",
options: NewStorageClass(map[string]string{}, generateToplogySelectors(v1.LabelFailureDomainBetaZone, []string{"foo"})),
expOptions: NewStorageClass(map[string]string{}, generateToplogySelectors(AzureDiskTopologyKey, []string{"foo"})),
},

View File

@ -92,12 +92,6 @@ const (
externalResourceGroupLabel = "kubernetes.azure.com/resource-group"
managedByAzureLabel = "kubernetes.azure.com/managed"
// LabelFailureDomainBetaZone refer to https://github.com/kubernetes/api/blob/8519c5ea46199d57724725d5b969c5e8e0533692/core/v1/well_known_labels.go#L22-L23
LabelFailureDomainBetaZone = "failure-domain.beta.kubernetes.io/zone"
// LabelFailureDomainBetaRegion failure-domain region label
LabelFailureDomainBetaRegion = "failure-domain.beta.kubernetes.io/region"
)
const (
@ -751,8 +745,12 @@ func (az *Cloud) SetInformers(informerFactory informers.SharedInformerFactory) {
UpdateFunc: func(prev, obj interface{}) {
prevNode := prev.(*v1.Node)
newNode := obj.(*v1.Node)
if newNode.Labels[LabelFailureDomainBetaZone] ==
prevNode.Labels[LabelFailureDomainBetaZone] {
if newNode.Labels[v1.LabelFailureDomainBetaZone] ==
prevNode.Labels[v1.LabelFailureDomainBetaZone] {
return
}
if newNode.Labels[v1.LabelTopologyZone] ==
prevNode.Labels[v1.LabelTopologyZone] {
return
}
az.updateNodeCaches(prevNode, newNode)
@ -785,11 +783,13 @@ func (az *Cloud) updateNodeCaches(prevNode, newNode *v1.Node) {
defer az.nodeCachesLock.Unlock()
if prevNode != nil {
// Remove from nodeNames cache.
az.nodeNames.Delete(prevNode.ObjectMeta.Name)
// Remove from nodeZones cache.
prevZone, ok := prevNode.ObjectMeta.Labels[LabelFailureDomainBetaZone]
// Remove from nodeZones cache
prevZone, ok := prevNode.ObjectMeta.Labels[v1.LabelTopologyZone]
if ok && az.isAvailabilityZone(prevZone) {
az.nodeZones[prevZone].Delete(prevNode.ObjectMeta.Name)
if az.nodeZones[prevZone].Len() == 0 {
@ -797,6 +797,15 @@ func (az *Cloud) updateNodeCaches(prevNode, newNode *v1.Node) {
}
}
//Remove from nodeZones cache if using depreciated LabelFailureDomainBetaZone
prevZoneFailureDomain, ok := prevNode.ObjectMeta.Labels[v1.LabelFailureDomainBetaZone]
if ok && az.isAvailabilityZone(prevZoneFailureDomain) {
az.nodeZones[prevZone].Delete(prevNode.ObjectMeta.Name)
if az.nodeZones[prevZone].Len() == 0 {
az.nodeZones[prevZone] = nil
}
}
// Remove from nodeResourceGroups cache.
_, ok = prevNode.ObjectMeta.Labels[externalResourceGroupLabel]
if ok {
@ -815,7 +824,7 @@ func (az *Cloud) updateNodeCaches(prevNode, newNode *v1.Node) {
az.nodeNames.Insert(newNode.ObjectMeta.Name)
// Add to nodeZones cache.
newZone, ok := newNode.ObjectMeta.Labels[LabelFailureDomainBetaZone]
newZone, ok := newNode.ObjectMeta.Labels[v1.LabelTopologyZone]
if ok && az.isAvailabilityZone(newZone) {
if az.nodeZones[newZone] == nil {
az.nodeZones[newZone] = sets.NewString()

View File

@ -355,7 +355,7 @@ func (c *Cloud) GetAzureDiskLabels(diskURI string) (map[string]string, error) {
}
labels := map[string]string{
LabelFailureDomainBetaRegion: c.Location,
v1.LabelTopologyRegion: c.Location,
}
// no azure credential is set, return nil
if c.DisksClient == nil {
@ -384,6 +384,6 @@ func (c *Cloud) GetAzureDiskLabels(diskURI string) (map[string]string, error) {
zone := c.makeZone(c.Location, zoneID)
klog.V(4).Infof("Got zone %q for Azure disk %q", zone, diskName)
labels[LabelFailureDomainBetaZone] = zone
labels[v1.LabelTopologyZone] = zone
return labels, nil
}

View File

@ -427,8 +427,8 @@ func TestGetLabelsForVolume(t *testing.T) {
},
existedDisk: compute.Disk{Name: to.StringPtr(diskName), DiskProperties: &compute.DiskProperties{DiskSizeGB: &diskSizeGB}, Zones: &[]string{"1"}},
expected: map[string]string{
LabelFailureDomainBetaRegion: testCloud0.Location,
LabelFailureDomainBetaZone: testCloud0.makeZone(testCloud0.Location, 1),
v1.LabelTopologyRegion: testCloud0.Location,
v1.LabelTopologyZone: testCloud0.makeZone(testCloud0.Location, 1),
},
expectedErr: false,
},
@ -464,7 +464,7 @@ func TestGetLabelsForVolume(t *testing.T) {
},
existedDisk: compute.Disk{Name: to.StringPtr(diskName), DiskProperties: &compute.DiskProperties{DiskSizeGB: &diskSizeGB}},
expected: map[string]string{
LabelFailureDomainBetaRegion: testCloud0.Location,
v1.LabelTopologyRegion: testCloud0.Location,
},
expectedErr: false,
expectedErrMsg: nil,

View File

@ -3249,9 +3249,10 @@ func TestUpdateNodeCaches(t *testing.T) {
prevNode := v1.Node{
ObjectMeta: metav1.ObjectMeta{
Labels: map[string]string{
LabelFailureDomainBetaZone: zone,
externalResourceGroupLabel: "true",
managedByAzureLabel: "false",
v1.LabelFailureDomainBetaZone: zone,
v1.LabelTopologyZone: zone,
externalResourceGroupLabel: "true",
managedByAzureLabel: "false",
},
Name: "prevNode",
},
@ -3266,7 +3267,7 @@ func TestUpdateNodeCaches(t *testing.T) {
newNode := v1.Node{
ObjectMeta: metav1.ObjectMeta{
Labels: map[string]string{
LabelFailureDomainBetaZone: zone,
v1.LabelTopologyZone: zone,
externalResourceGroupLabel: "true",
managedByAzureLabel: "false",
},