kubelet无法访问rancher-metadata问题分析

author author     2022-08-24     547

关键词:

引言


Rancher能够支持Kubernetes,可以快速几乎无障碍的拉起一套K8s环境,这对刚入门K8s的小白来说简直是一大利器。当然由于系统特性五花八门,系统内置软件也相互影响,所以有时候伙伴们会碰到比较难缠的问题。本文就分析一下关于kubelet无法访问rancher-metadata问题。


问题现象


使用Rancher部署K8s后,发现一切服务状态均正常,这时候打开K8s dashboard却无法访问,细心得查看会发现,dashboard服务并没有部署起来,这时下意识的行为是查看kubelet的日志,此时会发现一个异常:


技术分享


你会发现kubelet容器内部一直无法访问rancher-metadata,查看rancher-k8s-package源码,kubelet服务启动之前需要通过访问rancher-metadata做一些初始化动作,由于访问不了,便一直处于sleep状态,也就是出现了上面提到的那些异常日志的现象:


技术分享


同样,在github上也能看到类似的issue:https://github.com/rancher/rancher/issues/7160


排查分析


进入kubelet容器一探究竟,分别用ping和dig测试对rancher-metadata访问情况如下:


技术分享


dig明显可以解析,但是ping无法解析,因此基本排除了容器内dns nameserver或者网络链路情况的问题。


既然dig没有问题,ping有问题,那么我们就直接采取使用

strace(strace ping rancher-metadata -c 1)

来调试,这样可以打印系统内部调用的情况,可以更深层次找到问题根源:


技术分享


之前提到这个问题并不是必现的,所以我们找一个正常的环境,同样用strace调试,如下:


技术分享


对这两张图,其实已经能够很明显的看出区别,有问题的kubelet在解析rancher-metadata之前,向nscd请求的解析结果,nscd返回了unkown host,所以就没有进行dns解析。而正常的kubelet节点并没有找到nscd.socket,而后直接请求dns进行解析rancher-metadata地址。


经过以上的分析,基本上断定问题出在nscd上,那么为什么同样版本的rancher-k8s,一个有nscd socket,而另一个却没有,仔细看一下kubelet的compose定义:


技术分享


kubelet启动时候映射了主机目录/var/run,那么基本可以得知nscd来自于系统。检查一下有问题的kubelet节点的系统,果然会发现安装了nscd服务(服务名为unscd)。


用比较暴力的方案证明一下分析过程,直接删除nscd socket文件,这时候你会发现kubelet服务正常启动了,rancher-metadata也可以访问了。


回过头来思考一下原理,为什么ping/curl这种会先去nscd中寻找解析结果呢,而dig/nslookup则不受影响。ping/curl这种在解析地址前都会先读取/etc/nsswitch.conf,这是由于其底层均引用了glibc, 由nsswitch调度,最终指引ping/curl先去找nscd服务。nscd服务是一个name services cache服务,很多解析结果他会缓存,而我们知道这个nscd是运行在Host上的,Host上是不能直接访问rancher-metadata这个服务名,所以kubelet容器中就无法访问rancher-metadata。


其他解决方案


其实我们也未必要如此暴力删除nscd,nscd也有一些配置,我们可以修改一下以避免这种情况,可以disable hosts cache,这样nscd中便不会有相应内容的缓存,所以解析rancher-metadata并不会出现unknown host,而是继续向dns nameserver申请解析地址,这样也不会有问题。


技术分享


总结


遇到问题不能慌,关键是要沉得住气,很多看似非常复杂的问题,其实往往都是一个小配置引发的血案。


本文出自 “12452495” 博客,请务必保留此出处http://12462495.blog.51cto.com/12452495/1905731

k8s常见故障

故障排查思路节点处于NotReady节点是由kubelet管理的,所以要先检查kubelet的相关情况排查思路:查看kubelet和docker服务是否正常systemctlstatuskubectlsystemctlstatusdocker查看kubelet的日志或者重启kubelet并查看日志systemctlrestartkubectl#查看日志... 查看详情

kubelet 无法从 Rocket 启动

】kubelet无法从Rocket启动【英文标题】:kubeletfailstostartwithrocket【发布时间】:2017-09-1220:22:55【问题描述】:我想就我在https://github.com/rkt/rkt/issues/3647中描述的Kubelet问题向Kubernetes社区寻求建议。请在此处找到问题的简要摘要,并... 查看详情

主机名更改后 Kubelet 无法注册到 master

】主机名更改后Kubelet无法注册到master【英文标题】:Kubeletcouldnotregistertomasterafterthehostnamechanged【发布时间】:2019-01-3014:27:21【问题描述】:当我更改其中一个节点的主机名时,kubelet服务中遇到以下错误:Aug2414:28:32k8s-worker03kubele... 查看详情

Kubelet - 工厂“crio”无法处理容器[关闭]

】Kubelet-工厂“crio”无法处理容器[关闭]【英文标题】:Kubelet-Factory"crio"wasunabletohandlecontainer[closed]【发布时间】:2021-09-0702:08:38【问题描述】:我尝试通过kubespraymaster分支安装Kubernetes1.21.1。它位于代理服务器后面。我把h... 查看详情

