你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Azure 运营商关系实例就绪性测试 (IRT)

实例就绪性测试 (IRT) 框架是 Nexus 平台的可选/附加工具。 它使运营商能够验证工作负载部署的 Azure 运营商关系实例的成功部署和就绪情况。 此验证适用于 Nexus 的初始部署和后续升级。 它运行一系列测试,并将测试结果作为 html 报告提供。

关键优势

  • 自助服务
    • IRT 使用户能够独立启动和执行测试。
  • 可重复
    • 用户可以多次在 Nexus 实例上执行 IRT,以验证测试结果的可靠性与一致性。
  • 能力
    • IRT 提供所有运营商都可以使用的通用功能。
    • 它支持验证新的 Nexus 部署和升级后状态。
    • 它允许测试网络函数基础结构组件。
    • 它有助于部署工作负载。
    • 用户使用命令行和输入文件执行 IRT 测试框架。 然后,该框架在客户的订阅中创建 Azure 容器实例。

使用 IRT 执行的测试

  • 对被测资源完成所有测试后,验证构造订阅和资源组中的 l3 域是否存在。
  • 对被测资源完成所有测试后,验证测试资源组中是否创建了 l3 个网络。
  • 验证过去 10 分钟内是否存在裸机的 NodeOsInfo 指标数据。 每个计数指标应大于 0。
  • 验证过去 10 分钟内是否存在 IdracPowerOn 指标数据。 每个计数指标应大于 0。
  • 验证过去 10 分钟内是否存在 CorednsDnsRequestsTotal 指标数据。 每个平均指标应大于 0。
  • 验证过去 10 分钟内是否存在 FelixClusterNumHosts 指标数据。 每个平均指标应大于 0。
  • 验证过去 10 分钟内是否存在 TyphaConnectionsAccepted 指标数据。 每个平均指标应大于 0。
  • 验证过去 10 分钟内是否存在 KubeDaemonsetStatusCurrentNumberScheduled 指标数据。 每个平均指标应大于 0。
  • 验证过去 10 分钟内是否存在 EtcdServerIsLeader 指标数据。 每个平均指标应大于 0。
  • 验证过去 10 分钟内是否存在 ApiserverAuditRequestsRejectedTotal 指标数据。 应该至少有一个时序数据条目。
  • 验证过去 10 分钟内是否存在 KubevirtInfo 指标数据。 每个平均指标应大于 0。
  • 验证过去 10 分钟内是否存在 ContainerMemoryUsageBytes 指标数据。 每个平均指标应大于 0。
  • 验证过去 10 分钟内是否存在 KubeletRunningPods 指标数据。 每个平均指标应大于 0。
  • 检查过去 10 分钟内是否存在结构网络设备的 CpuUtilizationMax 指标数据。 应至少存在一个非零指标。
  • 检查过去 10 分钟内是否存在 MemoryAvailable 指标数据。 应至少存在一个非零指标。
  • 使用 iPerf3 和 ARM 模板中的关联设置测试两个虚拟机之间的 IPv4 TCP 数据传输。 测试可确保数据吞吐量超过 60 Mbps。
  • 使用 iPerf3 和 ARM 模板中的关联设置测试两个虚拟机之间的 IPv6 TCP 数据传输。 测试可确保数据吞吐量超过 60 Mbps。
  • 使用 iPerf3 和 ARM 模板中的关联设置测试两个虚拟机之间的 IPV4 UDP 数据传输。 测试可确保数据吞吐量超过 1 Mbps。
  • 使用 iPerf3 和 ARM 模板中的关联设置测试两个虚拟机之间的 IPV6 UDP 数据传输。 测试可确保数据吞吐量超过 1 Mbps。
  • 使用 iPerf3 和 ARM 模板中的反关联设置测试两个虚拟机之间的 IPV4 TCP 数据传输。 测试可确保数据吞吐量超过 60 Mbps。
  • 使用 iPerf3 和 ARM 模板中的反关联设置测试两个虚拟机之间的 IPV6 TCP 数据传输。 测试可确保数据吞吐量超过 60 Mbps。
  • 使用 iPerf3 和 ARM 模板中的反关联设置测试两个虚拟机之间的 IPV4 UDP 数据传输。 测试可确保数据吞吐量超过 1 Mbps。
  • 使用 iPerf3 和 ARM 模板中的反关联设置测试两个虚拟机之间的 IPV6 UDP 数据传输。 测试可确保数据吞吐量超过 1 Mbps。
  • 在已启用巨型帧的两个虚拟机之间测试 IPv4 ping。 Stderr 应为空,并且不应观察到数据包丢失。
  • 在已启用巨型帧的两个虚拟机之间测试 IPv6 ping。 Stderr 应为空,并且不应观察到数据包丢失。
  • 验证是否已正确配置 IPV4 路由。
  • 验证是否已正确配置 IPV6 路由。
  • 验证网络接口是否按预期进行配置。
  • 使用 nslookup 验证 DNS 解析 Azure 门户终结点的能力。
  • 在 NAKS 群集内的 L2 接口上验证 vlan 的 dpdk-testpmd。
  • 在 NAKS 群集内的 L2 接口上验证 dpdk-testpmd,为 vlan 捕获的数据。
  • 在 NAKS 群集内的中继接口上验证 dpdk-testpmd,为中继捕获的数据。
  • 在 NAKS 群集内的 L3 接口上验证 dpdk-testpmd,为 L3 网络捕获的数据。
  • 在 NAKS 群集中验证所有 Pod 的状态是否处于“已完成”或“正在运行”状态。
  • 在已启用巨型帧的 NAKS 群集 Pod 与 VM 之间测试 IPv4 ping。 Stderr 应为空,并且不应观察到数据包丢失。
  • 在已启用巨型帧的 NAKS 群集 Pod 与 VM 之间测试 IPv6 ping。 Stderr 应为空,并且不应观察到数据包丢失。
  • 验证是否已成功创建 PersistentVolumeClaim。
  • 验证是否已成功创建 PersistentVolume。
  • 使用 volumeMode Block 和 accessMode RWO 测试创建 PVC。
  • 验证是否已在 sts 0 中装载添加的所有 nexus 共享卷和 nexus 卷卷。
  • 验证是否已在 sts 1 中装载添加的所有 nexus 共享卷和 nexus 卷卷。
  • 验证 sts 0 上装载的 nfs 存储是否可写。
  • 验证写入 sts 0 的 nfs 存储文件是否可以读取。
  • 验证 sts 0 上装载的共享 nfs 存储是否可写。
  • 验证写入 sts 0 的共享 nfs 文件是否可以读取。
  • 验证 sts 1 上装载的 nfs 存储是否可写。
  • 验证写入 sts 0 的共享文件是否可以在 sts 1 中读取。
  • 验证 sts 1 上装载的共享 nfs 存储是否可写。
  • 验证写入 sts 0 和 sts 1 的共享文件是否可以从 sts 1 中读取。
  • 验证写入 sts 0 和 sts 1 的共享文件是否可以从 sts 0 中读取。
  • 验证块存储是否已装载并可写。
  • 验证块存储是否已装载且可以读取。
  • 验证块存储是否已装载并可写。
  • 验证块存储是否已装载且可以读取。
  • 在删除使用 PVC 的 POD 之前验证是否删除 PVC (缩减 sts),删除 Pod naks-storage-statefulset-1。
  • 验证是否可以删除块存储 PVC。

