Windows 调试技巧
节点级故障排除
我的 Pod 卡在“容器创建中”或反复重启
确保您的暂停镜像与您的 Windows 操作系统版本兼容。请参阅 暂停容器 以查看最新/推荐的暂停镜像,或获取更多信息。
注意
如果使用 containerd 作为您的容器运行时,暂停镜像在 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。当尝试演示与集群外部资源的连接时,请用相应的
curl <IP>
命令替换ping <IP>
命令。如果您仍然遇到问题,很可能是您在 cni.conf 中的网络配置需要额外关注。您可以随时编辑此静态文件。配置更新将应用于任何新的 Kubernetes 资源。
Kubernetes 网络要求之一(请参阅 Kubernetes 模型)是集群通信在内部不发生 NAT。为了满足此要求,有一个 例外列表 用于所有您不希望发生出站 NAT 的通信。但是,这也意味着您需要从
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
类型服务从节点本身进行的本地 NodePort 访问失败。这是一个已知限制。NodePort 访问适用于其他节点或外部客户端。
容器的 vNIC 和 HNS 端点正在被删除
当未将
hostname-override
参数传递给 kube-proxy 时,可能会出现此问题。为了解决此问题,用户需要将主机名传递给 kube-proxy,如下所示C:\k\kube-proxy.exe --hostname-override=$(hostname)
我的 Windows 节点无法使用服务 IP 访问我的服务
这是 Windows 上的网络堆栈的已知限制。但是,Windows Pod 可以访问服务 IP。
启动 kubelet 时未找到网络适配器
Windows 网络堆栈需要一个虚拟适配器才能使 Kubernetes 网络正常工作。如果以下命令没有返回任何结果(在管理员 shell 中),则虚拟网络创建(kubelet 正常工作所需的先决条件)已失败
Get-HnsNetwork | ? Name -ieq "cbr0" Get-NetAdapter | ? Name -Like "vEthernet (Ethernet*"
通常,在主机网络适配器不是“以太网”的情况下,修改 InterfaceName 参数是值得的。否则,请查看
start-kubelet.ps1
脚本的输出,以查看虚拟网络创建期间是否有错误。DNS 解析未正常工作
请查看本 部分 中有关 Windows 的 DNS 限制。
kubectl port-forward
失败,显示“无法进行端口转发:未找到 wincat”这是在 Kubernetes 1.15 中实现的,方法是在暂停基础设施容器
mcr.microsoft.com/oss/kubernetes/pause:3.6
中包含wincat.exe
。请确保使用受支持的 Kubernetes 版本。如果您想构建自己的暂停基础设施容器,请确保包含 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 容器 主题
- Kubernetes 官方论坛 discuss.kubernetes.io
- Kubernetes Slack #SIG-Windows 频道