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 { } 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. // 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. // Refer https://docs.microsoft.com/en-us/azure/virtual-machines/windows/manage-availability.
for i := 0; i < 3; i++ { for i := 0; i < 3; i++ {
requirements := []v1.NodeSelectorRequirement{ requirements := []v1.NodeSelectorRequirement{
{ {
Key: v1.LabelFailureDomainBetaRegion, Key: v1.LabelTopologyRegion,
Operator: v1.NodeSelectorOpIn, Operator: v1.NodeSelectorOpIn,
Values: []string{diskController.GetLocation()}, Values: []string{diskController.GetLocation()},
}, },
{ {
Key: v1.LabelFailureDomainBetaZone, Key: v1.LabelTopologyZone,
Operator: v1.NodeSelectorOpIn, Operator: v1.NodeSelectorOpIn,
Values: []string{strconv.Itoa(i)}, Values: []string{strconv.Itoa(i)},
}, },

View File

@ -269,6 +269,11 @@ func TestTranslateInTreeStorageClassToCSI(t *testing.T) {
}, },
{ {
name: "some translated topology", 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"})), options: NewStorageClass(map[string]string{}, generateToplogySelectors(v1.LabelFailureDomainBetaZone, []string{"foo"})),
expOptions: NewStorageClass(map[string]string{}, generateToplogySelectors(AzureDiskTopologyKey, []string{"foo"})), expOptions: NewStorageClass(map[string]string{}, generateToplogySelectors(AzureDiskTopologyKey, []string{"foo"})),
}, },

View File

@ -92,12 +92,6 @@ const (
externalResourceGroupLabel = "kubernetes.azure.com/resource-group" externalResourceGroupLabel = "kubernetes.azure.com/resource-group"
managedByAzureLabel = "kubernetes.azure.com/managed" 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 ( const (
@ -751,8 +745,12 @@ func (az *Cloud) SetInformers(informerFactory informers.SharedInformerFactory) {
UpdateFunc: func(prev, obj interface{}) { UpdateFunc: func(prev, obj interface{}) {
prevNode := prev.(*v1.Node) prevNode := prev.(*v1.Node)
newNode := obj.(*v1.Node) newNode := obj.(*v1.Node)
if newNode.Labels[LabelFailureDomainBetaZone] == if newNode.Labels[v1.LabelFailureDomainBetaZone] ==
prevNode.Labels[LabelFailureDomainBetaZone] { prevNode.Labels[v1.LabelFailureDomainBetaZone] {
return
}
if newNode.Labels[v1.LabelTopologyZone] ==
prevNode.Labels[v1.LabelTopologyZone] {
return return
} }
az.updateNodeCaches(prevNode, newNode) az.updateNodeCaches(prevNode, newNode)
@ -785,11 +783,13 @@ func (az *Cloud) updateNodeCaches(prevNode, newNode *v1.Node) {
defer az.nodeCachesLock.Unlock() defer az.nodeCachesLock.Unlock()
if prevNode != nil { if prevNode != nil {
// Remove from nodeNames cache. // Remove from nodeNames cache.
az.nodeNames.Delete(prevNode.ObjectMeta.Name) az.nodeNames.Delete(prevNode.ObjectMeta.Name)
// Remove from nodeZones cache. // Remove from nodeZones cache
prevZone, ok := prevNode.ObjectMeta.Labels[LabelFailureDomainBetaZone] prevZone, ok := prevNode.ObjectMeta.Labels[v1.LabelTopologyZone]
if ok && az.isAvailabilityZone(prevZone) { if ok && az.isAvailabilityZone(prevZone) {
az.nodeZones[prevZone].Delete(prevNode.ObjectMeta.Name) az.nodeZones[prevZone].Delete(prevNode.ObjectMeta.Name)
if az.nodeZones[prevZone].Len() == 0 { 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. // Remove from nodeResourceGroups cache.
_, ok = prevNode.ObjectMeta.Labels[externalResourceGroupLabel] _, ok = prevNode.ObjectMeta.Labels[externalResourceGroupLabel]
if ok { if ok {
@ -815,7 +824,7 @@ func (az *Cloud) updateNodeCaches(prevNode, newNode *v1.Node) {
az.nodeNames.Insert(newNode.ObjectMeta.Name) az.nodeNames.Insert(newNode.ObjectMeta.Name)
// Add to nodeZones cache. // Add to nodeZones cache.
newZone, ok := newNode.ObjectMeta.Labels[LabelFailureDomainBetaZone] newZone, ok := newNode.ObjectMeta.Labels[v1.LabelTopologyZone]
if ok && az.isAvailabilityZone(newZone) { if ok && az.isAvailabilityZone(newZone) {
if az.nodeZones[newZone] == nil { if az.nodeZones[newZone] == nil {
az.nodeZones[newZone] = sets.NewString() 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{ labels := map[string]string{
LabelFailureDomainBetaRegion: c.Location, v1.LabelTopologyRegion: c.Location,
} }
// no azure credential is set, return nil // no azure credential is set, return nil
if c.DisksClient == 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) zone := c.makeZone(c.Location, zoneID)
klog.V(4).Infof("Got zone %q for Azure disk %q", zone, diskName) klog.V(4).Infof("Got zone %q for Azure disk %q", zone, diskName)
labels[LabelFailureDomainBetaZone] = zone labels[v1.LabelTopologyZone] = zone
return labels, nil 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"}}, existedDisk: compute.Disk{Name: to.StringPtr(diskName), DiskProperties: &compute.DiskProperties{DiskSizeGB: &diskSizeGB}, Zones: &[]string{"1"}},
expected: map[string]string{ expected: map[string]string{
LabelFailureDomainBetaRegion: testCloud0.Location, v1.LabelTopologyRegion: testCloud0.Location,
LabelFailureDomainBetaZone: testCloud0.makeZone(testCloud0.Location, 1), v1.LabelTopologyZone: testCloud0.makeZone(testCloud0.Location, 1),
}, },
expectedErr: false, expectedErr: false,
}, },
@ -464,7 +464,7 @@ func TestGetLabelsForVolume(t *testing.T) {
}, },
existedDisk: compute.Disk{Name: to.StringPtr(diskName), DiskProperties: &compute.DiskProperties{DiskSizeGB: &diskSizeGB}}, existedDisk: compute.Disk{Name: to.StringPtr(diskName), DiskProperties: &compute.DiskProperties{DiskSizeGB: &diskSizeGB}},
expected: map[string]string{ expected: map[string]string{
LabelFailureDomainBetaRegion: testCloud0.Location, v1.LabelTopologyRegion: testCloud0.Location,
}, },
expectedErr: false, expectedErr: false,
expectedErrMsg: nil, expectedErrMsg: nil,

View File

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