如何运行 IRT

IRT 需要访问 GitHub Nexus-Samples 存储库中托管的软件包。 用户应导航到“发布”部分,并选择带有“最新”标记的发布。 此自述文件的副本在发布包中也可用,以在执行环境中方便参考。

请求访问 nexus-samples GitHub 存储库


访问 nexus-samples GitHub 存储库

  1. 将 GitHub 帐户链接到 Microsoft GitHub 组织 https://repos.opensource.microsoft.com/link

  2. 加入 Microsoft 组织https://repos.opensource.microsoft.com/orgs/Microsoft/join

  3. 发送电子邮件请求以添加到 nexus-samples GitHub 存储库以afoncamalgamatesall@microsoft.com

环境要求

  • 能够调用 Azure API 的 Linux 环境(建议使用 Ubuntu)。
  • 对其他 Linux 发行版(例如 RedHat、Mariner 等)的支持取决于能够安装必要的工具。 请参阅安装依赖项部分。
    • 已安装所需包的任何计算机都应能够使用脚本。
  • 了解要用于测试的网络。
    • 用于测试的网络在“networks-blueprint.yml”文件中指定,请参阅输入配置
  • 下载 IRT 发布包的方法,例如 curl、wget 等。
  • 能够创建具有正确角色的服务主体。
  • 可以从 KeyVault 中读取机密,有关详细信息,请参阅服务主体部分。
  • 能够在 Active Directory 租户中创建安全组。

输入配置

首先生成输入文件。 IRT tarball 以irt-input.example.yml为例。 按照说明下载 tarball。 示例值不适用于实例。 需要手动更改它们,并将文件重命名为irt-input.yml。 我们将示例输入文件作为存根以帮助配置新的输入文件。 该示例概述了可重写的值及其用法。 一次性设置在执行时将键/值对写入配置文件以帮助设置输入值。

可以在networks-blueprint.yml文件中提供网络信息(类似于我们提供的networks-blueprint.example.yml),或者将其追加到irt-input.yml文件中。 networks-blueprint.example.yml定义 IRT 的架构。 测试会创建网络,因此请提供未使用的网络详细信息。 目前,IRT 具有以下网络要求:

  • 三 (3) 个 L3 网络
    • 其中两 (2) 个具有 MTU 1500
    • 其中一 (1) 个具有 MTU 9000,且不应具有fabric_asn 属性
  • 一 (1) 个中继网络
  • 所有 VLAN 应大于 500

一次性设置

下载 IRT

从nexus-samples GitHub 存储库的发布部分通过 tarball 分发 IRT。

  1. 找到标记为“最新”的发布包,下载它,提取它,然后导航到irt目录。
  2. 将 tarball 提取到本地文件系统:mkdir -p irt && tar xf nexus-irt.tar.gz --directory ./irt
  3. 切换到新目录cd irt
  4. 有关任何值得注意的更新或更改,请参阅 RELEASE-CHANGELOG.md。

安装依赖项

执行期间应有多个依赖项可用。 查看此列表;

  • jq版本 1.6 或更高版本
  • yq版本 4.33 或更高版本
  • azcopy版本 10 或更高版本
  • az Azure CLI,保持最新状态。 最低预期版本:2.11.0(支持自我升级)
  • elinks - 用于在命令行上查看 html 文件(可选)
  • tree - 用于查看目录结构
  • moreutils - 用于查看 Azure 容器实例 (ACI) 容器的进度

提供了setup.sh脚本以帮助安装列出的依赖项。 它安装 PATH 中不可用的任何依赖项。 它不会升级不满足最低所需版本的任何依赖项。

注意

setup.sh假定非根用户并尝试使用sudo

提供了all-in-one-setup.sh以创建运行 IRT 所需的所有 Azure 资源。 此过程包括创建服务主体、安全组和隔离域。 可以单独执行all-in-one-setup.sh中调用的每个脚本。 这些脚本使用利用创建的资源所需的键值对将更新写入irt-input.yml文件。 无论选择哪个方法,请查看一个或多个脚本所需的输入的irt-input.example.yml文件。 所有脚本都是幂等的,允许根据需要使用现有资源。

分步设置

注意

只有当未使用 all-in-one.setup.sh 时,才使用此部分

如果工作流与all-in-one-setup.sh不兼容,可以使用每个补充脚本手动创建 IRT 所需的每个资源。 与all-in-one-setup.sh一样,运行这些脚本会将键/值对写入irt-input.yml,供你在运行期间使用。 这四个脚本构成了all-in-one-setup.sh脚本。”

IRT 针对资源发出命令,并需要权限才能执行此操作。 IRT 要求执行服务主体。 它还要求服务主体是 Azure AD 安全组(也作为输入提供)的成员。

身份验证和运行时权限

IRT 需要具有正确权限的服务主体才能与各种 Azure 和 NetworkCloud 资源进行交互。

创建服务主体和安全组

补充脚本 create-service-principal.sh 使用自定义角色 NRT Roles 创建服务主体,或将角色 NRT Roles 关联到现有服务主体。

此外,该脚本会创建必要的安全组,并将服务主体添加到安全组。 如果安全组存在,会将服务主体添加到现有的安全组中。

执行create-service-principal.sh需要输入 yaml 具有以下值。 可以设置相应的环境变量以重写所有值:

