一般来说,应该如何调试与CmdletizationQuery_NotFound
消息相关的故障,以及为什么基于 MSFT_NetRoute 的查询会记录这样的错误?
细节
MSFT_NetRoute
具体来说,我的 Kubernetes CNI 提供程序 (antrea) 发布了一条与启动时相关的错误消息,因为它无法成功运行引导自身所需的 powershell 查询。错误消息中有一个可疑的字符串,它:
- 可能与 powershell 版本有关(我在这篇文章后面证实了这一点,但这是一个合理的假设)
- 我也在考虑也许这个错误来自于我尚未安装的外部东西......
- 最后,如果不完全了解 cmdletizationQuery 错误消息的性质,可以合理地假设这与较低级别的网络设置问题有关。
+ FullyQualifiedErrorId : CmdletizationQuery_NotFound,Get-NetRoute
此消息的上述片段突出显示了Get-NetRoute
下面发生的相关错误,这令人费解,因为它似乎表明这Get-NetRoute
不是要运行的有效查询。但https://docs.microsoft.com/en-us/powershell/module/nettcpip/get-netroute?view=windowsserver2019-ps似乎暗示 Get-NetRoute 在 powershell 中默认可用。
错误消息
ROOT/StandardCimv2/MSFT_NetRoute class on the CIM server: SELECT * FROM MSFT_NetRoute WHERE ((DestinationPrefix LIKE
'0.0.0.0/0')) AND ((InterfaceIndex = 26)). Verify query parameters and retry.
At line:1 char:3
+ $(Get-NetRoute -InterfaceIndex 26 -DestinationPrefix 0.0.0.0/0 ).Next ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (MSFT_NetRoute:String) [Get-NetRoute], CimJobException
+ FullyQualifiedErrorId : CmdletizationQuery_NotFound,Get-NetRoute
Powershell 版本
这台机器上的 powershell 版本似乎相当新......(我认为 5.1 在 windows server 2019 上是正常的)...
Name Value
---- -----
PSVersion 5.1.17763.1852
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.17763.1852
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
注意:我已在类似版本的 Windows Server 2019 中使用类似的 5.1.x Powershell 版本 (5.1.17763.1490) 进行了测试,未发现此故障。因此,
问题
- 我需要做些什么才能使
Get-NetRoute
我的机器正常工作? - 这是否与其他内容有关(即在单个 VM 上配置网络接口的方式)?请注意,这是一个 VirtualBox VM,因此如果桥接或 NAT 网络存在问题,我不会感到完全震惊。
答案1
因此,一般来说,如果出现错误CmdletizationQuery_NotFound
,如果查询中有很多字段,则可能并不总是伴随有关失败字段的信息......
➜ sig-windows-dev-tools git:(antrea-node-ip-hardcoding) ✗ vagrant winrm winw1 --shell=powershell --command="Get-NetRoute -InterfaceIndex 123 "
No MSFT_NetRoute objects found with property 'InterfaceIndex' equal to '123'. Verify the value of the property and retry.
At line:1 char:1
+ Get-NetRoute -InterfaceIndex 123
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (123:UInt32) [Get-NetRoute], CimJobException
+ FullyQualifiedErrorId : CmdletizationQuery_NotFound_InterfaceIndex,Get-NetRoute
这是因为特定 CIM 查询失败,因此未找到您所查找的对象。
然而,有时 CIMS 查询无法返回结果而不提供失败的查询的具体部分(即CmdletizationQuery_NotFound_InterfaceIndex
上面的内容很好且易于阅读,但是当我们添加DestinationPrefix
搜索字段时,下面的相同查询会给出更神秘的错误消息)...
➜ sig-windows-dev-tools git:(antrea-node-ip-hardcoding) ✗ vagrant winrm winw1 --shell=powershell --command="Get-NetRoute -InterfaceIndex 7 -DestinationPrefix 0.0.0.0/1"
No matching MSFT_NetRoute objects found by CIM query for instances of the ROOT/StandardCimv2/MSFT_NetRoute class on the CIM server: SELECT * FROM MSFT_NetRoute WHERE ((DestinationPrefix LIKE '0.0.0.0/1')) AND ((InterfaceIndex = 7)). Verify query parameters and retry.
At line:1 char:1
+ Get-NetRoute -InterfaceIndex 7 -DestinationPrefix 0.0.0.0/1
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (MSFT_NetRoute:String) [Get-NetRoute], CimJobException
+ FullyQualifiedErrorId : CmdletizationQuery_NotFound,Get-NetRoute
在这个具体案例中:
- 不存在 id = 26 的现有 IP 接口,该接口也具有 0.0.0.0/0 目标前缀
在更一般的情况下,如果你得到类似的错误,这可能是由于你刚刚编写的 CIMS 查询无法返回任何数据。
现在,由于最初的问题与 Kubernetes CNI 提供商有关,我将解决该部分:
在 Windows 上的 Kubernetes 中
CNI 提供商(例如 antrea)上线时需要此信息,通常要确保的是您的 Windows kubelet 正确设置了其 IP 地址(即通过启动时的 node-ip 字段)。
就我而言,我发现设置此项后,该查询已正确生成,并且它开始查找该值的正确接口(即与我的 Node 的内部 IP 地址相对应的接口)。
有一个更广泛的问题是,通常应该如何在 Kubernetes Windows VM 中设置 DestinationPrefixes,但这超出了我原始问题的范围,但一般来说,如果您正确设置了网络,则:
- 如图
node-ip
所示,kubectl get nodes -o wide
这是您为 Windows kubelet 所需的正确配置,并且 node-ip
与具有目标前缀 IP 地址 = 0.0.0.0/0 的接口关联的
然后,具体来说,antrea CNI 提供商将能够准确确定nextHop
其网关的正确性,最终用于在节点上为您的 pod 网络配置 OVS 路由规则。