Skip to content

Commit ab839e7

Browse files
authored
[AKS] az aks: Add --node-provisioning-mode and --node-provisioning-default-pools parameters (#31836)
1 parent e112e07 commit ab839e7

File tree

10 files changed

+3153
-4
lines changed

10 files changed

+3153
-4
lines changed

linter_exclusions.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,9 @@ aks create:
291291
azure_keyvault_kms_key_vault_resource_id:
292292
rule_exclusions:
293293
- option_length_too_long
294+
node_provisioning_default_pools:
295+
rule_exclusions:
296+
- option_length_too_long
294297
aks enable-addons:
295298
parameters:
296299
workspace_resource_id:
@@ -374,6 +377,9 @@ aks update:
374377
azure_keyvault_kms_key_vault_resource_id:
375378
rule_exclusions:
376379
- option_length_too_long
380+
node_provisioning_default_pools:
381+
rule_exclusions:
382+
- option_length_too_long
377383
aks update-credentials:
378384
parameters:
379385
aad_server_app_secret:

src/azure-cli/azure/cli/command_modules/acs/_consts.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,14 @@
233233
CONST_ARTIFACT_SOURCE_DIRECT = "Direct"
234234
CONST_ARTIFACT_SOURCE_CACHE = "Cache"
235235

236+
# node provisioning mode
237+
CONST_NODE_PROVISIONING_MODE_MANUAL = "Manual"
238+
CONST_NODE_PROVISIONING_MODE_AUTO = "Auto"
239+
240+
# node provisioning default pools
241+
CONST_NODE_PROVISIONING_DEFAULT_POOLS_NONE = "None"
242+
CONST_NODE_PROVISIONING_DEFAULT_POOLS_AUTO = "Auto"
243+
236244

237245
# consts for decorator pattern
238246
class DecoratorMode(Enum):

src/azure-cli/azure/cli/command_modules/acs/_help.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -599,6 +599,17 @@
599599
- name: --enable-static-egress-gateway
600600
type: bool
601601
short-summary: Enable Static Egress Gateway addon to the cluster.
602+
- name: --node-provisioning-mode
603+
type: string
604+
short-summary: Set the node provisioning mode of the cluster. Valid values are "Auto" and "Manual". For more information on "Auto" mode see aka.ms/aks/nap.
605+
- name: --node-provisioning-default-pools
606+
type: string
607+
short-summary: The set of default Karpenter NodePools configured for node provisioning. Valid values are "Auto" and "None".
608+
long-summary: |-
609+
The set of default Karpenter NodePools configured for node provisioning. Valid values are "Auto" and "None".
610+
Auto: A standard set of Karpenter NodePools are provisioned.
611+
None: No Karpenter NodePools are provisioned.
612+
WARNING: Changing this from Auto to None on an existing cluster will cause the default Karpenter NodePools to be deleted, which will in turn drain and delete the nodes associated with those pools. It is strongly recommended to not do this unless there are idle nodes ready to take the pods evicted by that action.
602613
examples:
603614
- name: Create a Kubernetes cluster with an existing SSH public key.
604615
text: az aks create -g MyResourceGroup -n MyManagedCluster --ssh-key-value /path/to/publickey
@@ -678,6 +689,10 @@
678689
text: az aks create -g MyResourceGroup -n MyManagedCluster --os-sku Ubuntu --max-pods MaxPodsPerNode --network-plugin azure --vnet-subnet-id /subscriptions/SubID/resourceGroups/AnotherResourceGroup/providers/Microsoft.Network/virtualNetworks/MyVnet/subnets/NodeSubnet --pod-subnet-id /subscriptions/SubID/resourceGroups/AnotherResourceGroup/providers/Microsoft.Network/virtualNetworks/MyVnet/subnets/PodSubnet --pod-ip-allocation-mode StaticBlock
679690
- name: Create a kubernetes cluster with VirtualMachines vm set type.
680691
text: az aks create -g MyResourceGroup -n MyManagedCluster --vm-set-type VirtualMachines --vm-sizes "VMSize1,VMSize2" --node-count 3
692+
- name: Create a kubernetes cluster with auto node provisioning.
693+
text: az aks create -g MyResourceGroup -n MyManagedCluster --node-provisioning-mode Auto
694+
- name: Create a kubernetes cluster with auto node provisioning and no default pools.
695+
text: az aks create -g MyResourceGroup -n MyManagedCluster --node-provisioning-mode Auto --node-provisioning-default-pools None
681696
"""
682697

683698
helps['aks update'] = """
@@ -1069,6 +1084,17 @@
10691084
- name: --migrate-vmas-to-vms
10701085
type: bool
10711086
short-summary: Migrate cluster with VMAS node pool to VMS node pool.
1087+
- name: --node-provisioning-mode
1088+
type: string
1089+
short-summary: Set the node provisioning mode of the cluster. Valid values are "Auto" and "Manual". For more information on "Auto" mode see aka.ms/aks/nap.
1090+
- name: --node-provisioning-default-pools
1091+
type: string
1092+
short-summary: The set of default Karpenter NodePools configured for node provisioning. Valid values are "Auto" and "None".
1093+
long-summary: |-
1094+
The set of default Karpenter NodePools configured for node provisioning. Valid values are "Auto" and "None".
1095+
Auto: A standard set of Karpenter NodePools are provisioned.
1096+
None: No Karpenter NodePools are provisioned.
1097+
WARNING: Changing this from Auto to None on an existing cluster will cause the default Karpenter NodePools to be deleted, which will in turn drain and delete the nodes associated with those pools. It is strongly recommended to not do this unless there are idle nodes ready to take the pods evicted by that action.
10721098
examples:
10731099
- name: Reconcile the cluster back to its current state.
10741100
text: az aks update -g MyResourceGroup -n MyManagedCluster
@@ -1128,6 +1154,10 @@
11281154
text: az aks update -g MyResourceGroup -n MyManagedCLuster --enable-vpa
11291155
- name: Disable VPA(Vertical Pod Autoscaler) for an existing kubernetes cluster.
11301156
text: az aks update -g MyResourceGroup -n MyManagedCLuster --disable-vpa
1157+
- name: Update a kubernetes cluster to use auto node provisioning.
1158+
text: az aks update -g MyResourceGroup -n MyManagedCluster --node-provisioning-mode Auto
1159+
- name: Update a kubernetes cluster to use auto node provisioning mode with no default pools.
1160+
text: az aks update -g MyResourceGroup -n MyManagedCluster --node-provisioning-mode Auto --node-provisioning-default-pools None
11311161
"""
11321162

11331163
helps['aks delete'] = """

src/azure-cli/azure/cli/command_modules/acs/_params.py

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,11 @@
5858
CONST_APP_ROUTING_ANNOTATION_CONTROLLED_NGINX,
5959
CONST_APP_ROUTING_EXTERNAL_NGINX,
6060
CONST_APP_ROUTING_INTERNAL_NGINX,
61-
CONST_APP_ROUTING_NONE_NGINX)
61+
CONST_APP_ROUTING_NONE_NGINX,
62+
CONST_NODE_PROVISIONING_MODE_MANUAL,
63+
CONST_NODE_PROVISIONING_MODE_AUTO,
64+
CONST_NODE_PROVISIONING_DEFAULT_POOLS_NONE,
65+
CONST_NODE_PROVISIONING_DEFAULT_POOLS_AUTO)
6266
from azure.cli.command_modules.acs.azurecontainerstorage._consts import (
6367
CONST_ACSTOR_ALL,
6468
CONST_DISK_TYPE_EPHEMERAL_VOLUME_ONLY,
@@ -192,6 +196,16 @@
192196
CONST_NODE_OS_CHANNEL_SECURITY_PATCH,
193197
]
194198

199+
node_provisioning_modes = [
200+
CONST_NODE_PROVISIONING_MODE_MANUAL,
201+
CONST_NODE_PROVISIONING_MODE_AUTO,
202+
]
203+
204+
node_provisioning_default_pools = [
205+
CONST_NODE_PROVISIONING_DEFAULT_POOLS_NONE,
206+
CONST_NODE_PROVISIONING_DEFAULT_POOLS_AUTO,
207+
]
208+
195209
dev_space_endpoint_types = ['Public', 'Private', 'None']
196210

197211
keyvault_network_access_types = [CONST_AZURE_KEYVAULT_NETWORK_ACCESS_PUBLIC, CONST_AZURE_KEYVAULT_NETWORK_ACCESS_PRIVATE]
@@ -534,6 +548,28 @@ def load_arguments(self, _):
534548
c.argument('disable_acns_security', action='store_true')
535549
c.argument("if_match")
536550
c.argument("if_none_match")
551+
# node provisioning
552+
c.argument(
553+
"node_provisioning_mode",
554+
arg_type=get_enum_type(node_provisioning_modes),
555+
help=(
556+
'Set the node provisioning mode of the cluster. Valid values are "Auto" and "Manual". '
557+
'For more information on "Auto" mode see aka.ms/aks/nap.'
558+
)
559+
)
560+
c.argument(
561+
"node_provisioning_default_pools",
562+
arg_type=get_enum_type(node_provisioning_default_pools),
563+
help=(
564+
'The set of default Karpenter NodePools configured for node provisioning. '
565+
'Valid values are "Auto" and "None". Auto: A standard set of Karpenter NodePools are provisioned. '
566+
'None: No Karpenter NodePools are provisioned. '
567+
'WARNING: Changing this from Auto to None on an existing cluster will cause the default Karpenter '
568+
'NodePools to be deleted, which will in turn drain and delete the nodes associated with those pools. '
569+
'It is strongly recommended to not do this unless there are idle nodes ready to take the pods evicted '
570+
'by that action.'
571+
)
572+
)
537573

538574
with self.argument_context('aks update') as c:
539575
# managed cluster paramerters
@@ -711,6 +747,30 @@ def load_arguments(self, _):
711747
c.argument('disable_cost_analysis', action='store_true')
712748
c.argument("if_match")
713749
c.argument("if_none_match")
750+
# node provisioning
751+
c.argument(
752+
"node_provisioning_mode",
753+
is_preview=True,
754+
arg_type=get_enum_type(node_provisioning_modes),
755+
help=(
756+
'Set the node provisioning mode of the cluster. Valid values are "Auto" and "Manual". '
757+
'For more information on "Auto" mode see aka.ms/aks/nap.'
758+
)
759+
)
760+
c.argument(
761+
"node_provisioning_default_pools",
762+
is_preview=True,
763+
arg_type=get_enum_type(node_provisioning_default_pools),
764+
help=(
765+
'The set of default Karpenter NodePools configured for node provisioning. '
766+
'Valid values are "Auto" and "None". Auto: A standard set of Karpenter NodePools are provisioned. '
767+
'None: No Karpenter NodePools are provisioned. '
768+
'WARNING: Changing this from Auto to None on an existing cluster will cause the default Karpenter '
769+
'NodePools to be deleted, which will in turn drain and delete the nodes associated with those pools. '
770+
'It is strongly recommended to not do this unless there are idle nodes ready to take the pods evicted '
771+
'by that action.'
772+
)
773+
)
714774
with self.argument_context('aks disable-addons', resource_type=ResourceType.MGMT_CONTAINERSERVICE, operation_group='managed_clusters') as c:
715775
c.argument('addons', options_list=['--addons', '-a'])
716776

src/azure-cli/azure/cli/command_modules/acs/custom.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -674,6 +674,9 @@ def aks_create(
674674
# apiserver vnet integration
675675
enable_apiserver_vnet_integration=False,
676676
apiserver_subnet_id=None,
677+
# node provisioning
678+
node_provisioning_mode=None,
679+
node_provisioning_default_pools=None,
677680
):
678681
# DO NOT MOVE: get all the original parameters and save them as a dictionary
679682
raw_parameters = locals()
@@ -849,7 +852,10 @@ def aks_update(
849852
enable_apiserver_vnet_integration=False,
850853
apiserver_subnet_id=None,
851854
enable_private_cluster=False,
852-
disable_private_cluster=False
855+
disable_private_cluster=False,
856+
# node provisioning
857+
node_provisioning_mode=None,
858+
node_provisioning_default_pools=None,
853859
):
854860
# DO NOT MOVE: get all the original parameters and save them as a dictionary
855861
raw_parameters = locals()

