快速入门:完成在 Nexus Azure Kubernetes 服务上部署 Azure 操作员 5G 核心预览版的先决条件

本文介绍如何通过创建以下方法预配 Nexus Azure Kubernetes 服务 (NAKS) 群集:

  • 网络结构(连接)资源
  • 网络云(计算)资源

注意

本文中的示例配置使用 Azure CLI。 还可以使用 bicep 脚本、terraform 脚本、ARM 模板或直接调用相关 API 的自定义程序创建这些资源。

本文中使用的命令引用以下资源组:

  • 基础结构(已管理的)资源组:
    • Fabric - 平台网络资源
    • Undercloud - 平台计算资源
    • 用于托管 Azure-ARC Kubernetes 资源的托管资源组
  • 租户资源组:
    • Fabric - 租户网络资源(如网络)
    • 计算 - 租户计算资源(例如 VM 和 Nexus Azure Kubernetes 服务 (AKS) 群集)

先决条件

在部署 NAKS 群集之前:

  • 在客户边缘(CE)和服务提供商边缘(PE)(或称电信边缘)设备之间配置外部网络,以允许与服务提供商边缘建立连接。 配置对 Azure 上托管的防火墙和服务(租户不是平台)等外部服务的访问权限超出了本文的范围。
  • 配置跳板机以连接路由域。 配置 jumpbox 超出了本文的范围。
  • 在 Nexus Network Fabric 未控制的 PEs/Telco Edge 上配置网络元素,例如用于租户工作负载连接到 Azure 的 Express Route 电路配置(适用于可选的混合设置)或通过运营商核心网络进行连接。
  • 查看 Nexus Kubernetes 发布日历,以确定可用的版本和支持计划。
  • 查看 Nexus Kubernetes 群集概述
  • 请查看 网络结构概述
  • 查看 Azure 隔离域 How-To 指南
  • 查看 存储概述

配置内部网络和协议

完成这些任务以设置内部网络。

创建隔离域 (L3ISD)

使用以下 Azure CLI 命令创建隔离域(ISD):

export subscriptionId="<SUBSCRIPTION-ID>" 
export rgManagedFabric="<RG-MANAGED-FABRIC>" 
export nnfId="<NETWORK-FABRIC-ID>" 
export rgFabric="<RG-FABRIC>" 
export l3Isd="<ISD-NAME>" 
export region="<REGION>" 
 
az networkfabric l3domain create –resource-name $l3Isd \ 
--resource-group $rgFabric \ 
--location $region \ 
--nf-id "/subscriptions/$subscriptionId/resourceGroups/$rgManagedFabric/providers/Microsoft.ManagedNetworkFabric/networkFabrics/$nnfId" \ 
--redistribute-connected-subnets "True" \ 
--redistribute-static-routes "True" \ 
--subscription "$subscriptionId"

若要查看新的 L3ISD 隔离域,请输入以下命令:

export subscriptionId="<SUBSCRIPTION-ID>" 
export rgFabric="<RG-FABRIC>" 
export l3Isd="<ISD-NAME>" 
 
az networkfabric l3domain show --resource-name $l3Isd -g $rgFabric --subscription $subscriptionId

创建内部网络

在创建或修改内部网络之前,必须禁用 ISD。 进行更改后重新启用 ISD。

禁用隔离域

使用以下命令禁用 ISD:

export subscriptionId="<SUBSCRIPTION-ID>" 
export rgFabric="<RG-FABRIC>" 
export l3Isd="<ISD-NAME>" 
  
# Disable ISD to create internal networks, wait for 5 minutes and check the status is Disabled 
 
az networkfabric l3domain update-admin-state –resource-name "$l3Isd" \ 
--resource-group "$rgFabric" \ 
--subscription "$subscriptionId" \ 
--state Disable 
 
# Check the status of the ISD 
 
az networkfabric l3domain show –resource-name "$l3Isd" \ 
--resource-group "$rgFabric" \ 
--subscription "$subscriptionId"

禁用 ISD 后,可以添加、修改或删除内部网络。 完成更改后,请重新启用 ISD,如 启用隔离域中所述。

创建默认的 Azure 容器网络接口内部网络

使用以下命令创建默认的 Azure 容器网络接口(CNI)内部网络:

export subscriptionId="<SUBSCRIPTION-ID>" 
export intnwDefCni="<DEFAULT-CNI-NAME>" 
export l3Isd="<ISD-NAME>" 
export rgFabric="<RG-FABRIC>" 
export vlan=<VLAN-ID> 
export peerAsn=<PEER-ASN> 
export ipv4ListenRangePrefix="<DEFAULT-CNI-IPV4-PREFIX>/<PREFIX-LEN>" 
export mtu=9000 
 
az networkfabric internalnetwork create –resource-name "$intnwDefCni" \ 
--resource-group "$rgFabric" \ 
--subscription "$subscriptionId" \ 
--l3domain "$l3Isd" \ 
--vlan-id $vlan \ 
--mtu $mtu \ 
--connected-ipv4-subnets "[{prefix:$ipv4ListenRangePrefix}]" \ 
--bgp-configuration
{peerASN:$peerAsn,allowAS:0,defaultRouteOriginate:True,ipv4ListenRangePrefixes:['$ipv4ListenRangePrefix']}" 

为用户平面函数(N3、N6)和访问和移动管理功能(N2)接口创建内部网络

创建用户平面函数(UPF)内部网络时,支持双堆栈 IPv4/IPv6。 无需配置边界网关协议(BGP)构造端自治系统编号(ASN),因为 ASN 包含在网络构造资源创建中。 使用以下命令创建这些内部网络。

注意

请根据 先决条件 部分中所述,创建相应数量的内部网络。

export subscriptionId="<SUBSCRIPTION-ID>" 
export intnwName="<INTNW-NAME>" 
export l3Isd="<ISD-NAME>" // N2, N3, N6  
export rgFabric="<RG-FABRIC>" 
export vlan=<VLAN-ID> 
export peerAsn=<PEER-ASN> 
export ipv4ListenRangePrefix="<IPV4-PREFIX>/<PREFIX-LEN>" 
export ipv6ListenRangePrefix="<IPV6-PREFIX>/<PREFIX-LEN>" 
export mtu=9000 
 
az networkfabric internalnetwork create –resource-name "$intnwName" \ 
--resource-group "$rgFabric" \ 
--subscription "$subscriptionId" \ 
--l3domain "$l3Isd" \ 
--vlan-id $vlan \ 
--mtu $mtu \ 
--connected-ipv4-subnets "[{prefix:$ipv4ListenRangePrefix}]" \ 
--connected-ipv6-subnets "[{prefix:'$ipv6ListenRangePrefix'}]" \ //optional
--bgp-configuration 
"{peerASN:$peerAsn,allowAS:0,defaultRouteOriginate:True,ipv4ListenRangePrefixes:[$ipv4ListenRangePrefix],ipv6ListenRangePrefixes:['$ipv6ListenRangePrefix']}"

若要查看创建的内部网络列表,请输入以下命令:

export subscriptionId="<SUBSCRIPTION-ID>" 
export rgFabric="<RG-FABRIC>" 
export l3Isd="<ISD-NAME>" 
 
az networkfabric internalnetwork list -o table --subscription $subscriptionId -g $rgFabric --l3domain $l3Isd

若要查看特定内部网络的详细信息,请输入以下命令:

export subscriptionId="<SUBSCRIPTION-ID>" 
export rgFabric="<RG-FABRIC>" 
export l3Isd="<ISD-NAME>" 
export intnwName="<INTNW-NAME>" 
 
az networkfabric internalnetwork show --resource-name $intnwName -g $rgFabric --l3domain $l3Isd

启用隔离域

使用以下命令启用 ISD:

export subscriptionId="<SUBSCRIPTION-ID>" 
export rgFabric="<RG-FABRIC>" 
export l3Isd="<ISD-NAME>" 
  
# Enable ISD, wait for 5 minutes and check the status is Enabled 
 
az networkfabric l3domain update-admin-state –resource-name "$l3Isd" \ 
--resource-group "$rgFabric" \ 
--subscription "$subscriptionId" \ 
--state Enable 
 
# Check the status of the ISD 
 
az networkfabric l3domain show –resource-name "$l3Isd" \ 
--resource-group "$rgFabric" \ 
--subscription "$subscriptionId"

若要为内部网络配置 BGP 和双向转发检测(BFD)路由,请使用默认设置。 有关参数说明,请参阅 Nexus 文档

创建 L3 网络

在部署 NAKS 群集之前,必须创建映射到网络结构 (NF) 资源的网络云 (NC) L3 网络资源。 必须为默认 CNI 接口创建 L3 网络 NC 资源,包括相应内部网络的 ISD/VLAN/IP 前缀。 将这些资源直接附加到 VM,以在网络接口卡(NIC)虚拟功能(VF)级别执行 VLAN 标记,而不是应用程序级别(从应用程序角度访问端口)和/或 Nexus(使用 IP 地址管理(ipam)功能分配 IP 地址)。

L3 网络用于默认 CNI 接口。 每个接口需要多个 VLAN 的其他接口必须是中继接口。

使用以下命令创建 L3 网络:

Export subscriptionId="<SUBSCRIPTION-ID>" 
export rgManagedUndercloudCluster="<RG-MANAGED-UNDERCLOUD-CLUSTER>" 
export undercloudCustLocationName="<UNDERCLOUD-CUST-LOCATION-NAME>" 
export rgFabric="<RG-FABRIC>" 
export rgCompute="<RG-COMPUTE>" 
export l3Name="<L3-NET-NAME>" 
export l3Isd="<ISD-NAME>" 
export region="<REGION>" 
export vlan=<VLAN-ID> 
export ipAllocationType="IPV4" // DualStack, IPV4, IPV6 
export ipv4ConnectedPrefix="<DEFAULT-CNI-IPV4-PREFIX>/<PREFIX-LEN>" // if IPV4 or DualStack 
export ipv6ConnectedPrefix="<DEFAULT-CNI-IPV6-PREFIX>/<PREFIX-LEN>" // if IPV6 or DualStack 
 
 az networkcloud l3network create –l3-network-name $l3Name \ 
--l3-isolation-domain-id 
"/subscriptions/$subscriptionId/resourceGroups/$rgFabric/providers/Microsoft.ManagedNetworkFabric/l3IsolationDomains/$l3Isd" \ 
--vlan $vlan \ 
--ip-allocation-type $ipAllocationType \ 
--ipv4-connected-prefix $ipv4ConnectedPrefix \ 
--extended-location name="/subscriptions/$subscriptionId/resourceGroups/$rgManagedUndercloudCluster/providers/Microsoft.ExtendedLocation/customLocations/$undercloudCustLocationName" type="CustomLocation" \ 
--resource-group $rgCompute \ 
--location $region \ 
--subscription $subscriptionId \ 
--interface-name "vlan-$vlan"

若要查看创建的 L3 网络,请输入以下命令:

export subscriptionId="<SUBSCRIPTION-ID>" 
export rgCompute="<RG-COMPUTE>" 
export l3Name="<L3-NET-NAME>" 
 
az networkcloud l3network show -n $l3Name -g $rgCompute --subscription $subscriptionId

中继网络

如果连接到虚拟机的单个端口/接口必须携带多个虚拟局域网(VLAN),则需要 trunkednetwork 网络云资源。 标记在应用程序层而不是 NIC 上执行。 中继接口可以承载属于不同 ISD 的 VLAN。

必须为访问和管理移动功能(AMF)(N2)和 UPF(N3、N6)创建中继网络。

使用以下命令创建中继网络:

export subscriptionId="<SUBSCRIPTION-ID>" 
export rgManagedUndercloudCluster="<RG-MANAGED-UNDERCLOUD-CLUSTER>" 
export undercloudCustLocationName="<UNDERCLOUD-CUST-LOCATION-NAME>" 
export rgFabric="<RG-FABRIC>" 
export rgCompute="<RG-COMPUTE>" 
export trunkName="<TRUNK-NAME>" 
export l3IsdUlb="<ISD-ULB-NAME>" 
export vlanUlb=<VLAN-ULB-ID> 
export region="<REGION>" 
 
az networkcloud trunkednetwork create --name $trunkName \ 
--isolation-domain-ids
 "/subscriptions/$subscriptionId/resourceGroups/$rgFabric/providers/Microsoft.ManagedNetworkFabric/l3IsolationDomains/$l3IsdUlb" \ 