SERVICE_PRINCIPAL:
  NAME: "<name>" # env: SERVICE_PRINCIPAL_NAME
  AAD_GROUP_NAME: "<aad-group-name>" # env: SERVICE_PRINCIPAL_AAD_GROUP_NAME
  SUBSCRIPTION: "<subscription>" # env: SERVICE_PRINCIPAL_SUBSCRIPTION
  KV_NAME: "<keyvault>" # env: SERVICE_PRINCIPAL_KV_NAME
  KV_ID: <keyvault-secret> # env: SERVICE_PRINCIPAL_KV_ID
  • SERVICE_PRINCIPAL.NAME - 使用az ad sp create-for-rbac命令创建的服务主体的名称。
  • SERVICE_PRINCIPAL.AAD_GROUP_NAME - 安全组的名称。
  • SERVICE_PRINCIPAL.SUBSCRIPTION - 服务主体的订阅。
  • SERVICE_PRINCIPAL.KV_NAME - 用于存储服务主体密码的 KeyVault。
  • SERVICE_PRINCIPAL.KV_ID - 存储服务主体密码的 KeyVault 机密。

注意

请确保在执行create-service-principal.sh之前,已使用虚拟值创建 KeyVault (KV_NAME) 和/或机密 (KV_ID)。 还应向az login用户(执行 IRT 的人员)授予对此 KeyVault 的访问权限,以便在运行时拉取机密。

# Example execution of the script
./create-service-principal.sh irt-input.yml

注意

如果所有SP_IDSP_OBJECT_IDSP_TENANT_IDADMIN_GROUP_OBJECT_IDKV_NAMEKV_ID都设置在 yaml 中或作为环境变量进行设置,脚本会跳过创建它们。

结果:此脚本输出ADMIN_GROUP_OBJECT_IDSP_IDSP_OBJECT_IDSP_TENANTKV_NAMEKV_ID的值。 该脚本将值设置回输入 yaml。 请参阅输入配置

SP_ID: "<generated-sp-id>"
SP_OBJECT_ID: "<generated-sp-object-id>"
SP_TENANT_ID: "<generated-sp-tenant-id>"
ADMIN_GROUP_OBJECT_ID: "<generated-aad-group-id>"
KV_NAME: "<provided-key-vault-name>" # If SP already exists please fill it in to retrieve the SP Password.
KV_ID: "<provided-key-vault-secret>" # If SP already exists please fill it in to retrieve the SP Password.

创建自定义角色以供执行

如果有现有的服务主体,并且希望只需分配一个角色以执行 IRT,可以按照本部分中的说明进行操作。

先决条件
  • Azure 订阅
    • 确保有权访问 Azure 订阅。
  • Azure CLI
    • 确保本地计算机上存在 Azure CLI
步骤
  1. 准备环境

    1. 打开 Bash Shell:
    2. 可以使用支持 Bash 的任何终端
  2. 登录 Azure

    1. 执行以下命令登录到 Azure 帐户:
    # Start az CLI session
    az login
    
    # Set active subscription using the UUID
    az account set --subscription "<your-subscription-id>"
    
  3. 部署模板

    运行以下命令以部署 ARM 模板。 将示例变量值替换为实际值:

    # Set our variable values, these values are for the sake of example. Replace these values with your own as needed.
    location="eastus"
    deploymentName="IRTRoleDefinitionDeployment"
    templatePath="framework-templates/service-principal-roles.jsonc" # Path to the template file assuming the PWD is the root of the artifact tar
    roleName="Nexus Instance Readiness Tester"
    
    # run deployment
    az deployment sub create \
        --name "$deploymentName" \
        --location "$location" \
        --template-file "$templatePath" \
        --parameters roleName="$roleName"
    
  4. 将角色分配给用于测试的应用程序服务主体

    无论是通过一体化设置还是使用自己的设置创建,都可将新建的角色分配给标识。 此单一角色提供运行实例就绪性测试所需的所有授权。

     # The Application ID of your Service Principal for your application
     appId="00001111-aaaa-2222-bbbb-3333cccc4444"
     # this MUST match the deployment name used above.
     deploymentName="IRTRoleDefinitionDeployment"
    
     # This command gets the name of GUID of the role
     # az role definition list --name "$roleName" --query "[0].id" --output tsv | awk -F'/' '{print $NF}'
    
     # This command gets the GUID of the subscription
     # az account show --query id --output tsv --only-show-errors
    
     # Put together we create the role assignment;
     az role assignment create \
       --assignee "$appId" \
       --subscription "$(az account show --query id --output tsv --only-show-errors)" \
       --role "$(az role definition list --name "$roleName" --query "[0].id" --output tsv | awk -F'/' '{print $NF}')" \
       --scope "/subscriptions/$(az account show --query id --output tsv --only-show-errors)"
    
    

创建 L3 隔离域

