Windows 排錯

本章介紹 Windows 容器異常的排錯方法。

RDP 登錄到 Node

通常在排查 Windows 容器異常問題時需要通過 RDP 登錄到 Windows Node上面查看 kubelet、docker、HNS 等的狀態和日誌。在使用雲平臺時,可以給相應的 VM 綁定一個公網 IP;而在物理機部署時,可以通過路由器上的端口映射來訪問。

除此之外,還有一種更簡單的方法,即通過 Kubernetes Service 對外暴露 Node 的 3389 端口(注意替換爲你自己的 node-ip):

# rdp.yaml
apiVersion: v1
kind: Service
metadata:
  name: rdp
spec:
  type: LoadBalancer
  ports:
  - protocol: TCP
    port: 3389
    targetPort: 3389
---
kind: Endpoints
apiVersion: v1
metadata:
  name: rdp
subsets:
  - addresses:
      - ip: <node-ip>
    ports:
      - port: 3389

接着,就可以通過 rdp 服務的外網 IP 來登錄 Node,如 mstsc.exe -v 52.52.52.52

在使用完後, 不要忘記刪除 RDP 服務 kubectl delete -f rdp.yaml

Windows Pod 一直處於 ContainerCreating 狀態

一般有兩種可能的原因

在 Windows Server 1709 上面需要使用 1709 標籤的鏡像,比如

  • microsoft/aspnet:4.7.2-windowsservercore-1709

  • microsoft/windowsservercore:1709

  • microsoft/iis:windowsservercore-1709

在 Windows Server 1803 上面需要使用 1803 標籤的鏡像,比如

  • microsoft/aspnet:4.7.2-windowsservercore-1803

  • microsoft/iis:windowsservercore-1803

  • microsoft/windowsservercore:1803

Windows Pod 內無法解析 DNS

這是一個已知問題,有以下三種臨時解決方法:

(1)Windows 重啓後,清空 HNS Policy 並重啓 KubeProxy 服務:

(2)是爲 Pod 直接配置 kube-dns Pod 的地址:

(3)更簡單的爲每個 Windows Node 多運行一個 Pod,即保證每臺 Node 上面至少有兩個 Pod 在運行。此時,DNS 解析也是正常的。

如果 Windows Node 運行在 Azure 上面,並且部署 Kubernetes 時使用了自定義 VNET,那麼需要爲該 VNET 添加路由表

如果 VNET 在不同的 ResourceGroup 裏面,那麼

Remote endpoint creation failed: HNS failed with error: The switch-port was not found

這個錯誤發生在 kube-proxy 爲服務配置負載均衡的時候,需要安裝 KB4089848

重啓後確認更新安裝成功:

安裝更新後,如果 DNS 解析還是有問題,可以按照上一節中的方法(1) 重啓 kubelet 和 kube-proxy。

Windows Pod 內無法訪問 ServiceAccount Secret

這是老版本 Windows 的已知問題,升級 Windows 到 1803 即可解決,升級步驟見這裏

Windows Pod 內無法訪問 Kubernetes API

如果使用了 Hyper-V 隔離容器,需要開啓 MAC spoofing 。

Windows Node 內無法訪問 Service ClusterIP

這是個當前 Windows 網絡協議棧的已知問題,只有在 Pod 內纔可以訪問 Service ClusterIP。

Kubelet 無法啓動

使用 Docker 18.03 版本和 Kubelet v1.12.x 時,Kubelet 無法正常啓動報錯:

解決方法是爲 Windows 上面的 Docker 設置 API 版本的環境變量:

參考文檔

Last updated