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

排查 Azure IoT 操作实例问题的提示和工具

本文介绍如何使用一些常用工具来学习、探索或排查 Azure IoT 操作实例问题。 这些工具是 Azure 门户、Azure CLI、操作体验 Web UI 和可观测性资源提供的各项功能的补充。

Kubernetes 工具

Azure IoT 操作组件在标准 Kubernetes 群集中运行。 可以使用 kubectlk9s CLI 工具与群集交互并管理群集。

kubectl

kubectl 是用于管理群集的 Kubernetes 命令行工具。 它提供了许多功能,可参阅官方 Kubernetes 文档了解这些功能。 本文介绍在使用 Azure IoT 操作时 kubectl 的常见用途,例如列出正在运行的 Pod 和查看日志。

配置 kubectl 以连接到实例

准备已启用 Azure Arc 的 Kubernetes 群集一文介绍了在部署 Kubernetes 群集的同一台计算机上运行 kubectl 命令时,如何配置 以连接到 k3skubectl 群集。

提示

export KUBECONFIG=~/.kube/config 命令添加到 .bashrc 或 .bash_profile 文件,这样就无需在每次打开新的终端窗口时设置 环境变量。KUBECONFIG

如果将 Azure IoT 操作实例部署到已启用 Arc 的 AKS-EE,系统会为你自动设置 kubectl 配置。 可以在部署群集的计算机上直接从命令行运行 kubectl 命令。

此外,还可以从本地客户端计算机(而不是部署了已启用 Arc 的群集的计算机)运行 kubectl 命令:

作为一次性步骤,使用 SSH 连接到已部署群集的计算机,并运行以下命令。 确保将 <your-name> 替换为你所用的名称:

kubectl create serviceaccount <your-name> -n default
kubectl create clusterrolebinding <your-name>-binding --clusterrole cluster-admin --serviceaccount default:<your-name>
kubectl apply -f - <<EOF
apiVersion: v1
kind: Secret
metadata:
    name: <your-name>-secret
    annotations:
        kubernetes.io/service-account.name: <your-name>
type: kubernetes.io/service-account-token
EOF
TOKEN=$(kubectl get secret <your-name>-secret -o jsonpath='{$.data.token}' | base64 -d | sed 's/$/\n/g')
echo $TOKEN

记下令牌。 在客户端计算机上运行 kubectl 命令时,需要使用此令牌进行身份验证。 现在可以从运行 Kubernetes 群集的计算机断开连接。

若要在客户端计算机上使用 kubectl 连接到群集,请打开两个终端:

  1. 在第一个终端中,运行以下命令,将代理配置为连接到群集。 请务必替换三个占位符的值:

    az connectedk8s proxy -n <your-arc-enabled-cluster-name> -g <your-arc-enabled-cluster-resource-group> --token <token-from-previous-step>
    

    在第二个终端中运行 kubectl 命令时,使此终端保持打开状态。

  2. 在第二个终端中,可以对远程群集运行 kubectl 命令。 例如,列出 azure-iot-operations 命名空间中的 Pod:

    kubectl get pods -n azure-iot-operations
    

    提示

    还可以运行在此终端中使用 k9s 配置的命令,例如 kubectl

    kubectl 上下文将保持设置为远程群集,直到关闭第一个终端。

要了解详细信息,请参阅使用群集连接安全连接到已启用 Azure Arc 的 Kubernetes 群集

命名空间

默认情况下,Arc 和 Azure IoT 操作在 Kubernetes 群集中使用以下命名空间:

  • azure-iot-operations 用于 Azure IoT 操作组件。
  • azure-arc 用于已启用 Azure Arc 的 Kubernetes 组件。

提示

要查看群集中的所有命名空间,请运行以下命令:kubectl get namespaces

常用 kubectl 命令

要查看 azure-iot-operations 命名空间中运行的所有 Pod,请运行以下命令:

kubectl get pods -n azure-iot-operations

输出如下所示:

