Kubernetes(k8s)手册 Kubernetes Windows调试提示

2024-02-25 开发教程 Kubernetes(k8s)手册 匿名 4

节点级故障排除

  1. 我的 Pod 卡在“Container Creating”或一遍又一遍地重新启动

确保您的pause image与您的 Windows 操作系统版本兼容。

Note: 如果使用 containerd 作为容器运行时,则暂停图像在 config.toml 配置文件的 ​plugins.plugins.cri.sandbox_image​ 字段中指定。

我的 pod 显示状态为ErrImgPull或ImagePullBackOff

确保您的 Pod 被安排到兼容的Windows 节点。

网络故障排除

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

如果您使用的是虚拟机,请确保在所有 VM 网络适配器上启用MAC spoofing。

我的 Windows Pod 无法 ping 外部资源

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

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

Kubernetes 网络要求之一(请参阅Kubernetes 模型)是在内部没有 NAT 的情况下进行集群通信。为了满足这一要求, 对于您不希望发生出站 NAT 的所有通信,都有一个ExceptionList 。但是,这也意味着您需要从​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
]
我的 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*"

在主机的网络适配器不是“以太网”的情况下,通常值得修改 ​start.ps1​ 脚本的 InterfaceName 参数。 否则,请查阅 ​start-kubelet.ps1​ 脚本的输出以查看虚拟网络创建过程中是否有错误。

DNS 解析无法正常工作

在本节中检查 Windows 的 DNS 限制。

kubectl port-forward​失败并显示“无法进行端口转发:未找到 wincat”

这是在 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 故障排除

  1. 使用 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 容器的帮助: