Windows 调试技巧
节点级别故障排查
我的 Pod 卡在 "Container Creating" 状态或反复重启
确保你的 pause 镜像与 Windows 操作系统版本兼容。参阅Pause 容器,查看最新/推荐的 pause 镜像并/或获取更多信息。
注意
如果使用 containerd 作为容器运行时,pause 镜像在 config.toml 配置文件的plugins.plugins.cri.sandbox_image
字段中指定。我的 Pod 状态显示为
ErrImgPull
或ImagePullBackOff
确保你的 Pod 被调度到兼容的 Windows 节点。
关于如何为你的 Pod 指定兼容节点,可以在本指南中找到更多信息。
网络故障排查
我的 Windows Pod 没有网络连接
如果你使用虚拟机,确保所有 VM 网络适配器上都启用了 MAC 欺骗。
我的 Windows Pod 无法 Ping 外部资源
Windows Pod 没有针对 ICMP 协议的出站规则配置。但是,支持 TCP/UDP。尝试证明可以连接到集群外部的资源时,将
ping <IP>
替换为相应的curl <IP>
命令。如果你仍然遇到问题,你的 cni.conf 网络配置很可能需要额外关注。你可以随时编辑这个静态文件。配置更新将应用于任何新的 Kubernetes 资源。
Kubernetes 网络要求之一(参阅Kubernetes 模型)是集群内部通信不经过 NAT。为了满足此要求,对于所有不需要进行出站 NAT 的通信,有一个ExceptionList。然而,这也意味着你需要从
ExceptionList
中排除你尝试查询的外部 IP。只有这样,来自 Windows Pod 的流量才能正确地进行 SNAT,从而接收到外部世界的响应。在这方面,你在cni.conf
中的ExceptionList
应该看起来如下"ExceptionList": [ "10.244.0.0/16", # Cluster subnet "10.96.0.0/12", # Service subnet "10.127.130.0/24" # Management (host) subnet ]
我的 Windows 节点无法访问
NodePort
类型的 Service从节点本身进行本地 NodePort 访问会失败。这是一个已知限制。从其他节点或外部客户端可以访问 NodePort。
容器的 vNIC 和 HNS 端点被删除
当未向kube-proxy传递
hostname-override
参数时,可能会导致此问题。要解决此问题,用户需要按如下方式将主机名传递给 kube-proxyC:\k\kube-proxy.exe --hostname-override=$(hostname)
我的 Windows 节点无法使用 Service IP 访问我的 Service
这是 Windows 网络堆栈的一个已知限制。然而,Windows Pod 可以访问 Service IP。
启动 kubelet 时找不到网络适配器
Windows 网络堆栈需要一个虚拟适配器才能使 Kubernetes 网络正常工作。如果在管理员 Shell 中运行以下命令没有返回任何结果,则虚拟网络创建失败——这是 kubelet 工作的前提条件。
Get-HnsNetwork | ? Name -ieq "cbr0" Get-NetAdapter | ? Name -Like "vEthernet (Ethernet*"
通常值得修改
start.ps1
脚本的 InterfaceName 参数,在主机网络适配器不是 "Ethernet" 的情况下。否则,查阅start-kubelet.ps1
脚本的输出,查看在创建虚拟网络时是否存在错误。DNS 解析工作不正常
查阅本节中针对 Windows 的 DNS 限制。
kubectl port-forward
失败,并显示 "无法进行端口转发: 找不到 wincat"这是在 Kubernetes 1.15 中实现的,通过在 pause 基础设施容器
mcr.microsoft.com/oss/kubernetes/pause:3.6
中包含wincat.exe
。请确保使用受支持的 Kubernetes 版本。如果你想构建自己的 pause 基础设施容器,请确保包含wincat。我的 Kubernetes 安装失败,因为我的 Windows Server 节点位于代理后面
如果你位于代理后面,必须定义以下 PowerShell 环境变量
[Environment]::SetEnvironmentVariable("HTTP_PROXY", "http://proxy.example.com:80/", [EnvironmentVariableTarget]::Machine) [Environment]::SetEnvironmentVariable("HTTPS_PROXY", "http://proxy.example.com:443/", [EnvironmentVariableTarget]::Machine)
Flannel 故障排查
使用 Flannel 时,我的节点在重新加入集群后出现问题
每当一个之前被删除的节点重新加入集群时,flannelD 会尝试为该节点分配新的 Pod 子网。用户应删除以下路径中的旧 Pod 子网配置文件
Remove-Item C:\k\SourceVip.json Remove-Item C:\k\SourceVipRequest.json
Flanneld 卡在 "等待创建网络"
有很多关于这个问题的报告;很可能是设置 Flannel 网络管理 IP 的时机问题。一个解决方法是重新运行
start.ps1
或按如下方式手动重新启动它[Environment]::SetEnvironmentVariable("NODE_NAME", "<Windows_Worker_Hostname>") C:\flannel\flanneld.exe --kubeconfig-file=c:\k\config --iface=<Windows_Worker_Node_IP> --ip-masq=1 --kube-subnet-mgr=1
我的 Windows Pod 无法启动,因为缺少
/run/flannel/subnet.env
这表明 Flannel 没有正确启动。你可以尝试重启
flanneld.exe
,或者你可以手动将 Kubernetes 主节点上的/run/flannel/subnet.env
文件复制到 Windows 工作节点的C:\run\flannel\subnet.env
,并将FLANNEL_SUBNET
行修改为不同的数字。例如,如果期望的节点子网是 10.244.4.1/24FLANNEL_NETWORK=10.244.0.0/16 FLANNEL_SUBNET=10.244.4.1/24 FLANNEL_MTU=1500 FLANNEL_IPMASQ=true
进一步调查
如果这些步骤不能解决你的问题,你可以通过以下途径获得在 Kubernetes 的 Windows 节点上运行 Windows 容器的帮助
- StackOverflow Windows Server Container 主题
- Kubernetes 官方论坛 discuss.kubernetes.io
- Kubernetes Slack #SIG-Windows 频道