NAME                                              READY   STATUS      RESTARTS       AGE
adr-schema-registry-0                             2/2     Running     0              19m
adr-schema-registry-1                             2/2     Running     0              19m
aio-akri-agent-777477bc68-72lrg                   1/1     Running     7 (83m ago)    21d
aio-broker-authentication-0                       1/1     Running     7 (83m ago)    21d
aio-broker-backend-1-0                            1/1     Running     11 (82m ago)   21d
aio-broker-backend-1-1                            1/1     Running     7 (83m ago)    21d
aio-broker-diagnostics-probe-0                    1/1     Running     11 (83m ago)   21d
aio-broker-diagnostics-service-0                  1/1     Running     7 (83m ago)    21d
aio-broker-fluent-bit-6bkf2                       1/1     Running     0              16m
aio-broker-frontend-0                             1/1     Running     12 (83m ago)   21d
aio-broker-health-manager-0                       1/1     Running     14 (82m ago)   21d
aio-broker-operator-0                             1/1     Running     7 (83m ago)    21d
aio-broker-upgrade-status-job-1.0.4-bwlcc         0/1     Completed   0              77m
aio-broker-webhook-admission-65d67f8ddc-jct9j     1/1     Running     0              82m
aio-dataflow-admission-webhook-84dd44c8bd-6pw58   1/1     Running     7 (83m ago)    21d
aio-dataflow-operator-0                           1/1     Running     14 (83m ago)   21d
aio-dataflow-upgrade-status-job-1.0.5-msmf4       0/1     Completed   0              77m
aio-opc-asset-discovery-54649d46cf-kb6qs          1/1     Running     2 (83m ago)    17d
aio-opc-media-1-785748ff6c-qkhgl                  1/1     Running     1 (83m ago)    14d
aio-opc-opc.tcp-1-858b9ff67-dxwvb                 1/1     Running     4 (80m ago)    17d
aio-opc-supervisor-5d6b9bfc49-fgt7d               1/1     Running     2 (83m ago)    17d
aio-operator-7b9b585dc6-bvfpd                     2/2     Running     0              19m
aio-usage-28946280-f42k8                          0/1     Completed   0              14d
aio-usage-28946340-45grx                          0/1     Completed   0              14d
aio-usage-28946400-znn7v                          0/1     Completed   0              13d
aio-usage-28946460-nrw4z                          0/1     Completed   0              13d
aio-usage-28966500-mrcmf                          0/1     Completed   0              55m

要查看特定 Pod(例如 aio-opc-opc.tcp-1-858b9ff67-dxwvb Pod)的日志,请运行以下命令:

kubectl logs aio-opc-opc.tcp-1-858b9ff67-dxwvb -n azure-iot-operations

要查看特定 Pod(例如 aio-opc-opc.tcp-1-858b9ff67-dxwvb Pod)的可读说明,请运行以下命令:

kubectl describe pod aio-opc-opc.tcp-1-858b9ff67-dxwvb -n azure-iot-operations

在某些地方,Azure IoT 操作文档使用 kubectl apply 命令应用 Kubernetes 清单文件,在群集中更改配置。

k9s

k9s 实用工具提供了基于终端的 UI 来管理 Kubernetes 群集。 它使用 kubectl 配置连接到群集,并提供了一种可视化方式与群集进行交互。 其默认视图列出了群集中当前运行的所有 Pod:

屏幕截图显示默认 k9s 视图。

使用 Azure IoT 操作时,可以筛选视图以仅显示 azure-iot-operations 命名空间中的 Pod。

  1. 键入 : 打开命令面板,然后键入 ns,接着按 Enter 键

  2. 在命名空间列表中,选择 azure-iot-operations,然后按 Enter 键

  3. Pod 列表现在只显示 azure-iot-operations 命名空间中的 Pod:

    屏幕截图显示筛选为 azure-iot-operations 命名空间的 Pod 的 k9s 列表。

提示

现在可以使用数字键来应用筛选器。 前面的屏幕截图显示,0 显示所有 Pod,1 只显示 azure-iot-operations 命名空间中的 Pod。

可以使用快捷键查看 Pod 的信息。 例如:

  • 要描述 Pod,请在列表中选择它,然后按 d

    屏幕截图显示正在运行的 Pod 的 k9s 中的说明。

  • 要查看 Pod 日志,请在列表中选择它,然后按 l

    屏幕截图显示 k9s 中正在运行的 Pod 的日志。

    提示

    可以使用数字键来浏览日志文件。

要查看群集中 Pod 以外的自定义资源类型,请执行以下操作:

  1. 按 Ctrl-a 显示自定义资源类型列表。

  2. 选择自定义资源类型,例如 assetendpointprofiles,然后按 Enter 键

    提示

    若要按名称搜索自定义资源类型,请键入 /,然后开始键入要查找的类型的名称。

  3. 选择自定义资源,并选择其中一个可用的操作。 例如,可以通过选择资产终结点配置文件并按 y 来查看其 YAML 定义。 对于某些资源,可以编辑其配置。

下表展示了可在 Azure IoT 操作中使用的一些自定义资源类型:

自定义资源类型 说明
assetendpointprofiles 表示资产终结点的配置。
assets 表示资产的配置。
brokersbrokerlistersbrokerauthenticationsbrokerauthorizations 表示 MQTT 代理的配置。
dataflowsdataflowendpointsdataflowprofiles 表示数据流的配置。
secretssecretsyncssecretproviderclasses 表示机密和机密管理的配置。

MQTT 工具

在 Azure IoT 操作实例中了解和测试 MQTT 代理时,可以使用 MQTT 客户端工具与代理交互。 但是,出于安全原因,Azure IoT 操作不会在群集外部公开 MQTT 代理。 可以选择通过以下方法来解决:

注意

