有时会在没有网络的情况下创建 pod,这会导致 pod 反复失败并出现 CrashLoopBackOff

     2023-03-17     220

关键词:

【中文标题】有时会在没有网络的情况下创建 pod,这会导致 pod 反复失败并出现 CrashLoopBackOff【英文标题】:Occasionally pods will be created with no network which results in the pod failing repeatedly with CrashLoopBackOff 【发布时间】:2017-07-03 03:02:59 【问题描述】:

有时,我会看到 Pod 在没有网络连接的情况下启动的问题。因此,pod 进入 CrashLoopBackOff 并且无法恢复。我能够让 pod 再次运行的唯一方法是运行 kubectl delete pod 并等待它重新安排。以下是由于此问题导致的活性探测失败的示例:

Liveness probe failed: Get http://172.20.78.9:9411/health: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

我还注意到,发生这种情况时,pod IP 没有 iptables 条目。当 pod 被删除并重新安排(并且处于工作状态)时,我有 iptables 条目。

如果我关闭容器中的 livenessprobe 并执行它,我确认它与集群或本地网络或互联网没有网络连接。

想听听关于它可能是什么的任何建议,或者我可以研究什么以进一步解决这种情况。

目前正在运行:

Kubernetes 版本:

Client Version: version.InfoMajor:"1", Minor:"4", GitVersion:"v1.4.7",
GitCommit:"92b4f971662de9d8770f8dcd2ee01ec226a6f6c0", 
GitTreeState:"clean", BuildDate:"2016-12-10T04:49:33Z", 
GoVersion:"go1.6.3", Compiler:"gc", Platform:"linux/amd64"

Server Version: version.InfoMajor:"1", Minor:"4", GitVersion:"v1.4.7",  
GitCommit:"92b4f971662de9d8770f8dcd2ee01ec226a6f6c0", 
GitTreeState:"clean", BuildDate:"2016-12-10T04:43:42Z", 
GoVersion:"go1.6.3", Compiler:"gc", Platform:"linux/amd64"

操作系统:

NAME=CoreOS
ID=coreos
VERSION=1235.0.0
VERSION_ID=1235.0.0
BUILD_ID=2016-11-17-0416
PRETTY_NAME="CoreOS 1235.0.0 (MoreOS)"
ANSI_COLOR="1;32"
HOME_URL="https://coreos.com/"
BUG_REPORT_URL="https://github.com/coreos/bugs/issues"

【问题讨论】:

您不会获得未准备好的端点的 iptables 条目(例如:crashloopbackoff 中的死容器)。您应该首先诊断网络问题,“没有网络连接”是什么意思?您可以访问 google.com 吗?你能到达同一个集群中的另一个 pod 或服务吗?请开始调试:kubernetes.io/docs/user-guide/debugging-services 并报告哪一步失败。 【参考方案1】:

您的网络驱动程序似乎无法正常工作。如果没有关于您的设置的更多信息,我只能建议您以下几点:

    找出使用了什么网络驱动程序?您可以通过检查 kubelet --network-plugin 标志来判断。如果没有指定网络插件,那么它使用的是本地 docker 网络。 给定网络驱动程序,检查 pod 网络设置并查看缺少的内容。使用 tcpdump 查看数据包的去向。

【讨论】:

【参考方案2】:

我没有足够的积分来评论,所以这个答案是为了回应 Prashanth B (https://***.com/users/5446771/prashanth-b)

让我更详细地描述“没有网络连接”。当我执行到一个遭受最初描述的症状的 pod 时,这就是我看到的网络问题。

在此示例中,我们有一个 pod,它正在遭受似乎没有任何网络连接的 pod 的影响。

首先,我从 pod ping 物理节点(eth0 接口)的可路由 ip。这适用于同一节点上正常工作的 pod。

# ping 10.30.8.66
PING 10.30.8.66 (10.30.8.66): 56 data bytes
92 bytes from tv-dmx-prototype-3638746950-l8fgu (172.20.68.16): 
Destination Host Unreachable
^C

尝试内部或外部 DNS 解析。我不希望 ping 工作,但这是容器中唯一可用的工具来进行名称解析。由于没有网络,我无法安装其他任何东西。

# ping kubernetes
^C
# ping www.google.com
^C
#

我将尝试从同一个集群中的另一个 pod 和与不工作的 pod 位于同一物理节点的另一个 pod 连接到该 pod 上打开的端口。

/ # telnet 172.20.68.16 80
telnet: can't connect to remote host (172.20.68.16): Host is unreachable
/ #

从物理节点我无法连接端口 80 上的 pod ip

core@ip-10-30-8-66 ~ $ curl 172.20.68.16:80
curl: (7) Failed to connect to 172.20.68.16 port 80: No route to host

我查看了https://kubernetes.io/docs/user-guide/debugging-services/ 的故障排除指南,但该指南旨在诊断将 kubernetes 服务连接到一个或多个 pod 的问题。在我的场景中,我们在创建一个不特定于服务的 pod 时遇到了不可预测的行为。例如,我们每周会在跨越数十个“部署”的 3 个不同集群中看到 1 到 3 次这种情况。有问题的部署绝不是同一个部署,我们唯一的办法是删除 pod,之后它会被正确实例化。

我已经阅读了故障排除指南的相关部分并将其发布在此处。

这里我们看到 kubelet 和 kube-proxy 正在运行

root       7186   7167  2 Jan19 ?        15:14:25 /hyperkube proxy          --master=https://us-east-1-services-kubernetes.XXXXX.com 
 --proxy-mode=iptables --kubeconfig=/var/lib/kube-proxy/kubeconfig
core      25646  26300  0 19:22 pts/0    00:00:00 grep --colour=auto -i hyperkube


kubelet --address=0.0.0.0 --pod-manifest-path=/etc/kubernetes/manifests --enable-server --logtostderr=true --port=10250 --allow-privileged=True --max-pods=110 --v=2 --api_servers=https://us-east-1-services-kubernetes.XXXXXX.com --enable-debugging-handlers=true --cloud-provider=aws --cluster_dns=172.16.0.10 --cluster-domain=cluster.local --kubeconfig=/var/lib/kubelet/kubeconfig --node-labels=beta.kubernetes.io/instance-type=c4.8xlarge,failure-domain.beta.kubernetes.io/region=us-east-1,failure-domain.beta.kubernetes.io/zone=us-east-1d,kubernetes.io/hostname=ip-10-30-8-66.ec2.internal,public-hostname=ec2-52-207-185-19.compute-1.amazonaws.com,instance-id=i-03074c6772d89ede8

我已经验证 kube-proxy 正在通过访问同一节点上的其他 pod 进行代理。

core@ip-10-30-8-66 ~ $ curl 172.20.68.12 80
<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.11.4</center>
</body>
</html>
curl: (7) Couldn't connect to server

刚刚部署了一个新版本的应用程序,但我丢失了用于故障排除的 pod。当此症状再次出现时,我将开始准备一些额外的命令以运行。我还将运行大量的部署创建,因为我们得到的坏 pod 的数量与正在创建的新 pod 的数量有关。

【讨论】:

【参考方案3】:

回应freehan (https://***.com/users/7577983/freehan)

我们正在使用默认的网络插件,正如您所指出的,它是本机 docker 插件。

关于使用 tcpdump 捕获数据包路径的建议。您知道确定哪个 veth 与给定 pod 关联的简单方法吗?

我计划运行一个安装了 tcpdump 的容器,并观察与问题 pod 相关的 veth 上的流量,同时从 pod 启动出站网络流量(例如:ping、dig、curl 或给定 pod 中可用的任何内容)。

如果您有其他想法,请告诉我,我会尝试。

【讨论】:

【参考方案4】:

我认为我们正在解决这个错误https://github.com/coreos/bugs/issues/1785。我已经验证我可以重现我们的 docker/coreos 版本中列出的错误。将 coreos/docker 和验证。

【讨论】:

k8s的service详解

...可以访问他们的策略。有两种方式:选择算符的Service和没有选择算符的Service这是最常见的方式,指定spec.selector即通过打标签的方式,主要是针对集群内部同命名空间的Pod创建上面的Service,会自动创建相应的Endpoint对象查看自动... 查看详情

如何在没有私钥的情况下创建 .p12 或 .pfx 文件?

】如何在没有私钥的情况下创建.p12或.pfx文件?【英文标题】:HowcanIcreatea.p12or.pfxfilewithoutaprivatekey?【发布时间】:2014-07-1902:31:30【问题描述】:我正在尝试创建一个不包含有效身份(公钥/私钥对)的.p12文件,以测试我的应用的... 查看详情

如何在没有 P/Invoke 的情况下从 c# 创建挂起的进程?

】如何在没有P/Invoke的情况下从c#创建挂起的进程?【英文标题】:Howtocreatesuspendedprocessfromc#withoutP/Invoke?【发布时间】:2014-03-2122:25:38【问题描述】:WinAPICreateProcess具有CREATE_SUSPENDED标志,因此可以在JobObject完成某些操作之前将... 查看详情

有没有办法在没有定义网络规则的情况下拒绝创建网络应用程序

】有没有办法在没有定义网络规则的情况下拒绝创建网络应用程序【英文标题】:Isthereawaytodenycreationofwebapp\'swithoutanetworkruledefined【发布时间】:2019-09-0218:23:21【问题描述】:我试图拒绝在azure中创建未定义网络规则的Web应用程... 查看详情

如何在没有 POD 和 Carthage 的情况下添加 SideMenu?

】如何在没有POD和Carthage的情况下添加SideMenu?【英文标题】:HowtoaddSideMenuwithoutPODandCarthage?【发布时间】:2017-04-0411:43:04【问题描述】:我想在不使用POD或Carthage的情况下添加此SideMenu,我该怎么做。【问题讨论】:这里的迦太... 查看详情

Excel VBA - 使用没有返回的 GoSub

...oop和GoSubwithoutReturn可能会发生数百次。如果我不返回,这会在内存中累积并导致任何问题吗?我想我的问题归结为:G 查看详情

如何在没有 pod 的情况下在 iOS 中设计概述的文本字段

】如何在没有pod的情况下在iOS中设计概述的文本字段【英文标题】:HowtodesignoutlinedtextfieldiniOSwithoutpods【发布时间】:2021-06-0219:07:33【问题描述】:我正在寻找有关如何在不使用任何pod的情况下本机设计如下文本字段(UIKit)的想法... 查看详情

在没有参考的情况下获取由脚本创建的元素

...】:我有一个由脚本创建的聊天按钮(zendesk聊天)。它会在页面中生成一个ID为“launcher”的iframe。我正在使用Nextjs并尝试获取此元素,但由于没有代码,因此无法附加参考。我正在网上挖掘解决方案,我已经尝试过类似的方 查看详情

kubernetespod异常排错

...日志通常都会有助于排查Pod发生的问题。Pending说明Pod还没有调度到某个Node上面。可以通过kubectldescribepod<pod-name>命令查看到当前Pod的事件,进而判断为什么没有调度。如可能的原因包括首先还是通过kubectldescribepod<pod-name>... 查看详情

我们如何在没有 MYSQL 负载的情况下创建 XML?

】我们如何在没有MYSQL负载的情况下创建XML?【英文标题】:HowwewouldcreateXMLwithoutanyloadonMYSQL?【发布时间】:2013-02-0520:46:16【问题描述】:我有一个MYSQL数据库,其中有一个活动表,其行是文本语句(活动)。我的挑战是在将最新... 查看详情

如何在没有服务器的情况下创建 P2P 网络? [关闭]

】如何在没有服务器的情况下创建P2P网络?[关闭]【英文标题】:HowtocreateaP2Pnetworkwithoutaserver?[closed]【发布时间】:2016-08-0503:21:58【问题描述】:首先我想分享一下我为什么要创建这个看起来很复杂的东西:我已经看到,在我的... 查看详情

有没有办法在不必创建变量的情况下捕获异常?

...【发布时间】:2011-06-1618:04:44【问题描述】:在PHP中,我有时会使用try/catch捕获一些异常:try...catch(Exception$e)//Nothing,thisisnormal使用这种代码,我最终得到了变量$e,它是无用创建的 查看详情

如何忽略像“car”这样的空 json 对象:,这会在使用 jackson 反序列化后导致空 pojos

】如何忽略像“car”这样的空json对象:,这会在使用jackson反序列化后导致空pojos【英文标题】:Howignoreemptyjsonobjectslike"car":,thatcauseemptypojosafterdeserialisationwithjackson如何忽略像“car”这样的空json对象:,这会在使用jackson反... 查看详情

尝试正确理解网络分区

...定这能不能称之为networkpartition,但我发现原RAFT论文描述会在这种情况下导致leader的频繁更换。举例如下,假设初始term是knode1因为收不到node0的心跳包转成candidate,把te 查看详情

kubernetes之networkpolicy,flannel和calico

...名为bridge的网络模型。如下图所示:Docker引擎在启动时,会在宿主机上创建一个名为docker0的虚拟网桥,这个虚拟网桥负责给所有容器分配不重复的ip地址以及容器间的网络通信。首先,Docker在创建一个容器时,会执行以下操作:... 查看详情

openstack创建实例没有获取到ip地址,导致创建失败,急,帮帮忙!

帮忙处理了,一定追加悬赏你用的是虚拟机吗?没有获取到ip,说明vm和dhcp-agent链路不通,注意查下网络节点各个tap设备和网桥绑定是否正确,网络节点拓扑图在官方文档上都有。按照这个思路:首先要检查节点各项服务,以及agent... 查看详情

kubernetes中pod的状态

...败PostStartHookError:执行hook报错ContainersNotInitialized:容器没有初始化完毕ContainersNotReady:容器没有准备完毕ContainerCreating:容器创建中PodInitializing:pod初始化中DockerDaemonNotReady:docker还没有完全启动NetworkPluginNotReady:网络插件还没... 查看详情

网络事件触发自己主动登录

...态。可是在弱网络下可能出现收不到通知的情况,iphone4s有时候也出现收不到网络通知的情况。其他90%以上的情况都能收到网络通知。登录时能够依据该通知来触发自己主动登录。防止没有收到网络通知就登录,导致登录失败... 查看详情