Skip to content

Commit 9a9b4bc

Browse files
[AKS] az aks create/update: Add --enable-container-network-logs parameter (#32700)
1 parent d012873 commit 9a9b4bc

File tree

8 files changed

+520
-22
lines changed

8 files changed

+520
-22
lines changed

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

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@
329329
short-summary: Resource ID of Azure Monitor Private Link scope for Monitoring Addon.
330330
- name: --enable-high-log-scale-mode
331331
type: bool
332-
short-summary: Enable High Log Scale Mode for Container Logs.
332+
short-summary: Enable High Log Scale Mode for Container Logs. Auto-enabled when --enable-container-network-logs is specified.
333333
- name: --sku
334334
type: string
335335
short-summary: Specify SKU name for managed clusters. Use '--sku base' enables a base managed cluster. Use '--sku automatic' enables an automatic managed cluster.
@@ -588,6 +588,9 @@
588588
- name: --acns-advanced-networkpolicies
589589
type: string
590590
short-summary: Enable advanced network policies (None, FQDN or L7) on a cluster when enabling advanced networking features with "--enable-acns".
591+
- name: --enable-container-network-logs
592+
type: bool
593+
short-summary: Enable container network log collection functionalities on a cluster. Automatically enables --enable-high-log-scale-mode.
591594
- name: --nrg-lockdown-restriction-level
592595
type: string
593596
short-summary: Restriction level on the managed node resource group.
@@ -1089,6 +1092,12 @@
10891092
- name: --acns-advanced-networkpolicies
10901093
type: string
10911094
short-summary: Enable advanced network policies (None, FQDN or L7) on a cluster when enabling advanced networking features with "--enable-acns".
1095+
- name: --enable-container-network-logs
1096+
type: bool
1097+
short-summary: Enable container network log collection functionalities on a cluster. Automatically enables --enable-high-log-scale-mode.
1098+
- name: --disable-container-network-logs
1099+
type: bool
1100+
short-summary: Disable container network log collection functionalities on a cluster.
10921101
- name: --nrg-lockdown-restriction-level
10931102
type: string
10941103
short-summary: Restriction level on the managed node resource group.
@@ -1261,7 +1270,7 @@
12611270
short-summary: Resource ID of Azure Monitor Private Link scope for Monitoring Addon.
12621271
- name: --enable-high-log-scale-mode
12631272
type: bool
1264-
short-summary: Enable High Log Scale Mode for Container Logs.
1273+
short-summary: Enable High Log Scale Mode for Container Logs. Auto-enabled when --enable-container-network-logs is specified.
12651274
- name: --appgw-name
12661275
type: string
12671276
short-summary: Name of the application gateway to create/use in the node resource group. Use with ingress-azure addon.

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -604,6 +604,7 @@ def load_arguments(self, _):
604604
c.argument('disable_acns_observability', action='store_true')
605605
c.argument('disable_acns_security', action='store_true')
606606
c.argument("acns_advanced_networkpolicies", arg_type=get_enum_type(advanced_networkpolicies))
607+
c.argument('enable_container_network_logs', action='store_true')
607608
c.argument("if_match")
608609
c.argument("if_none_match")
609610
# node provisioning
@@ -661,6 +662,8 @@ def load_arguments(self, _):
661662
c.argument('disable_acns_observability', action='store_true')
662663
c.argument('disable_acns_security', action='store_true')
663664
c.argument("acns_advanced_networkpolicies", arg_type=get_enum_type(advanced_networkpolicies))
665+
c.argument('enable_container_network_logs', action='store_true')
666+
c.argument('disable_container_network_logs', action='store_true')
664667
# private cluster parameters
665668
c.argument('enable_apiserver_vnet_integration', action='store_true')
666669
c.argument('apiserver_subnet_id', validator=validate_apiserver_subnet_id)

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,7 @@
198198
"Microsoft-ContainerInventory",
199199
"Microsoft-ContainerNodeInventory",
200200
"Microsoft-Perf",
201+
"Microsoft-ContainerNetworkLogs",
201202
]
202203