测试框架不会创建、销毁或操作隔离域。 因此,现有隔离域可用于执行。 每个隔离域至少需要一个外部网络。 补充脚本create-l3-isolation-domains.sh。 通过测试过程创建、操作和销毁内部网络(例如 L3、中继等)。

执行create-l3-isolation-domains.sh需要一个参数,这是包含网络要求的文件的路径。 可以根据工作流选择独立的 network-blueprint.yml 或 input.yml,也可以包含所需的信息。

# Example of the script being invoked using networks-blueprint.yml:
./create-l3-isolation-domains.sh networks-blueprint.yml
# Example of the script being invoked using irt-input.yml:
# the network-blueprint should exist under NETWORK_BLUEPRINT node.
./create-l3-isolation-domains.sh irt-input.yml

执行

  • 此示例假定 irt-input.yml 与 irt.sh 位于同一位置。如果文件位于其他目录中,请提供完整的文件路径。
./irt.sh irt-input.yml

如何阅读 IRT 摘要结果

IRT 摘要页是在 IRT 执行后生成的 html 页面,可以从任何浏览器查看。

IRT 摘要页包含三个主要部分,这些部分会展开以提供更多详细信息。

  • 测试结果

  • 调试部分

  • 附加信息部分

摘要结果顶部显示 IRT 测试套件中的总测试运行、附加信息部分数以及已通过测试总数和失败测试总数以及百分比值。

注意

总测试数取决于执行的 IRT 版本、不同的先决条件测试命令,因此总计可能并不总是相同。

摘要报表标头成功的屏幕截图。

如果测试中有任何失败,值会相应地表示。

摘要报表标头失败的屏幕截图。

测试结果

测试结果部分提供 IRT 执行的所有测试(断言)。 断言部分会展开以查看运行和可用的测试(断言)列表。 可以进一步展开每个断言程序以加载可折叠窗格,该窗格提供了断言程序的详细信息,包括测试的说明以及要对其度量和断言的任何阈值。

显示测试结果

显示包含所有成功测试的测试结果部分:

测试结果成功的屏幕截图。

如果出现任何失败,则断言以红色突出显示。

测试结果失败的屏幕截图。

解释断言程序

每个断言程序都会在标准日志下显示测试的重要标题和说明。

断言程序示例:

断言程序 [It] res-test-dpdk-naks-84f5b - network: 'l3network-704' (PMD) average of Rx-pps [17668558] 应大于 8000000

对于 l3network-704 为 17668558,上述断言示例读取为 Rx(receive)-pps(每秒数据包数),这大于预期的 8000000。

断言成功详细信息的屏幕截图。

失败的断言程序以红色显示,Rx-pps 值应小于收到的 8000000 pps 的值。 错误显示在“错误消息”选项卡下。

断言失败详细信息的屏幕截图。

调试部分

调试部分用于查明断言/测试失败的原因以进行调试。 它由四个测试套件组成,每个套件由展开以提供详细信息的套件相关测试组成。 任何特定测试的失败都以红色突出显示。

  • 设置套件:

    • 设置测试执行,并部署框架和测试所需的 ARM 模板中定义的 Nexus 资源。
  • 注入套件:

    • 注入所需的环境变量和测试数据以支持测试 NAKS 资源
  • 收集套件:

    • 收集套件收集设置套件发布的数据。
  • 清理套件:

    • 删除收集数据后为测试创建的 Nexus 资源。

摘要报表调试部分的屏幕截图。

附加信息部分

本部分仅供参考,提供有关 Nexus 实例的附加详细信息。 没有表示此部分的断言/测试。 它旨在帮助用户在执行 IRT 后检查群集上运行的基础群集资源和租户资源的状态。

附加信息部分由分别运行两个不同的脚本文件显示的结果组成。

  • 平台验证结果:

    • 显示云部署的资源详细信息下的 Nexus 及其当前状态,包括群集管理器详细信息及其扩展、Fabric 相关详细信息、Nexus 群集及其扩展、BareMetal 计算机、Arc 相关和存储设备。
  • 租户工作负载验证结果:

    • 显示 Nexus 租户资源详细信息及其在 Nexus 群集上运行的当前状态,包括显示 L2 和 L3 隔离域、云服务网络、默认 cni 网络、L2 和 L3 网络、中继网络、可用的 VM 列表。

疑难解答

具有故障的断言程序和调试部分是解决故障和技术问题的有效故障排除方法。

如果仍有疑问,请联系支持人员。 有关支持计划的详细信息,请参阅Azure 支持计划