特定节点(我们称之为 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 问题。请按照以下步骤操作,这可能有助于解决您的问题:
查看 coreDNS 日志和 pod 日志来了解问题,您可以通过运行以下命令获取更多信息:
kubectl logs --namespace=kube-system -l k8s-app=kube-dns
kubectl 日志 podname
检查任何阻止到 pod 的流量的网络策略。您可以通过运行以下命令获取更多信息:
kubectl get networkpolicy
检查所需端口是否开放。
检查 pod 内的防火墙规则是否可以阻止流量。
匹配 pods CIDR,Calico 的默认值是 192.168.0.0/16,参考github 评论更多细节。
如果 HTTP 服务器依赖 DNS 名称,请确保DNS 解析在集群内配置正确。
編輯1
有时 CoreDNS 没有问题,但由于 k8s 网络问题,到 ClusterIP 的流量无法正确定向到 Pod。这可能是因为 Kube-proxy。请参阅 k8s调试服务以获取故障排除指南。
还要检查 Pod 网络是否与主机网络重叠。请参阅安装 Pod 网络插件更多细节。
有时升级期间不会加载与网络相关的功能,而当您进入此类 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