Skip to content

Commit b13d80a

Browse files
committed
Allow Kubelet to run with no Azure identity
useInstanceMetadata should be enabled and Kubelet would use IMDS to get node's information.
1 parent b066e0d commit b13d80a

File tree

3 files changed

+69
-34
lines changed

3 files changed

+69
-34
lines changed

staging/src/k8s.io/legacy-cloud-providers/azure/auth/azure_auth.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,11 @@ import (
2828
"k8s.io/klog"
2929
)
3030

31+
var (
32+
// ErrorNoAuth indicates that no credentials are provided.
33+
ErrorNoAuth = fmt.Errorf("no credentials provided for Azure cloud provider")
34+
)
35+
3136
// AzureAuthConfig holds auth related part of cloud config
3237
type AzureAuthConfig struct {
3338
// The cloud environment identifier. Takes values from https://github.com/Azure/go-autorest/blob/ec5f4903f77ed9927ac95b19ab8e44ada64c1356/autorest/azure/environments.go#L13
@@ -104,7 +109,7 @@ func GetServicePrincipalToken(config *AzureAuthConfig, env *azure.Environment) (
104109
env.ServiceManagementEndpoint)
105110
}
106111

107-
return nil, fmt.Errorf("No credentials provided for AAD application %s", config.AADClientID)
112+
return nil, ErrorNoAuth
108113
}
109114

110115
// ParseAzureEnvironment returns azure environment by name

staging/src/k8s.io/legacy-cloud-providers/azure/azure.go

Lines changed: 41 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,14 @@ func NewCloud(configReader io.Reader) (cloudprovider.Interface, error) {
248248
}
249249

250250
servicePrincipalToken, err := auth.GetServicePrincipalToken(&config.AzureAuthConfig, env)
251-
if err != nil {
251+
if err == auth.ErrorNoAuth {
252+
if !config.UseInstanceMetadata {
253+
// No credentials provided, useInstanceMetadata should be enabled.
254+
return nil, fmt.Errorf("useInstanceMetadata must be enabled without Azure credentials")
255+
}
256+
257+
klog.V(2).Infof("Azure cloud provider is starting without credentials")
258+
} else if err != nil {
252259
return nil, err
253260
}
254261

@@ -348,16 +355,6 @@ func NewCloud(configReader io.Reader) (cloudprovider.Interface, error) {
348355
}
349356
}
350357

