Skip to content

Commit 28eb0ce

Browse files
committed
Add two new node-autoprovisioning options to az aks CLI
--node-provisioning-mode and --node-provisioning-default-pools
1 parent 5c3cf2f commit 28eb0ce

File tree

10 files changed

+3212
-4
lines changed

10 files changed

+3212
-4
lines changed

linter_exclusions.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,9 @@ aks create:
288288
azure_keyvault_kms_key_vault_resource_id:
289289
rule_exclusions:
290290
- option_length_too_long
291+
node_provisioning_default_pools:
292+
rule_exclusions:
293+
- option_length_too_long
291294
aks enable-addons:
292295
parameters:
293296
workspace_resource_id:
@@ -365,6 +368,9 @@ aks update:
365368
azure_keyvault_kms_key_vault_resource_id:
366369
rule_exclusions:
367370
- option_length_too_long
371+
node_provisioning_default_pools:
372+
rule_exclusions:
373+
- option_length_too_long
368374
aks update-credentials:
369375
parameters:
370376
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
@@ -596,6 +596,17 @@
596596
- name: --enable-static-egress-gateway
597597
type: bool
598598
short-summary: Enable Static Egress Gateway addon to the cluster.
599+
- name: --node-provisioning-mode
600+
type: string
601+
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.
602+
- name: --node-provisioning-default-pools
603+
type: string
604+
short-summary: The set of default Karpenter NodePools configured for node provisioning. Valid values are "Auto" and "None".
605+
long-summary: |-
606+
The set of default Karpenter NodePools configured for node provisioning. Valid values are "Auto" and "None".
607+
Auto: A standard set of Karpenter NodePools are provisioned.
608+
None: No Karpenter NodePools are provisioned.
609+
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.
599610
examples:
600611
- name: Create a Kubernetes cluster with an existing SSH public key.
601612
text: az aks create -g MyResourceGroup -n MyManagedCluster --ssh-key-value /path/to/publickey
@@ -675,6 +686,10 @@
675686
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
676687
- name: Create a kubernetes cluster with VirtualMachines vm set type.
677688
text: az aks create -g MyResourceGroup -n MyManagedCluster --vm-set-type VirtualMachines --vm-sizes "VMSize1,VMSize2" --node-count 3
689+
- name: Create a kubernetes cluster with auto node provisioning.
690+
text: az aks create -g MyResourceGroup -n MyManagedCluster --node-provisioning-mode Auto
691+
- name: Create a kubernetes cluster with auto node provisioning and no default pools.
692+
text: az aks create -g MyResourceGroup -n MyManagedCluster --node-provisioning-mode Auto --node-provisioning-default-pools None
678693
"""
679694

680695
helps['aks update'] = """
@@ -1057,6 +1072,17 @@
10571072
- name: --disable-static-egress-gateway
10581073
type: bool
10591074
short-summary: Disable Static Egress Gateway addon to the cluster.
1075+
- name: --node-provisioning-mode
1076+
type: string
1077+
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.
1078+
- name: --node-provisioning-default-pools
1079+
type: string
1080+
short-summary: The set of default Karpenter NodePools configured for node provisioning. Valid values are "Auto" and "None".
1081+
long-summary: |-
1082+
The set of default Karpenter NodePools configured for node provisioning. Valid values are "Auto" and "None".
1083+
Auto: A standard set of Karpenter NodePools are provisioned.
1084+
None: No Karpenter NodePools are provisioned.
1085+
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.
10601086
examples:
10611087
- name: Reconcile the cluster back to its current state.
10621088
text: az aks update -g MyResourceGroup -n MyManagedCluster
@@ -1116,6 +1142,10 @@
11161142
text: az aks update -g MyResourceGroup -n MyManagedCLuster --enable-vpa
11171143
- name: Disable VPA(Vertical Pod Autoscaler) for an existing kubernetes cluster.
11181144
text: az aks update -g MyResourceGroup -n MyManagedCLuster --disable-vpa
1145+
- name: Update a kubernetes cluster to use auto node provisioning.
1146+
text: az aks update -g MyResourceGroup -n MyManagedCluster --node-provisioning-mode Auto
1147+
- name: Update a kubernetes cluster to use auto node provisioning mode with no default pools.
1148+
text: az aks update -g MyResourceGroup -n MyManagedCluster --node-provisioning-mode Auto --node-provisioning-default-pools None
11191149
"""
11201150

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

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

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -673,6 +673,9 @@ def aks_create(
673673
# apiserver vnet integration
674674
enable_apiserver_vnet_integration=False,
675675
apiserver_subnet_id=None,
676+
# node provisioning
677+
node_provisioning_mode=None,
678+
node_provisioning_default_pools=None,
676679
):
677680
# DO NOT MOVE: get all the original parameters and save them as a dictionary
678681
raw_parameters = locals()
@@ -845,7 +848,10 @@ def aks_update(
845848
enable_apiserver_vnet_integration=False,
846849
apiserver_subnet_id=None,
847850
enable_private_cluster=False,
848-
disable_private_cluster=False
851+
disable_private_cluster=False,
852+
# node provisioning
853+
node_provisioning_mode=None,
854+
node_provisioning_default_pools=None,
849855
):
850856
# DO NOT MOVE: get all the original parameters and save them as a dictionary
851857
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
@@ -5500,6 +5500,20 @@ def get_disable_static_egress_gateway(self) -> bool:
55005500
# because it's already checked in get_enable_static_egress_gateway
55015501
return self.raw_param.get("disable_static_egress_gateway")
55025502

5503+
def get_node_provisioning_mode(self) -> Union[str, None]:
5504+
"""Obtain the value of node_provisioning_mode.
5505+
5506+
:return: string or None
5507+
"""
5508+
return self.raw_param.get("node_provisioning_mode")
5509+
5510+
def get_node_provisioning_default_pools(self) -> Union[str, None]:
5511+
"""Obtain the value of node_provisioning_default_pools.
5512+
5513+
:return: string or None
5514+
"""
5515+
return self.raw_param.get("node_provisioning_default_pools")
5516+
55035517

55045518
class AKSManagedClusterCreateDecorator(BaseAKSManagedClusterDecorator):
55055519
def __init__(
@@ -5680,6 +5694,44 @@ def set_up_image_cleaner(self, mc: ManagedCluster) -> ManagedCluster:
56805694

56815695
return mc
56825696

5697+
def set_up_node_provisioning_mode(self, mc: ManagedCluster) -> ManagedCluster:
5698+
self._ensure_mc(mc)
5699+
5700+
mode = self.context.get_node_provisioning_mode()
5701+
if mode is not None:
5702+
if mc.node_provisioning_profile is None:
5703+
mc.node_provisioning_profile = (
5704+
self.models.ManagedClusterNodeProvisioningProfile() # pylint: disable=no-member
5705+
)
5706+
5707+
# set mode
5708+
mc.node_provisioning_profile.mode = mode
5709+
5710+
return mc
5711+
5712+
def set_up_node_provisioning_default_pools(self, mc: ManagedCluster) -> ManagedCluster:
5713+
self._ensure_mc(mc)
5714+
5715+
default_pools = self.context.get_node_provisioning_default_pools()
5716+
if default_pools is not None:
5717+
if mc.node_provisioning_profile is None:
5718+
mc.node_provisioning_profile = (
5719+
self.models.ManagedClusterNodeProvisioningProfile() # pylint: disable=no-member
5720+
)
5721+
5722+
# set default_node_pools
5723+
mc.node_provisioning_profile.default_node_pools = default_pools
5724+
5725+
return mc
5726+
5727+
def set_up_node_provisioning_profile(self, mc: ManagedCluster) -> ManagedCluster:
5728+
self._ensure_mc(mc)
5729+
5730+
mc = self.set_up_node_provisioning_mode(mc)
5731+
mc = self.set_up_node_provisioning_default_pools(mc)
5732+
5733+
return mc
5734+
56835735
def init_mc(self) -> ManagedCluster:
56845736
"""Initialize a ManagedCluster object with required parameter location and attach it to internal context.
56855737
@@ -6923,6 +6975,8 @@ def construct_mc_profile_default(self, bypass_restore_defaults: bool = False) ->
69236975
mc = self.set_up_bootstrap_profile(mc)
69246976
# set up static egress gateway profile
69256977
mc = self.set_up_static_egress_gateway(mc)
6978+
# set up node provisioning profile
6979+
mc = self.set_up_node_provisioning_profile(mc)
69266980