203204

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -934,17 +934,18 @@ def aks_create(
934934
disable_acns_observability=None,
935935
disable_acns_security=None,
936936
acns_advanced_networkpolicies=None,
937+
enable_container_network_logs=None,
937938
# network isoalted cluster
938939
bootstrap_artifact_source=CONST_ARTIFACT_SOURCE_DIRECT,
939940
bootstrap_container_registry_resource_id=None,
940941
# addons
941942
enable_addons=None,
942943
workspace_resource_id=None,
943944
enable_msi_auth_for_monitoring=True,
944-
enable_syslog=False,
945+
enable_syslog=None,
945946
data_collection_settings=None,
946947
ampls_resource_id=None,
947-
enable_high_log_scale_mode=False,
948+
enable_high_log_scale_mode=None,
948949
aci_subnet_name=None,
949950
appgw_name=None,
950951
appgw_subnet_cidr=None,
@@ -1161,6 +1162,8 @@ def aks_update(
11611162
disable_acns_observability=None,
11621163
disable_acns_security=None,
11631164
acns_advanced_networkpolicies=None,
1165+
enable_container_network_logs=None,
1166+
disable_container_network_logs=None,
11641167
# network isoalted cluster
11651168
bootstrap_artifact_source=None,
11661169
bootstrap_container_registry_resource_id=None,
@@ -1557,10 +1560,10 @@ def aks_enable_addons(cmd, client, resource_group_name, name, addons,
15571560
enable_secret_rotation=False,
15581561
rotation_poll_interval=None,
15591562
enable_msi_auth_for_monitoring=True,
1560-
enable_syslog=False,
1563+
enable_syslog=None,
15611564
data_collection_settings=None,
15621565
ampls_resource_id=None,
1563-
enable_high_log_scale_mode=False,
1566+
enable_high_log_scale_mode=None,
15641567
no_wait=False,):
15651568
instance = client.get(resource_group_name, name)
15661569
msi_auth = False

src/azure-cli/azure/cli/command_modules/acs/linter_exclusions.yml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,9 @@ aks create:
9191
enable_static_egress_gateway:
9292
rule_exclusions:
9393
- option_length_too_long
94+
enable_container_network_logs:
95+
rule_exclusions:
96+
- option_length_too_long
9497
aks enable-addons:
9598
parameters:
9699
appgw_watch_namespace:
@@ -209,6 +212,12 @@ aks update:
209212
disable_static_egress_gateway:
210213
rule_exclusions:
211214
- option_length_too_long
215+
enable_container_network_logs:
216+
rule_exclusions:
217+
- option_length_too_long
218+
disable_container_network_logs:
219+
rule_exclusions:
220+
- option_length_too_long
212221
aks nodepool add:
213222
parameters:
214223
disable_windows_outbound_nat:

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

Lines changed: 126 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2593,6 +2593,89 @@ def get_acns_advanced_networkpolicies(self) -> Union[str, None]:
25932593
)
25942594
return self.raw_param.get("acns_advanced_networkpolicies")
25952595

2596+
def get_container_network_logs(self, mc: ManagedCluster) -> Union[bool, None]:
2597+
"""Get the enablement of container network logs
2598+
2599+
:return: bool or None"""
2600+
enable_cnl = self.raw_param.get("enable_container_network_logs")
2601+
disable_cnl = self.raw_param.get("disable_container_network_logs")
2602+
if enable_cnl is None and disable_cnl is None:
2603+
return None
2604+
if enable_cnl and disable_cnl:
2605+
raise MutuallyExclusiveArgumentError(
2606+
"Cannot specify --enable-container-network-logs and "
2607+
"--disable-container-network-logs at the same time."
2608+
)
2609+
2610+
# Check if monitoring is being enabled via enable_addons parameter (for create scenarios)
2611+
enable_addons = self.raw_param.get("enable_addons")
2612+
monitoring_via_enable_addons = enable_addons and "monitoring" in enable_addons
2613+
2614+
# Check if monitoring is already enabled on the cluster
2615+
monitoring_on_cluster = (
2616+
mc.addon_profiles and
2617+
mc.addon_profiles.get("omsagent") and
2618+
mc.addon_profiles["omsagent"].enabled
2619+
)
2620+
2621+
# Check if ACNS is being enabled or already enabled
2622+
acns_enabled = (
2623+
self.raw_param.get("enable_acns", False) or
2624+
(mc.network_profile and mc.network_profile.advanced_networking and
2625+
mc.network_profile.advanced_networking.enabled)
2626+
)
2627+
2628+
# Check if network dataplane is set to cilium (either via parameter or already on the cluster)
2629+
network_dataplane_param = self.raw_param.get("network_dataplane")
2630+
network_dataplane_cluster = None
2631+
if mc.network_profile is not None:
2632+
network_dataplane_cluster = getattr(mc.network_profile, "network_dataplane", None)
2633+
network_dataplane = network_dataplane_param or network_dataplane_cluster
2634+
cilium_enabled = safe_lower(network_dataplane) == "cilium"
2635+
2636+
monitoring_enabled = monitoring_via_enable_addons or monitoring_on_cluster
2637+
2638+
if enable_cnl and (not acns_enabled or not monitoring_enabled or not cilium_enabled):
2639+
raise InvalidArgumentValueError(
2640+
"Container network logs requires ACNS to be enabled, the monitoring addon to be enabled, "
2641+
"and the cilium network dataplane."
2642+
)
2643+
enable_cnl = bool(enable_cnl) if enable_cnl is not None else False
2644+
disable_cnl = bool(disable_cnl) if disable_cnl is not None else False
2645+
return enable_cnl or not disable_cnl
2646+
2647+
def get_enable_high_log_scale_mode(self) -> Union[bool, None]:
2648+
"""Obtain the value of enable_high_log_scale_mode.
2649+
2650+
This method automatically enables high log scale mode when container network logs are enabled.
2651+
It validates that the user has not explicitly disabled high log scale mode when CNL is enabled.
2652+
2653+
Note: ACNS and monitoring addon validation is handled in get_container_network_logs().
2654+
2655+
:return: bool or None
2656+
"""
2657+
# Read the original value passed by the command
2658+
enable_high_log_scale_mode = self.raw_param.get("enable_high_log_scale_mode")
2659+
2660+
# Check if container network logs are being enabled
2661+
enable_container_network_logs = self.raw_param.get("enable_container_network_logs")
2662+
2663+
# If container network logs are being enabled, auto-enable high log scale mode
2664+
if enable_container_network_logs:
2665+
# If user explicitly set enable_high_log_scale_mode to False, raise an error
2666+
if enable_high_log_scale_mode is False:
2667+
raise MutuallyExclusiveArgumentError(
2668+
"Cannot explicitly disable --enable-high-log-scale-mode when "
2669+
"--enable-container-network-logs is specified. Container network logs "
2670+
"requires high log scale mode to be enabled."
2671+
)
2672+
2673+
# Auto-enable high log scale mode
2674+
return True
2675+
2676+
# If container network logs are not being enabled, return the original value
2677+
return enable_high_log_scale_mode
2678+
25962679
def _get_pod_cidr_and_service_cidr_and_dns_service_ip_and_docker_bridge_address_and_network_policy(
25972680
self, enable_validation: bool = False
25982681
) -> Tuple[
@@ -3025,21 +3108,6 @@ def get_enable_syslog(self) -> Union[bool, None]:
30253108
# this parameter does not need validation
30263109
return enable_syslog
30273110

3028-
def get_enable_high_log_scale_mode(self) -> Union[bool, None]:
3029-
"""Obtain the value of enable_high_log_scale_mode.
3030-
3031-
Note: The arg type of this parameter supports three states (True, False or None), but the corresponding default
3032-
value in entry function is not None.
3033-
3034-
:return: bool or None
3035-
"""
3036-
# read the original value passed by the command
3037-
enable_high_log_scale_mode = self.raw_param.get("enable_high_log_scale_mode")
3038-
3039-
# this parameter does not need dynamic completion
3040-
# this parameter does not need validation
3041-
return enable_high_log_scale_mode
3042-
30433111
def get_data_collection_settings(self) -> Union[str, None]:
30443112
"""Obtain the value of data_collection_settings.
30453113
@@ -6657,6 +6725,22 @@ def set_up_addon_profiles(self, mc: ManagedCluster) -> ManagedCluster:
66576725
addon_profiles[
66586726
CONST_AZURE_KEYVAULT_SECRETS_PROVIDER_ADDON_NAME
66596727
] = self.build_azure_keyvault_secrets_provider_addon_profile()
6728+
6729+
# Set up container network logs if enabled
6730+
container_network_logs_enabled = self.context.get_container_network_logs(mc)
6731+
if container_network_logs_enabled is not None:
6732+
monitoring_addon_profile = addon_profiles.get(CONST_MONITORING_ADDON_NAME)
6733+
if monitoring_addon_profile:
6734+
config = monitoring_addon_profile.config or {}
6735+
config["enableRetinaNetworkFlags"] = str(container_network_logs_enabled)
6736+
monitoring_addon_profile.config = config
6737+
6738+
# Trigger validation for high log scale mode when container network logs are enabled.
6739+
# This ensures proper error messages are raised before cluster creation if the user
6740+
# explicitly disables high log scale mode while enabling container network logs.
6741+
if self.context.raw_param.get("enable_container_network_logs"):
6742+
self.context.get_enable_high_log_scale_mode()
6743+
66606744
mc.addon_profiles = addon_profiles
66616745
return mc
66626746

@@ -8233,6 +8317,31 @@ def update_network_profile_advanced_networking(self, mc: ManagedCluster) -> Mana
82338317
mc.network_profile.advanced_networking = acns
82348318
return mc
82358319

8320+
def update_monitoring_profile_flow_logs(self, mc: ManagedCluster) -> ManagedCluster:
8321+
"""Update monitor profile for the ManagedCluster object for flow logs.
8322+
8323+
:return: the ManagedCluster object
8324+
"""
8325+
self._ensure_mc(mc)
8326+
8327+
# Trigger validation for high log scale mode when container network logs are enabled.
8328+
# This ensures proper error messages are raised before cluster update if the user
8329+
# explicitly disables high log scale mode while enabling container network logs.
8330+
if self.context.raw_param.get("enable_container_network_logs"):
8331+
self.context.get_enable_high_log_scale_mode()
8332+
8333+
container_network_logs_enabled = self.context.get_container_network_logs(mc)
8334+
if container_network_logs_enabled is not None:
8335+
if mc.addon_profiles:
8336+
addon_consts = self.context.get_addon_consts()
8337+
CONST_MONITORING_ADDON_NAME = addon_consts.get("CONST_MONITORING_ADDON_NAME")
8338+
monitoring_addon_profile = mc.addon_profiles.get(CONST_MONITORING_ADDON_NAME)
8339+
if monitoring_addon_profile:
8340+
config = monitoring_addon_profile.config or {}
8341+
config["enableRetinaNetworkFlags"] = str(container_network_logs_enabled)
8342+
mc.addon_profiles[CONST_MONITORING_ADDON_NAME].config = config
8343+
return mc
8344+
82368345
def update_http_proxy_config(self, mc: ManagedCluster) -> ManagedCluster:
82378346
"""Set up http proxy config for the ManagedCluster object.
82388347
@@ -9518,6 +9627,8 @@ def update_mc_profile_default(self) -> ManagedCluster:
95189627
mc = self.update_network_profile(mc)
95199628
# update network profile with acns
95209629
mc = self.update_network_profile_advanced_networking(mc)
9630+
# update monitoring profile flow logs
9631+
mc = self.update_monitoring_profile_flow_logs(mc)
95219632
# update aad profile
95229633
mc = self.update_aad_profile(mc)
95239634
# update oidc issuer profile

src/azure-cli/azure/cli/command_modules/acs/tests/latest/test_aks_commands.py

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13162,7 +13162,56 @@ def test_aks_create_with_enable_acns_complex(
1316213162
"aks delete -g {resource_group} -n {name} --yes --no-wait",
1316313163
checks=[self.is_empty()],
1316413164
)
13165-
13165+
13166+
@live_only()
13167+
@AllowLargeResponse()
13168+
@AKSCustomResourceGroupPreparer(
13169+
random_name_length=17,
13170+
name_prefix="clitest",
13171+
location="eastus2euap",
13172+
)
13173+
def test_aks_create_acns_with_flow_logs(
13174+
self, resource_group, resource_group_location
13175+
):
13176+
# reset the count so in replay mode the random names will start with 0
13177+
self.test_resources_count = 0
13178+
# kwargs for string formatting
13179+
aks_name = self.create_random_name("cliakstest", 16)
13180+
self.kwargs.update(
13181+
{
13182+
"resource_group": resource_group,
13183+
"name": aks_name,
13184+
"location": resource_group_location,
13185+
"resource_type": "Microsoft.ContainerService/ManagedClusters",
13186+
"ssh_key_value": self.generate_ssh_keys(),
13187+
}
13188+
)
13189+
13190+
# create: enable acns with enable container network logs and enable high log scale mode
13191+
create_cmd = (
13192+
"aks create --resource-group={resource_group} --name={name} --location={location} "
13193+
"--ssh-key-value={ssh_key_value} --node-count=1 --tier standard "
13194+
"--network-plugin azure --network-dataplane=cilium --network-plugin-mode overlay "
13195+
"--enable-acns "
13196+
"--enable-container-network-logs "
13197+
"--enable-addons monitoring "
13198+
"--enable-high-log-scale-mode "
13199+
"--aks-custom-headers AKSHTTPCustomFeatures=Microsoft.ContainerService/AdvancedNetworkingPreview "
13200+
)
13201+
self.cmd(
13202+
create_cmd,
13203+
checks=[
13204+
self.check("provisioningState", "Succeeded"),
13205+
self.check("networkProfile.advancedNetworking.observability.enabled", True),
13206+
],
13207+
)
13208+
13209+
# delete
13210+
self.cmd(
13211+
"aks delete -g {resource_group} -n {name} --yes --no-wait",
13212+
checks=[self.is_empty()],
13213+
)
13214+
1316613215
@AllowLargeResponse()
1316713216
@AKSCustomResourceGroupPreparer(
1316813217
random_name_length=17,

0 commit comments

Comments
 (0)