--vlans $vlanUlb \ 
--extended-location name="/subscriptions/$subscriptionId/resourceGroups/$rgManagedUndercloudCluster/providers/Microsoft.ExtendedLocation/customLocations/$undercloudCustLocationName" type="CustomLocation" \ 
--resource-group $rgCompute \ 
--location $region \ 
--interface-name "trunk-ulb" \ 
--subscription $subscriptionId

若要查看创建的中继网络资源,请输入以下命令:

export subscriptionId="<SUBSCRIPTION-ID>" 
export rgCompute="<RG-COMPUTE>" 
export trunkName="<TRUNK-NAME>" 
 
az networkcloud trunkednetwork show -n $trunkName -g $rgCompute --subscription $subscriptionId

配置云服务网络代理和白名单中的域名

云服务网络代理(CSN 代理)用于访问 Azure 和 Internet 目标。 必须将这些域显式添加到 NAKS 群集的 CSN 配置中的允许列表才能访问 Azure 服务和 Arc 集成。

基于网络函数管理器的云服务网络端点

为基于网络函数管理器(NFM)的部署支持添加以下出口点(HybridNetwork 资源提供程序(RP)、CustomLocation RP 可访问性、ACR、Arc):

  • .azurecr.io/ 端口 80
  • .azurecr.io / 端口 443
  • .mecdevice.azure.com/ 端口 443
  • eastus-prod.mecdevice.azure.com/端口 443
  • .microsoftmetrics.com/ 端口 443
  • crprivatemobilenetwork.azurecr.io/端口 443
  • .guestconfiguration.azure.com / 端口 443
  • .kubernetesconfiguration.azure.com/ 端口 443
  • eastus.obo.arc.azure.com/端口 8084
  • .windows.net/ 端口 80
  • .windows.net / 端口 443
  • .k8connecthelm.azureedge.net/ 端口 80
  • .k8connecthelm.azureedge.net / 端口 443
  • .k8sconnectcsp.azureedge.net/ 端口 80
  • .k8sconnectcsp.azureedge.net / 端口 443
  • .arc.azure.net/ 端口 80
  • .arc.azure.net/ 端口 443

Python 云服务网络端点

对于安装 python 包(作为 NAKS 中使用的 fed-kube_addons pod-node_config 命令列表的一部分),请添加以下端点:

  • pypi.org/端口 443
  • files.pythonhosted.org/端口 443

注意

如果需要将数据注入 ADX,可能需要将其他 Azure Detat Explorer(ADX)终结点包含在允许列表中。

可选的云服务网络终结点

使用以下目标运行其终结点存储在公共容器注册表中的容器,或为辅助虚拟机安装更多包:

  • .ghcr.io/ 端口 80
  • .ghcr.io/ 端口 443
  • .k8s.gcr.io/ 端口 80
  • .k8s.gcr.io / 端口 443
  • .k8s.io/ 端口 80
  • .k8s.io / 端口 443
  • .docker.io / 端口 80
  • .docker.io / 端口 443
  • .docker.com/ 端口 80
  • .docker.com/ 端口 443
  • .pkg.dev/ 端口 80
  • .pkg.dev/ 端口 443
  • .ubuntu.com/ 端口 80
  • .ubuntu.com / 端口 443

创建云服务网络

在 Nexus 平台上部署 Azure 操作员 5G 核心预览版时,必须为每个 NAKS 群集创建单独的 CSN 实例。

注意

根据前面各节中提供的说明和列表调整 additional-egress-endpoints 列表。

export subscriptionId="<SUBSCRIPTION-ID>" 
export rgManagedUndercloudCluster="<RG-MANAGED-UNDERCLOUD-CLUSTER>" 
export undercloudCustLocationName="<UNDERCLOUD-CUST-LOCATION-NAME>" 
export rgCompute="<RG-COMPUTE>" 
export csnName="<CSN-NAME>" 
export region="<REGION>" 
 
az networkcloud cloudservicesnetwork create --cloud-services-network-name $csnName \ 
--extended-location name="/subscriptions/$subscriptionId/resourceGroups/$rgManagedUndercloudCluster/providers/Microsoft.ExtendedLocation/customLocations/$undercloudCustLocationName" type="CustomLocation" \06- \ 
--resource-group $rgCompute \ 
--location $region \ 
--enable-default-egress-endpoints True \ 
--subscription $subscriptionId \ 
--additional-egress-endpoints '[ 
    { 
      "category": "common", 
      "endpoints": [ 
        { 
          "domainName": ".io", 
          "port": 80 
        } 
      ] 
    }, 
    { 
      "category": "common", 
      "endpoints": [ 
        { 
          "domainName": ".io", 
          "port": 443 
        } 
      ] 
    } 
  ]'    07-

创建 CSN 后,请使用命令行中的以下命令验证 egress-endpoints

export subscriptionId="<SUBSCRIPTION-ID>" 
export rgCompute="<RG-COMPUTE>" 
export csnName="<CSN-NAME>" 
 
az networkcloud cloudservicesnetwork show -n $csnName -g $rgCompute --subscription $subscriptionId

创建 Nexus Azure Kubernetes 服务群集

与 Nexus 相关的资源提供程序必须部署用于部署客户创建的必要资源的自管理资源组。 预配 Nexus AKS 群集时,必须启用 Arc 功能。 网络云资源提供程序创建自己的托管资源组,并将其部署到 Azure Arc Kubernetes 群集资源中。 在此部署之后,此群集资源链接到 NAKS 群集资源。

注意

在 NAKS 群集部署并创建托管资源组后,可能需要向所有用户/entra 组/服务主体授予对托管资源组的访问权限。 此操作取决于订阅级别标识访问管理(IAM)设置。

使用以下 Azure CLI 命令创建 NAKS 群集:

export subscriptionId="<SUBSCRIPTION-ID>" 
export rgManagedUndercloudCluster="<RG-MANAGED-UNDERCLOUD-CLUSTER>" 
export undercloudCustLocationName="<UNDERCLOUD-CUST-LOCATION-NAME>" 
export rgCompute="<RG-COMPUTE>" 
export rgNcManaged="<RG-NETWORK-CLOUD-MANAGED>" 
export csnName="<CSN-NAME>" 
export defCniL3Net="<L3-NET-FOR-DEF-CNI>" 
export trunkName="<TRUNK-NAME>" 
export naksName="<NAKS-NAME>" 
export k8sVer="<K8S-VER>" 
export region="<REGION>" 
export regionRgNcManaged="<REGION-RG-NETWORK-CLOUD-MANAGED>" 
export sshPubKeys="<SSH-PUB-KEYS>"  
export adminUser="<ADMIN-USER>" // e.g. "azureuser" 
export controlVmSku="<CONTROL-NODE-SKU>" 
export controlVmCount="<CONTROL-NODE-COUNT>" 
export workerVmSku="<WORKER-NODE-SKU>" 
export workerVmCount="<WORKER-NODE-COUNT>" 
export nodePoolName="<NODE-POOL-NAME>" 
export lbIpv4Pool="<LOADBALANCER-IPV4-POOL>" 
export hugePages2MCount=<HUGEPAGES-2M-COUNT> 
export aadAdminGroupObjectId="<AAD-GROUP-TO-ACCESS-NAKS>" 
export maxSurge=1 // number of nodes added to the cluster during upgrade e.g. 1 or percentage "10%"   
 
 
az networkcloud kubernetescluster create --name $naksName \ 
--resource-group $rgCompute \ 
--location $region \ 
--kubernetes-version $k8sVer \ 
--extended-location name="/subscriptions/$subscriptionId/resourceGroups/$rgManagedUndercloudCluster/providers/Microsoft.ExtendedLocation/customLocations/$undercloudCustLocationName" type="CustomLocation" \ 
--admin-username $adminUser \ 
--ssh-key-values "$sshPubKeys" \ 
--initial-agent-pool-configurations "[{count:$workerVmCount,mode:'System',name:'$nodePoolName',vmSkuName:'$workerVmSku',agentOptions:{hugepagesCount:$hugePages2MCount,hugepagesSize:2M},upgradeSettings:{maxSurge:$maxSurge},adminUsername:'$adminUser',ssh-key-values:['$sshPubKeys']}]" \ 
--control-plane-node-configuration count=$workerVmCount vmSkuName=$controlVmSku adminUsername=$adminUser ssh-key-values=['$sshPubKeys'] \ 
--network-configuration cloud-services-network-id="/subscriptions/$subscriptionId/resourceGroups/$rgCompute/providers/Microsoft.NetworkCloud/cloudServicesNetworks/$csnName" cni-network-id="/subscriptions/$subscriptionId/resourceGroups/$rgCompute/providers/Microsoft.NetworkCloud/l3Networks/$defCniL3Net" pod-cidrs=["10.244.0.0/16"] service-cidrs=["10.96.0.0/16"] dns-service-ip="10.96.0.10" attached-network-configuration.trunked-networks="[{networkId:'/subscriptions/$subscriptionId/resourceGroups/$rgCompute/providers/Microsoft.NetworkCloud/trunkedNetworks/$trunkName',pluginType:'SRIOV'}]" bgp-service-load-balancer-configuration.fabric-peering-enabled="True" bgp-service-load-balancer-configuration.ip-address-pools="[{addresses:['$lbIpv4Pool'],autoAssign:'True',name:'pool1',onlyUseHostIps:'True'}]" \ 
--managed-resource-group-configuration "{location:$regionRgNcManaged,name:$rgNcManaged}" \ 
--aad-configuration admin-group-object-ids=[$aadAdminGroupObjectId] \ 
--subscription $subscriptionId