69276981
# DO NOT MOVE: keep this at the bottom, restore defaults
69286982
if not bypass_restore_defaults:
@@ -8781,6 +8835,48 @@ def update_static_egress_gateway(self, mc: ManagedCluster) -> ManagedCluster:
87818835
mc.network_profile.static_egress_gateway_profile.enabled = False
87828836
return mc
87838837

8838+
def update_node_provisioning_mode(self, mc: ManagedCluster) -> ManagedCluster:
8839+
self._ensure_mc(mc)
8840+
8841+
mode = self.context.get_node_provisioning_mode()
8842+
if mode is not None:
8843+
if mc.node_provisioning_profile is None:
8844+
mc.node_provisioning_profile = (
8845+
self.models.ManagedClusterNodeProvisioningProfile() # pylint: disable=no-member
8846+
)
8847+
8848+
# set mode
8849+
mc.node_provisioning_profile.mode = mode
8850+
8851+
return mc
8852+
8853+
def update_node_provisioning_default_pools(self, mc: ManagedCluster) -> ManagedCluster:
8854+
self._ensure_mc(mc)
8855+
8856+
default_pools = self.context.get_node_provisioning_default_pools()
8857+
if default_pools is not None:
8858+
if mc.node_provisioning_profile is None:
8859+
mc.node_provisioning_profile = (
8860+
self.models.ManagedClusterNodeProvisioningProfile() # pylint: disable=no-member
8861+
)
8862+
8863+
# set default_node_pools
8864+
mc.node_provisioning_profile.default_node_pools = default_pools
8865+
8866+
return mc
8867+
8868+
def update_node_provisioning_profile(self, mc: ManagedCluster) -> ManagedCluster:
8869+
"""Updates the nodeProvisioningProfile field of the managed cluster
8870+
8871+
:return: the ManagedCluster object
8872+
"""
8873+
self._ensure_mc(mc)
8874+
8875+
mc = self.update_node_provisioning_mode(mc)
8876+
mc = self.update_node_provisioning_default_pools(mc)
8877+
8878+
return mc
8879+
87848880
def update_mc_profile_default(self) -> ManagedCluster:
87858881
"""The overall controller used to update the default ManagedCluster profile.
87868882
@@ -8868,6 +8964,8 @@ def update_mc_profile_default(self) -> ManagedCluster:
88688964
mc = self.update_static_egress_gateway(mc)
88698965
# update kubernetes version and orchestrator version
88708966
mc = self.update_kubernetes_version_and_orchestrator_version(mc)
8967+
# update node provisioning profile
8968+
mc = self.update_node_provisioning_profile(mc)
88718969
return mc
88728970

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

0 commit comments

Comments
 (0)