351-
azClientConfig := &azClientConfig{
352-
subscriptionID: config.SubscriptionID,
353-
resourceManagerEndpoint: env.ResourceManagerEndpoint,
354-
servicePrincipalToken: servicePrincipalToken,
355-
rateLimiterReader: operationPollRateLimiter,
356-
rateLimiterWriter: operationPollRateLimiterWrite,
357-
CloudProviderBackoffRetries: config.CloudProviderBackoffRetries,
358-
CloudProviderBackoffDuration: config.CloudProviderBackoffDuration,
359-
ShouldOmitCloudProviderBackoff: config.shouldOmitCloudProviderBackoff(),
360-
}
361358
az := Cloud{
362359
Config: *config,
363360
Environment: *env,
@@ -366,29 +363,45 @@ func NewCloud(configReader io.Reader) (cloudprovider.Interface, error) {
366363
unmanagedNodes: sets.NewString(),
367364
routeCIDRs: map[string]string{},
368365
resourceRequestBackoff: resourceRequestBackoff,
369-
370-
DisksClient: newAzDisksClient(azClientConfig),
371-
SnapshotsClient: newSnapshotsClient(azClientConfig),
372-
RoutesClient: newAzRoutesClient(azClientConfig),
373-
SubnetsClient: newAzSubnetsClient(azClientConfig),
374-
InterfacesClient: newAzInterfacesClient(azClientConfig),
375-
RouteTablesClient: newAzRouteTablesClient(azClientConfig),
376-
LoadBalancerClient: newAzLoadBalancersClient(azClientConfig),
377-
SecurityGroupsClient: newAzSecurityGroupsClient(azClientConfig),
378-
StorageAccountClient: newAzStorageAccountClient(azClientConfig),
379-
VirtualMachinesClient: newAzVirtualMachinesClient(azClientConfig),
380-
PublicIPAddressesClient: newAzPublicIPAddressesClient(azClientConfig),
381-
VirtualMachineSizesClient: newAzVirtualMachineSizesClient(azClientConfig),
382-
VirtualMachineScaleSetsClient: newAzVirtualMachineScaleSetsClient(azClientConfig),
383-
VirtualMachineScaleSetVMsClient: newAzVirtualMachineScaleSetVMsClient(azClientConfig),
384-
FileClient: &azureFileClient{env: *env},
385366
}
386-
387367
az.metadata, err = NewInstanceMetadataService(metadataURL)
388368
if err != nil {
389369
return nil, err
390370
}
391371

372+
// No credentials provided, InstanceMetadataService would be used for getting Azure resources.
373+
// Note that this only applies to Kubelet, controller-manager should configure credentials for managing Azure resources.
374+
if servicePrincipalToken == nil {
375+
return &az, nil
376+
}
377+
378+
// Initialize Azure clients.
379+
azClientConfig := &azClientConfig{
380+
subscriptionID: config.SubscriptionID,
381+
resourceManagerEndpoint: env.ResourceManagerEndpoint,
382+
servicePrincipalToken: servicePrincipalToken,
383+
rateLimiterReader: operationPollRateLimiter,
384+
rateLimiterWriter: operationPollRateLimiterWrite,
385+
CloudProviderBackoffRetries: config.CloudProviderBackoffRetries,
386+
CloudProviderBackoffDuration: config.CloudProviderBackoffDuration,
387+
ShouldOmitCloudProviderBackoff: config.shouldOmitCloudProviderBackoff(),
388+
}
389+
az.DisksClient = newAzDisksClient(azClientConfig)
390+
az.SnapshotsClient = newSnapshotsClient(azClientConfig)
391+
az.RoutesClient = newAzRoutesClient(azClientConfig)
392+
az.SubnetsClient = newAzSubnetsClient(azClientConfig)
393+
az.InterfacesClient = newAzInterfacesClient(azClientConfig)
394+
az.RouteTablesClient = newAzRouteTablesClient(azClientConfig)
395+
az.LoadBalancerClient = newAzLoadBalancersClient(azClientConfig)
396+
az.SecurityGroupsClient = newAzSecurityGroupsClient(azClientConfig)
397+
az.StorageAccountClient = newAzStorageAccountClient(azClientConfig)
398+
az.VirtualMachinesClient = newAzVirtualMachinesClient(azClientConfig)
399+
az.PublicIPAddressesClient = newAzPublicIPAddressesClient(azClientConfig)
400+
az.VirtualMachineSizesClient = newAzVirtualMachineSizesClient(azClientConfig)
401+
az.VirtualMachineScaleSetsClient = newAzVirtualMachineScaleSetsClient(azClientConfig)
402+
az.VirtualMachineScaleSetVMsClient = newAzVirtualMachineScaleSetVMsClient(azClientConfig)
403+
az.FileClient = &azureFileClient{env: *env}
404+
392405
if az.MaximumLoadBalancerRuleCount == 0 {
393406
az.MaximumLoadBalancerRuleCount = maximumLoadBalancerRuleCount
394407
}

staging/src/k8s.io/legacy-cloud-providers/azure/azure_instances.go

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,12 @@ func (az *Cloud) NodeAddresses(ctx context.Context, name types.NodeName) ([]v1.N
8383

8484
// Not local instance, get addresses from Azure ARM API.
8585
if !isLocalInstance {
86-
return addressGetter(name)
86+
if az.vmSet != nil {
87+
return addressGetter(name)
88+
}
89+
90+
// vmSet == nil indicates credentials are not provided.
91+
return nil, fmt.Errorf("no credentials provided for Azure cloud provider")
8792
}
8893

8994
if len(metadata.Network.Interface) == 0 {
@@ -242,7 +247,12 @@ func (az *Cloud) InstanceID(ctx context.Context, name types.NodeName) (string, e
242247

243248
// Not local instance, get instanceID from Azure ARM API.
244249
if !isLocalInstance {
245-
return az.vmSet.GetInstanceIDByNodeName(nodeName)
250+
if az.vmSet != nil {
251+
return az.vmSet.GetInstanceIDByNodeName(nodeName)
252+
}
253+
254+
// vmSet == nil indicates credentials are not provided.
255+
return "", fmt.Errorf("no credentials provided for Azure cloud provider")
246256
}
247257

248258
// Get resource group name.
@@ -316,10 +326,17 @@ func (az *Cloud) InstanceType(ctx context.Context, name types.NodeName) (string,
316326
if err != nil {
317327
return "", err
318328
}
319-
if isLocalInstance {
320-
if metadata.Compute.VMSize != "" {
321-
return metadata.Compute.VMSize, nil
329+
if !isLocalInstance {
330+
if az.vmSet != nil {
331+
return az.vmSet.GetInstanceTypeByNodeName(string(name))
322332
}
333+
334+
// vmSet == nil indicates credentials are not provided.
335+
return "", fmt.Errorf("no credentials provided for Azure cloud provider")
336+
}
337+
338+
if metadata.Compute.VMSize != "" {
339+
return metadata.Compute.VMSize, nil
323340
}
324341
}
325342

0 commit comments

Comments
 (0)