在 Windows 上的 Kubernetes 中

在 Windows 上的 Kubernetes 中

一般来说,应该如何调试与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 路由规则。

相关内容