特定节点中的 Pod 无法访问互联网

特定节点中的 Pod 无法访问互联网

特定节点(我们称之为 mynode)中的 Pod 无法访问互联网,其他节点中安排的其余 Pod 可以访问互联网。

mynode 可以访问互联网,我可以通过 ssh 进入,我还可以启动独立的 docker 容器,它们可以访问互联网,但节点上调度的 pod 却不能。

问题影响入口和出口,kubelet 在端口 10250 上运行并可通过以下方式访问: curl https://localhost:10250 -k返回404 page not found

背景:我的集群有几个具有相同规格的节点,昨天我决定升级操作系统(20.04 到 22.04),因此我删除了之前运行良好的 K8S 集群,升级了所有节点上的操作系统,重新安装了 K8S,重新创建了集群,除了 mynode 之外,所有节点上都运行顺利,它处于 ReadyState,看起来很好,但事实并非如此。

我的 CNI 是 calico。节点上的 Calico pod(csi-node-driver 和 calico-node)处于运行状态,没有重启。

我按照 k8s 网站上的调试页面进行操作,发现无法访问 pod 上调度的 HTTP 服务器,因此这个问题会影响入口和出口

答案1

该问题似乎发生在操作系统升级之后,因此请检查 CNI 插件、CRI 和 pod 的容器镜像是否是最新的,并与较新的操作系统版本 22.04 兼容。

发生此问题的原因可能有很多,例如网络策略阻止访问、pod 网络配置和 Calico CNI 问题。请按照以下步骤操作,这可能有助于解决您的问题:

  1. 查看 coreDNS 日志和 pod 日志来了解问题,您可以通过运行以下命令获取更多信息:

    kubectl logs --namespace=kube-system -l k8s-app=kube-dns

    kubectl 日志 podname

  2. 检查任何阻止到 pod 的流量的网络策略。您可以通过运行以下命令获取更多信息:kubectl get networkpolicy

  3. 检查所需端口是否开放。

  4. 检查 pod 内的防火墙规则是否可以阻止流量。

  5. 匹配 pods CIDR,Calico 的默认值是 192.168.0.0/16,参考github 评论更多细节。

  6. 如果 HTTP 服务器依赖 DNS 名称,请确保DNS 解析在集群内配置正确。

編輯1

  1. 有时 CoreDNS 没有问题,但由于 k8s 网络问题,到 ClusterIP 的流量无法正确定向到 Pod。这可能是因为 Kube-proxy。请参阅 k8s调试服务以获取故障排除指南。

  2. 还要检查 Pod 网络是否与主机网络重叠。请参阅安装 Pod 网络插件更多细节。

  3. 有时升级期间不会加载与网络相关的功能,而当您进入此类 pod 时,您是以 root 用户身份工作的。因此请尝试执行此操作,apt-get update然后稍后您可以执行apt-get install curl.

答案2

解决方案是重新启动服务器...

答案3

404由于该 URL 不存在,因此Kubelet 预计会向您显示。请尝试以下操作:

curl -k https://localhost:10250/healthz

我会先ip_forward检查故障节点

cat /proc/sys/net/ipv4/ip_forward

如果不是这样,那么我将检查 Calico 正在执行的政策

kubectl get networkpolicy -A
kubectl get gnp
kubectl get cnp -A

接下来我将验证nat是否已启用 IPPool

kubetl get ippool -o yaml

检查网关。

注意:刷新 iptables 可能会暂时断开您的连接,请确保您手边有控制台连接。

清除 IPtables 也许也不是一个坏主意,可能是某种过时的规则。

iptables -F

相关内容