Skip to content

Commit 857c1aa

Browse files
authored
feat: detect Azure infra provider (#259)
1 parent e985f8d commit 857c1aa

File tree

2 files changed

+78
-4
lines changed

2 files changed

+78
-4
lines changed

pkg/provider/k8scloudproviderprovider.go

+28-4
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ type ClusterProvider string
2424
const (
2525
// ClusterProviderGKE identifies Google's GKE cluster provider.
2626
ClusterProviderGKE = ClusterProvider("GKE")
27+
// ClusterProviderAzure identifies Microsoft's Azure cluster provider.
28+
ClusterProviderAzure = ClusterProvider("Azure")
2729
// ClusterProviderAWS identifies Amazon's AWS cluster provider.
2830
ClusterProviderAWS = ClusterProvider("AWS")
2931
// ClusterProviderKubernetesInDocker identifies kind (kubernetes in docker) as cluster provider.
@@ -122,10 +124,11 @@ func getClusterProviderFromNodes(nodeList *corev1.NodeList) (ClusterProvider, bo
122124
func getClusterProviderFromNodesProviderID(nodeList *corev1.NodeList) (ClusterProvider, bool) {
123125
const (
124126
// Nodes on GKE are provided by GCE (Google Compute Engine)
125-
providerIDPrefixGKE = "gce"
126-
providerIDPrefixAWS = "aws"
127-
providerIDPrefixKind = "kind"
128-
providerIDPrefixK3s = "k3s"
127+
providerIDPrefixGKE = "gce"
128+
providerIDPrefixAWS = "aws"
129+
providerIDPrefixKind = "kind"
130+
providerIDPrefixK3s = "k3s"
131+
providerIDPrefixAzure = "azure"
129132
)
130133

131134
d := make(clusterProviderDistribution)
@@ -134,6 +137,10 @@ func getClusterProviderFromNodesProviderID(nodeList *corev1.NodeList) (ClusterPr
134137
d[ClusterProviderGKE]++
135138
continue
136139
}
140+
if strings.HasPrefix(n.Spec.ProviderID, providerIDPrefixAzure) {
141+
d[ClusterProviderAzure]++
142+
continue
143+
}
137144
if strings.HasPrefix(n.Spec.ProviderID, providerIDPrefixAWS) {
138145
d[ClusterProviderAWS]++
139146
continue
@@ -212,6 +219,20 @@ func getClusterProviderFromLabels(labels map[string]string) (ClusterProvider, bo
212219
labelNameAWSInstanceID: {},
213220
}
214221

222+
const (
223+
labelNameAzureClusterName = "kubernetes.azure.com/cluster"
224+
labelNameAzureOSSKU = "kubernetes.azure.com/os-sku"
225+
labelNameAzureRole = "kubernetes.azure.com/role"
226+
labelNameAzureNodeImageVersion = "kubernetes.azure.com/node-image-version"
227+
)
228+
229+
labelsAzure := map[string]struct{}{
230+
labelNameAzureClusterName: {},
231+
labelNameAzureOSSKU: {},
232+
labelNameAzureRole: {},
233+
labelNameAzureNodeImageVersion: {},
234+
}
235+
215236
// This approach currently loops through the provided labels and checks
216237
// each of them against known labels sets for particular cluster providers.
217238
// The reason for this is that regardless of the number of cluster providers
@@ -221,6 +242,9 @@ func getClusterProviderFromLabels(labels map[string]string) (ClusterProvider, bo
221242
if _, ok := labelsAWS[lName]; ok {
222243
return ClusterProviderAWS, true
223244
}
245+
if _, ok := labelsAzure[lName]; ok {
246+
return ClusterProviderAzure, true
247+
}
224248
}
225249

226250
return ClusterProviderUnknown, false

pkg/provider/k8scloudproviderprovider_test.go

+50
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,56 @@ func TestClusterProvider(t *testing.T) {
339339
},
340340
expected: ClusterProviderK3S,
341341
},
342+
{
343+
name: "Azure node inferred from node labels",
344+
clientFunc: func() *clientgo_fake.Clientset {
345+
return clientgo_fake.NewSimpleClientset(
346+
&corev1.Node{
347+
Spec: corev1.NodeSpec{
348+
ProviderID: "azure:///subscriptions/1111111-422b-9a21-fd111111111/resourceGroups/mc_asd_asd_eucentral/providers/Microsoft.Compute/virtualMachineScaleSets/aks-nodepool1-1111-vmss/virtualMachines/0",
349+
},
350+
ObjectMeta: metav1.ObjectMeta{
351+
Annotations: map[string]string{
352+
"csi.volume.kubernetes.io/nodeid": `{"disk.csi.azure.com":"aks-nodepool1-20479306-vmss000000","file.csi.azure.com":"aks-nodepool1-20479306-vmss000000"}`,
353+
"node.alpha.kubernetes.io/ttl": "0",
354+
"volumes.kubernetes.io/controller-managed-attach-detach": "true",
355+
},
356+
Labels: map[string]string{
357+
"agentpool": "nodepool1",
358+
"beta.kubernetes.io/arch": "amd64",
359+
"beta.kubernetes.io/instance-type": "Standard_DS2_v2",
360+
"beta.kubernetes.io/os": "linux",
361+
"failure-domain.beta.kubernetes.io/region": "polandcentral",
362+
"failure-domain.beta.kubernetes.io/zone": "0",
363+
"kubernetes.azure.com/agentpool": "nodepool1",
364+
"kubernetes.azure.com/cluster": "MC_asd_asd_eucentral",
365+
"kubernetes.azure.com/consolidated-additional-properties": "6ea4bf17-2fb7-11ef-ac0b-fd1111111111",
366+
"kubernetes.azure.com/kubelet-identity-client-id": "42e89310-1d30-43fd-8888-fd1111111111",
367+
"kubernetes.azure.com/mode": "system",
368+
"kubernetes.azure.com/node-image-version": "AKSUbuntu-2204gen2containerd-202405.27.0",
369+
"kubernetes.azure.com/nodepool-type": "VirtualMachineScaleSets",
370+
"kubernetes.azure.com/os-sku": "Ubuntu",
371+
"kubernetes.azure.com/role": "agent",
372+
"kubernetes.azure.com/storageprofile": "managed",
373+
"kubernetes.azure.com/storagetier": "Premium_LRS",
374+
"kubernetes.io/arch": "amd64",
375+
"kubernetes.io/hostname": "aks-nodepool1-111111111-vmss000000",
376+
"kubernetes.io/os": "linux",
377+
"kubernetes.io/role": "agent",
378+
"node-role.kubernetes.io/agent": "",
379+
"node.kubernetes.io/instance-type": "Standard_DS2_v2",
380+
"storageprofile": "managed",
381+
"storagetier": "Premium_LRS",
382+
"topology.disk.csi.azure.com/zone": "",
383+
"topology.kubernetes.io/region": "polandcentral",
384+
"topology.kubernetes.io/zone": "0",
385+
},
386+
},
387+
},
388+
)
389+
},
390+
expected: ClusterProviderAzure,
391+
},
342392
}
343393

344394
for _, tc := range testcases {

0 commit comments

Comments
 (0)