记录一次今天遇到的问题和排查过程:

问题描述

       今年在做云原生相关的内容,对于k8s的测试集群,一直都是本地启动kind,运行单节点的k8s集群,还是很方便的。不论是自己在研发的项目还是在研究一些开源项目kubesphere或者kubevela等等都是通过kind的方式运行测试的。这里强烈推荐给大家。

       然后今天我在公司一台空闲的实体机上要运行公司的一个平台项目,整体部署方式也是在物理机上通过kind运行一个单节点的集群,然后将整体应用部署到集群上。一波熟练的操作部署完docker、go、kind、helm和kubectl以后,我一跑项目的部署脚本发现kind集群居然启动不起来。这下我一脸懵逼,毕竟之前不论在我本地的电脑还是云上的机器,kind用起来都是很顺滑,这下搞得我不知所措。

看一下具体情况,在执行

kind create cluster

后,kind会去pull一个部署了单节点k8s集群的镜像然后运行。

这次运行命令后,一直卡在了Starting control-plane这步上。

然后过了一会就命令就退出了,报了一堆错误。

看了一下好像是启动后一直在健康检查

GET https://kind-control-plane:6443/healthz?timeout=10s in 0 milliseconds

一直没有通过后,提示

It seems like the kubelet isn't running or healthy.

kubelet没有启动成功。

If you are on a systemd-powered system, you can try to troubleshoot the error with the following commands:
                - 'systemctl status kubelet'
                - 'journalctl -xeu kubelet'

需要通过systemctl status kubelet或者journalctl -xeu kubelet查看具体的原因。

问题排查

然后重新执行了命令,同时进到了docker正在运行的容器中,

执行了systemctl status kubelet,发现kubelet.service的服务是active的。

然后执行了journalctl -xeu kubelet,找到了报错信息:

看到这种报错,感觉已经超出我的认知范围了,然后我赶紧去google和百度上搜了一把,看了很多问题回答,大概可能是以下两种情况导致的:

  • 首先我在报错信息中看到swap的错误,创建k8s集群时,kubelet运行时不能打开swap。可能是我宿主机的开了swap导致的。
  • 可能是kubelet和docker的cgroup driver不一致导致的。

        结果我两种操作都试了一把,发现还是不行。但是关于 kubelet运行时不能打开swap cgroup driver 的知识内容,又让我学习了一波。

        在查了很多地方之后,我发现还是没有定位到具体的原因。然后我就下意识去Github里kind的issue下面搜了下,看看有没有和我遇到同样问题的兄弟。结果功夫不负有心人,还真被我找到了。

我点开了第一个issue,发现这人遇到的情况和我一模一样,瞬间看到了胜利的曙光。

[xfs?] kind create cluster fails on centos8 docker 20.10.3 with timeout · Issue #2050 · kubernetes-sigs/kind · GitHub

然后仔细看了一下回答,好像说的是因为环境中docker的overlay在xfs设备上是不能运行的。这波看得我不知所措,这还能和文件系统类型有关系。

        吓得我立马敲了一波 docker info df -hT,发现还真是运行在了xfs上。

随后我换了下文件系统的格式,从xfs换成了ext4,然后reboot一把,重新试了下,还是报错,但是问题已经变了,然后继续查了下,是因为我的内核版本太低了,升级下内核就一切正常了。

        后来我在另一台环境相同的机器上先升级了内核,在不改变文件系统的格式下,在xfs的情况下的确会报kubelet启动失败的错误。

复盘过程

  • 最终定位到问题是出在文件系统的格式上,这点真的意想不到。之前对于很多工具,都是拿来即用,但是这次出错还是学到了很多东西,加深了印象。
  • 排查问题还是对知识掌握很有帮助的
  • 一直在做开发工作,这波学习了很多运维命令和操作
  • 查问题的时候,要关注下github里面的issue

另外

另外还想到两点:

  1. 如果是商业化的团队,客户现场的机器和网络环境等等都是不可预测的,因此还是要准备和考虑的充分一点,同时也得有思想准备。
  2. 我还是比较好奇居然有人能在issue上的回答这个问题,然后就看了下。

是k8s SIG的测试主管,哈哈哈,而且他正在On Vacation,开心~

最后是2021年的最后一天了,希望明年自己能够更加牛皮,希望大家也能够更加牛皮。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