Windows 调试技巧
节点级故障排除
我的 Pod 卡在“Container Creating”或不断重启
确保你的 pause 镜像与你的 Windows 操作系统版本兼容。请参阅暂停容器以查看最新/推荐的 pause 镜像和/或获取更多信息。
注意
如果使用 containerd 作为你的容器运行时,pause 镜像在 config.toml 配置文件的 `plugins.plugins.cri.sandbox_image` 字段中指定。我的 pod 状态显示为 `ErrImgPull` 或 `ImagePullBackOff`
确保你的 Pod 被调度到兼容的 Windows 节点。
有关如何为你的 Pod 指定兼容节点的更多信息,请参阅本指南。
网络故障排除
我的 Windows Pod 没有网络连接
如果你正在使用虚拟机,请确保在所有虚拟机网络适配器上**启用** MAC 地址欺骗。
我的 Windows Pod 无法 ping 通外部资源
Windows Pod 没有为 ICMP 协议编程出站规则。但是,支持 TCP/UDP。尝试演示与集群外部资源的连接时,请使用相应的 `curl <IP>` 命令代替 `ping <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` 类型的服务
从节点本身进行本地 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*"
在主机的网络适配器不是“Ethernet”的情况下,修改 `start.ps1` 脚本的InterfaceName参数通常是值得的。否则,请查阅 `start-kubelet.ps1` 脚本的输出,以查看虚拟网络创建过程中是否存在错误。
DNS 解析无法正常工作
在此部分中查看 Windows 的 DNS 限制。
`kubectl port-forward` 失败并显示“unable to do port forwarding: wincat not found”
这已在 Kubernetes 1.15 中实现,方法是将 `wincat.exe` 包含在暂停基础架构容器 `mcr.microsoft.com/oss/kubernetes/pause:3.6` 中。请务必使用受支持的 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 卡在“Waiting for the Network to be created”
有许多关于此问题的报告;很可能是 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
由于缺少 `/run/flannel/subnet.env`,我的 Windows Pod 无法启动
这表示 Flannel 没有正确启动。你可以尝试重新启动 `flanneld.exe`,也可以手动将文件从 Kubernetes 主节点上的 `/run/flannel/subnet.env` 复制到 Windows 工作节点上的 `C:\run\flannel\subnet.env`,并将 `FLANNEL_SUBNET` 行修改为其他数字。例如,如果需要节点子网 10.244.4.1/24
FLANNEL_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 频道