src/azure-cli/azure/cli/command_modules/acs/managed_cluster_decorator.py

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5534,6 +5534,20 @@ def get_migrate_vmas_to_vms(self) -> bool:
55345534
"""
55355535
return self.raw_param.get("migrate_vmas_to_vms")
55365536

5537+
def get_node_provisioning_mode(self) -> Union[str, None]:
5538+
"""Obtain the value of node_provisioning_mode.
5539+
5540+
:return: string or None
5541+
"""
5542+
return self.raw_param.get("node_provisioning_mode")
5543+
5544+
def get_node_provisioning_default_pools(self) -> Union[str, None]:
5545+
"""Obtain the value of node_provisioning_default_pools.
5546+
5547+
:return: string or None
5548+
"""
5549+
return self.raw_param.get("node_provisioning_default_pools")
5550+
55375551

55385552
class AKSManagedClusterCreateDecorator(BaseAKSManagedClusterDecorator):
55395553
def __init__(
@@ -5714,6 +5728,44 @@ def set_up_image_cleaner(self, mc: ManagedCluster) -> ManagedCluster:
57145728

57155729
return mc
57165730

5731+
def set_up_node_provisioning_mode(self, mc: ManagedCluster) -> ManagedCluster:
5732+
self._ensure_mc(mc)
5733+
5734+
mode = self.context.get_node_provisioning_mode()
5735+
if mode is not None:
5736+
if mc.node_provisioning_profile is None:
5737+
mc.node_provisioning_profile = (
5738+
self.models.ManagedClusterNodeProvisioningProfile() # pylint: disable=no-member
5739+
)
5740+
5741+
# set mode
5742+
mc.node_provisioning_profile.mode = mode
5743+
5744+
return mc
5745+
5746+
def set_up_node_provisioning_default_pools(self, mc: ManagedCluster) -> ManagedCluster:
5747+
self._ensure_mc(mc)
5748+
5749+
default_pools = self.context.get_node_provisioning_default_pools()
5750+
if default_pools is not None:
5751+
if mc.node_provisioning_profile is None:
5752+
mc.node_provisioning_profile = (
5753+
self.models.ManagedClusterNodeProvisioningProfile() # pylint: disable=no-member
5754+
)
5755+
5756+
# set default_node_pools
5757+
mc.node_provisioning_profile.default_node_pools = default_pools
5758+
5759+
return mc
5760+
5761+
def set_up_node_provisioning_profile(self, mc: ManagedCluster) -> ManagedCluster:
5762+
self._ensure_mc(mc)
5763+
5764+
mc = self.set_up_node_provisioning_mode(mc)
5765+
mc = self.set_up_node_provisioning_default_pools(mc)
5766+
5767+
return mc
5768+
57175769
def init_mc(self) -> ManagedCluster:
57185770
"""Initialize a ManagedCluster object with required parameter location and attach it to internal context.
57195771
@@ -6971,6 +7023,8 @@ def construct_mc_profile_default(self, bypass_restore_defaults: bool = False) ->
69717023
mc = self.set_up_bootstrap_profile(mc)
69727024
# set up static egress gateway profile
69737025
mc = self.set_up_static_egress_gateway(mc)
7026+
# set up node provisioning profile
7027+
mc = self.set_up_node_provisioning_profile(mc)
69747028

69757029
# DO NOT MOVE: keep this at the bottom, restore defaults
69767030
if not bypass_restore_defaults:
@@ -8874,6 +8928,48 @@ def update_vmas_to_vms(self, mc: ManagedCluster) -> ManagedCluster:
88748928

88758929
return mc
88768930

8931+
def update_node_provisioning_mode(self, mc: ManagedCluster) -> ManagedCluster:
8932+
self._ensure_mc(mc)
8933+
8934+
mode = self.context.get_node_provisioning_mode()
8935+
if mode is not None:
8936+
if mc.node_provisioning_profile is None:
8937+
mc.node_provisioning_profile = (
8938+
self.models.ManagedClusterNodeProvisioningProfile() # pylint: disable=no-member
8939+
)
8940+
8941+
# set mode
8942+
mc.node_provisioning_profile.mode = mode
8943+
8944+
return mc
8945+
8946+
def update_node_provisioning_default_pools(self, mc: ManagedCluster) -> ManagedCluster:
8947+
self._ensure_mc(mc)
8948+
8949+
default_pools = self.context.get_node_provisioning_default_pools()
8950+
if default_pools is not None:
8951+
if mc.node_provisioning_profile is None:
8952+
mc.node_provisioning_profile = (
8953+
self.models.ManagedClusterNodeProvisioningProfile() # pylint: disable=no-member
8954+
)
8955+
8956+
# set default_node_pools
8957+
mc.node_provisioning_profile.default_node_pools = default_pools
8958+
8959+
return mc
8960+
8961+
def update_node_provisioning_profile(self, mc: ManagedCluster) -> ManagedCluster:
8962+
"""Updates the nodeProvisioningProfile field of the managed cluster
8963+
8964+
:return: the ManagedCluster object
8965+
"""
8966+
self._ensure_mc(mc)
8967+
8968+
mc = self.update_node_provisioning_mode(mc)
8969+
mc = self.update_node_provisioning_default_pools(mc)
8970+
8971+
return mc
8972+
88778973
def update_mc_profile_default(self) -> ManagedCluster:
88788974
"""The overall controller used to update the default ManagedCluster profile.
88798975
@@ -8965,6 +9061,8 @@ def update_mc_profile_default(self) -> ManagedCluster:
89659061
mc = self.update_kubernetes_version_and_orchestrator_version(mc)
89669062
# update VMAS to VMS
89679063
mc = self.update_vmas_to_vms(mc)
9064+
# update node provisioning profile
9065+
mc = self.update_node_provisioning_profile(mc)
89689066
return mc
89699067

89709068
def update_kubernetes_version_and_orchestrator_version(self, mc: ManagedCluster) -> ManagedCluster:

0 commit comments

Comments
 (0)