Networking

我應該如何調試由於 MSFT_NetRoute “未找到”而失敗的 Microsoft CIM?

  • July 4, 2021

一般來說,應該如何調試與CmdletizationQuery_NotFound消息相關的故障,為什麼基於 MSFT_NetRoute 的查詢會註冊這樣的錯誤?

細節

具體來說,我的 Kubernetes CNI 提供程序 (antrea) 發布了一條與其啟動時間相關的錯誤消息MSFT_NetRoute,因為它無法成功執行引導自身所需的 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

注意:我已經在具有類似 5.1.x powershell 版本 (5.1.17763.1490) 的類似版本的 windows server 2019 中對此進行了測試,但沒有看到此故障。所以,

問題

  • 我需要做些什麼才能Get-NetRoute在我的機器上正常工作嗎?
  • 這是否與其他事情有關(即在單個 VM 上配置網路介面的方式)?請注意,這是一個 VirtualBox VM,所以如果出現橋接或 NAT 網路問題,我不會完全震驚。

因此,一般來說,如果您遇到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 欄位)。

在我的例子中,我發現在設置之後,這個查詢是正確生成的,並且它開始查看這個值的正確介面(即對應於我節點的內部 IP 地址的那個)。

有一個更廣泛的問題,一般來說,DestinationPrefixes 應該如何在 Kubernetes windows VM 中設置,但這超出了我最初問題的範圍,但總的來說,如果你正確設置了網路,那麼:

  • node-ip如圖所示,您kubectl get nodes -o wide的 Windows kubelet 是您想要的正確的,並且
  • node-ip具有目標前綴 IP 地址 = 0.0.0.0/0 的介面相關聯

然後特別是 antrea CNI 提供商將能夠準確地確定nextHop其網關的正確性,最終用於在您的 Pod 網路的節點上配置 OVS 路由規則。

引用自:https://serverfault.com/questions/1068558