从 kubelet 获得批准证书后,kubernetes 无法获取节点信息

】从kubelet获得批准证书后,kubernetes无法获取节点信息【英文标题】:kubenetescan\'nnotgetnodesinfoafterapprovecertificatefromkubelet【发布时间】:2021-03-2223:41:38【问题描述】:我用手动的方式安装kubernetes。在master批准kubelet的证书请求后,... 查看详情

在 Kubernetes 1.6 中,使用 ssl 认证时,Kubelet 服务无法启动,为啥?

】在Kubernetes1.6中,使用ssl认证时,Kubelet服务无法启动,为啥?【英文标题】:InKubernetes1.6,whenusingthesslauthentication,theKubeletservicecannotstart,why?在Kubernetes1.6中,使用ssl认证时,Kubelet服务无法启动,为什么?【发布时间】:2018-01-0216:... 查看详情

访问 Kubelet API Microk8s

】访问KubeletAPIMicrok8s【英文标题】:AccessingKubeletAPIMicrok8s【发布时间】:2020-06-2023:10:19【问题描述】:想问一下如何从microk8s集群访问KubeletAPI。我查看了url,它说KubeletAPI需要客户端证书。所以我称之为(来自/var/snap/microk8s/current... 查看详情

无法从集群外部访问 Kubernetes 仪表板

...bernetes集群。我使用以下设置:1.kubeadm(1.7.1)2.kubectl(1.7.1)3.kubelet(1.7.1)4.编织(weave-kube- 查看详情

k8s记一次kubelet启动后master无法获取

  k8s的node启动kubelet后再master端获取不到  node的日志/var/log/messages报错如下failedtoensurenodeleaseexists,willretryin7s,error:leases.coordination.k8s.io"172.16.20.227"isforbidden:User"system:node:172.16.20.228"cann 查看详情

Kubelet 无法获取“/system.slice/docker.service”的 cgroup 统计信息

】Kubelet无法获取“/system.slice/docker.service”的cgroup统计信息【英文标题】:Kubeletfailedtogetcgroupstatsfor"/system.slice/docker.service"【发布时间】:2018-05-0218:29:37【问题描述】:问题kubectl(CentOS7上的1.8.3)错误消息实际上意味着什... 查看详情

通过vagrant+virtualbox安装k8s找不到pod问题

...网,网卡2使用Host-only来实现虚拟机互相访问。各节点各kubelet默认把网卡1的NAT地址当做了自己的IP,上报给了master节点,而节点之间是无法通过这个地址连通的。所以我们将其改成虚拟机之间可以相互访问的地址(这里是host-only... 查看详情

Kubelet - 未能为 coredns “创建PodSandbox”;未能设置网桥地址:无法将 ip 地址添加到“cni0”:权限被拒绝

】Kubelet-未能为coredns“创建PodSandbox”;未能设置网桥地址:无法将ip地址添加到“cni0”:权限被拒绝【英文标题】:Kubelet-failedto"CreatePodSandbox"forcoredns;failedtosetbridgeaddr:couldnotaddipaddrto"cni0":permissiondenied【发布时间... 查看详情

使用客户端 api 获取 kubelet 日志

】使用客户端api获取kubelet日志【英文标题】:Getkubeletlogsusingtheclientapi【发布时间】:2020-12-1507:26:52【问题描述】:我正在尝试使用kubernetes的API从节点获取kubelet日志(不是pod日志,而是实际的kubelet日志)。到目前为止,我还没... 查看详情

即使我的所有服务器证书都有效,也无法访问我的 kubernetes 集群

...该有5年的有效期,所以我制作了我的ca.crt、apiserver.crt、kubelet-client.crt 查看详情

kubelet介绍

...:https://blog.csdn.net/jettery/article/details/78891733概述  Kubelet组件运行在Node节点上,维持运行中的Pods以及提供kuberntes运行时环境,主要完成以下使命:1.监视分配给该Node节点的pods2.挂载pod所需要的volumes3.下载pod的secret... 查看详情

07-2.部署kubelet组件(代码片段)

07-2.部署kubelet组件kublet运行在每个worker节点上,接收kube-apiserver发送的请求,管理Pod容器,执行交互式命令,如exec、run、logs等。kublet启动时自动向kube-apiserver注册节点信息,内置的cadvisor统计和监控节点的资源使用情况。为确保... 查看详情

在哪里可以找到容器操作系统上的 kubelet 日志?

】在哪里可以找到容器操作系统上的kubelet日志?【英文标题】:WherecanIfindkubeletlogsonContainerOS?【发布时间】:2021-03-0600:08:30【问题描述】:所以我可以在运行其他操作系统的pod中的var/log/messages下看到它们,但我无法找到运行Conta... 查看详情

Kubernetes 1.17 中的 kubelet_volume_stats_*

】Kubernetes1.17中的kubelet_volume_stats_*【英文标题】:kubelet_volume_stats_*inKubernetes1.17【发布时间】:2021-01-1613:35:48【问题描述】:我一直在使用Prometheus/Grafana在Azure中监控我的k8s集群,直到上次从v1.15更新到v1.17之前都没有问题。现在... 查看详情