若要验证已创建的 Nexus 群集的列表,请输入以下命令:

export subscriptionId="<SUBSCRIPTION-ID>" 
 
az networkcloud kubernetescluster list -o table --subscription $subscriptionId

若要验证已创建的群集的详细信息,请输入以下命令:

export subscriptionId="<SUBSCRIPTION-ID>" 
export rgCompute="<RG-COMPUTE>" 
export naksName="<NAKS-NAME>" 
 
az networkcloud kubernetescluster show -n $naksName -g $rgCompute --subscription $subscriptionId

创建群集后,可以启用 NFM 扩展并设置自定义位置,以便可以通过 AOSM 或 NFM 部署群集。

访问 Nexus Azure Kubernetes 服务群集

可通过多种方式访问租户 NAKS 群集的 API 服务器:

  • 直接从 IP 地址/端口访问(通过已连接到租户 NAKS API 服务器的跳板机)

  • 使用 Azure CLI 和 connectedk8s 代理选项,通过链接中所述的方法直接访问群集。 在 NAKS 群集预配时,必须提供服务主体或用户的 EntraID/AAD 组(与 Azure CLI 一起使用)。 此外,您还必须将一个自定义角色分配给由网络云资源管理器创建的托管资源组。 必须在此角色中启用以下操作之一:

    • Microsoft.Kubernetes/connectedClusters/listClusterUserCredential/action
    • 作为托管资源组参与者的用户或服务提供商

Azure Edge 服务

Azure 操作员 5G Core 是一种电信工作负载,可用于为消费者和企业最终用户提供服务。 Azure 运营商 5G 核心工作负荷在网络功能虚拟化基础设施(NFVI)层上运行,可能依赖于其他 NFVI 服务。

Edge NFVI 功能(在 Azure 运营商 Nexus 上运行)

注意

Edge NFVI 相关服务可能会偶尔更新。 有关这些服务的详细信息,请参阅特定服务的文档。

  • Azure 运营商 Nexus - Azure 运营商 Nexus 是电信运营商的运营商级下一代混合云平台。 Azure 操作员 Nexus 专为操作员的网络密集型工作负载和任务关键型应用程序构建。

  • Azure Operator Nexus 可能依赖于其他任何硬件和服务。

  • Azure Arc - 为 Azure 和本地环境中的 Azure 操作员 5G 核心应用程序和服务提供统一的管理和治理平台。

  • Azure Monitor - 提供全面的解决方案,用于监视 Azure 和本地环境中的 Azure 操作员 5G 核心应用程序和服务的性能和运行状况。

  • EntraID - 为 Azure 和本地环境中的 Azure 运营商 5G 核心用户和管理员提供身份和访问管理。

  • Azure Key Vault - 提供一个安全且集中的存储,用于在 Azure 和本地环境中,管理 Azure 运营商 5G Core 的加密密钥和机密。