Windows 调试技巧

节点级故障排除

  1. 我的 Pod 处于“ContainerCreating”状态或反复重启

    请确保您的 pause 镜像与您的 Windows 操作系统版本兼容。请参阅 Pause 容器 以查看最新/推荐的 pause 镜像以及/或获取更多信息。

  2. 我的 Pod 显示状态为 ErrImgPullImagePullBackOff

    请确保您的 Pod 已调度到一个 兼容 的 Windows 节点。

    有关如何为 Pod 指定兼容节点的更多信息,请参阅 本指南

网络故障排除

  1. 我的 Windows Pod 没有网络连接

    如果您正在使用虚拟机,请确保所有 VM 网络适配器都已 **启用** MAC 欺骗。

  2. 我的 Windows Pod 无法 ping 通外部资源

    Windows Pod 没有为 ICMP 协议编程出站规则。但是,TCP/UDP 是支持的。在尝试演示到集群外部资源的连通性时,请将 ping <IP> 命令替换为相应的 curl <IP> 命令。

    如果问题仍然存在,那么您在 cni.conf 中的网络配置很可能需要特别注意。您可以随时编辑此静态文件。配置更新将应用于任何新的 Kubernetes 资源。

    Kubernetes 的一项网络要求(请参阅 Kubernetes 模型)是集群内部通信不应经过 NAT。为了满足此要求,对于所有您不希望发生出站 NAT 的通信,有一个 ExceptionList。但是,这也意味着您需要将您尝试查询的外部 IP 从 ExceptionList 中排除。只有这样,才能正确地对源自您的 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
                ]
    
  3. 我的 Windows 节点无法访问 NodePort 类型服务

    从节点本身本地访问 NodePort 会失败。这是一个已知的限制。NodePort 可以从其他节点或外部客户端访问。

  4. 容器的 vNICs 和 HNS 端点被删除

    此问题可能是由于未将 hostname-override 参数传递给 kube-proxy 引起的。要解决此问题,用户需要按如下方式将主机名传递给 kube-proxy:

    C:\k\kube-proxy.exe --hostname-override=$(hostname)
    
  5. 我的 Windows 节点无法通过服务 IP 访问我的服务

    这是 Windows 上网络堆栈的一个已知限制。但是,Windows Pod 可以访问 Service IP。

  6. 启动 kubelet 时找不到网络适配器

    Windows 网络堆栈需要一个虚拟适配器才能使 Kubernetes 网络正常工作。如果在管理员 shell 中,以下命令均未返回任何结果,则表示虚拟网络创建(kubelet 工作所必需的先决条件)失败了。

    Get-HnsNetwork | ? Name -ieq "cbr0"
    Get-NetAdapter | ? Name -Like "vEthernet (Ethernet*"
    

    在某些情况下,修改 start.ps1 脚本中的 InterfaceName 参数是值得的,因为主机的网络适配器不是“Ethernet”。否则,请查看 start-kubelet.ps1 脚本的输出,以了解在创建虚拟网络期间是否有错误。

  7. DNS 解析无法正常工作

    请在此 部分 检查 Windows 的 DNS 限制。

  8. kubectl port-forward 失败并出现“unable to do port forwarding: wincat not found”

    Kubernetes 1.15 中通过将 wincat.exe 包含在 pause 基础设施容器 mcr.microsoft.com/oss/kubernetes/pause:3.6 中实现了此功能。请确保使用受支持的 Kubernetes 版本。如果您想构建自己的 pause 基础设施容器,请确保包含 wincat

  9. 我的 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 故障排除

  1. 在使用 Flannel 时,我的节点在重新加入集群后出现问题

    每当一个已删除的节点重新加入集群时,flannelD 会尝试为该节点分配一个新的 pod 子网。用户应删除以下路径中的旧 pod 子网配置文件:

    Remove-Item C:\k\SourceVip.json
    Remove-Item C:\k\SourceVipRequest.json
    
  2. 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
    
  3. 由于缺少 /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 容器获得帮助:

最后修改时间:2023 年 12 月 24 日晚上 9:00 PST:修复错别字 (d536e46dbd)