这三种方法仅适用于开发和测试环境。 在任何情况下,都不应在生产环境中使用。

  • 连接到群集内的默认侦听器。 此选项使用默认配置,无需额外的更新。 只能使用一小部分 MQTT 客户端工具。

  • 使用 NodePort 服务在群集外部公开 MQTT 代理。 此方法需要更新 MQTT 代理的配置。 可以使用支持连接到特定端口的任何 MQTT 客户端工具。

  • 使用 LoadBalancer 服务在群集外部公开 MQTT 代理。 此方法需要更新 MQTT 代理的配置。 可以使用支持连接到特定端口的任何 MQTT 客户端工具。

连接到群集内的默认侦听器

若要连接到群集内的默认侦听器,可以部署一个 Pod 来运行基于 CLI 的 MQTT 客户端工具(如 mosquitto_submosquitto_pub)。 下面的命令可以将此类 Pod 部署到群集:

kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/samples/quickstarts/mqtt-client.yaml

运行 Pod 后,可以连接到 Pod 中的 shell:

kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- sh

使用此 shell 可以运行 mosquitto_submosquitto_pub 之类的命令来与 MQTT 代理交互。 例如,若要订阅 azure-iot-operations/data 主题下的所有主题,请运行以下命令:

mosquitto_sub --host aio-broker --port 18883 --topic "azure-iot-operations/data/#" --verbose --cafile /var/run/certs/ca.crt -D CONNECT authentication-method 'K8S-SAT' -D CONNECT authentication-data $(cat /var/run/secrets/tokens/broker-sat)

注意该命令如何从 Pod 的文件系统加载证书文件和令牌。 mqtt-client.yaml 清单文件将这些文件装载到 Pod 中。

要从 azure-iot-operations/data/thermostat 主题接收单个消息,请添加 -C 1 选项:

mosquitto_sub --host aio-broker --port 18883 --topic "azure-iot-operations/data/thermostat" -C 1 --verbose --cafile /var/run/certs/ca.crt -D CONNECT authentication-method 'K8S-SAT' -D CONNECT authentication-data $(cat /var/run/secrets/tokens/broker-sat)

要查看消息中的 MQTT v5 用户属性,请使用 -F %P 选项:

mosquitto_sub --host aio-broker --port 18883 --topic "azure-iot-operations/data/thermostat" -V mqttv5 -F %P --cafile /var/run/certs/ca.crt -D CONNECT authentication-method 'K8S-SAT' -D CONNECT authentication-data $(cat /var/run/secrets/tokens/broker-sat)

将消息发布到 azure-iot-operations/data/valve 主题:

mosquitto_pub --host aio-broker --port 18883 --topic "azure-iot-operations/data/valve" --message "open:15%" --id "controller" --cafile /var/run/certs/ca.crt -D CONNECT authentication-method 'K8S-SAT' -D CONNECT authentication-data $(cat /var/run/secrets/tokens/broker-sat)

使用完 MQTT 客户端工具 Pod 后,可以从群集中删除它:

kubectl delete -f https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/samples/quickstarts/mqtt-client.yaml

要了解有关此配置的详细信息,请参阅连接到群集内的默认侦听器

使用 NodePortLoadBalancer 服务

如果按照步骤配置节点端口负载均衡器服务,以便在群集外部公开 MQTT 代理,可以使用支持连接到特定端口的任何 MQTT 客户端工具。 下面的示例假定你配置了不带身份验证、授权或 TLS 的服务。 如果使用的是负载均衡器,可以使用你喜欢的 MQTT 客户端工具连接到端口 1883 上的 MQTT 代理;如果使用的是节点端口,可以使用已配置的端口。

例如,若要在运行 Kubernetes 群集的计算机上运行开源 mqttui 工具,请使用以下命令:

mqttui --broker mqtt://localhost:1883

提示

如果你配置了负载均衡器,并且端口 1883 在主机的公共 IP 地址上是打开的,可以使用以下命令从其他计算机连接到 MQTT 代理:mqttui --broker mqtt://<cluster-machine-public-ip>:1883

可以使用 mqttui 工具订阅主题、发布消息并查看流经代理的消息:

屏幕截图展示了显示所有主题的 MQTTUI 工具。

若要显示特定主题(如 azure-iot-operations/data/thermostat)的消息,请使用以下命令:

mqttui --broker mqtt://localhost:1883 azure-iot-operations/data/thermostat

要将消息发布到 azure-iot-operations/data/valve 主题,请使用以下命令:

mqttui publish --broker mqtt://localhost:1883 azure-iot-operations/data/valve open:15%

要在运行 Kubernetes 群集的计算机上运行开源 MQTT 资源管理器工具,请使用以下配置:

屏幕截图显示 MQTT 资源管理器的 localhost 配置。

要在本地计算机上运行开源 MQTT 资源管理器工具以连接到运行 Kubernetes 群集的计算机,请使用以下配置:

屏幕截图显示 MQTT 资源管理器的远程主机配置。

确保 MQTT 资源管理器至少配置了 # 主题:

屏幕截图显示 MQTT 资源管理器的默认主题配置。

连接后,可以在订阅的主题中查看消息并发布消息:

屏幕截图显示已订阅 Azure IoT 操作主题的 MQTT 资源管理器。