侧边栏壁纸
博主头像
枕头下放双臭袜子博主等级

今我何功德,曾不事农桑

  • 累计撰写 163 篇文章
  • 累计创建 30 个标签
  • 累计收到 0 条评论

[次生产事故] 源于 [apt-get install docker-compose] 导致 [k8s集群不可用]

枕头下放双臭袜子
2021-12-19 / 0 评论 / 1 点赞 / 210 阅读 / 5,590 字 / 正在检测是否收录...

0、导

事故缘由是这样,作为菜鸡本人,尝试在1.15.2的次生产k8s集群上[之所以叫次生产因为上边跑的只有一个内部app和最近在调试的另一个app]部署harbor服务,首先考虑使用helm3进行安装,无奈k8s集群api版本过低,出现各种报错需手动修改各种参数,

比如helm values文件中没有涉及到的资源清单的apiVersion字段;

apiVersion: apps/v1
需改为
apiVersion: extensions/v1beta1

比如不支持资源清单中的Deployment.spec.template

Error: unable to build kubernetes objects from release manifest: 
error validating "": error validating data: 
ValidationError(Deployment.spec.template.spec.containers[0]): unknown field "startupProbe" in io.k8s.api.core.v1.Container

于是为了寻求一下别的安装方法,我选择了docker-compose进行尝试,按说docker-compose的安装方法有多种,如pip安装、二进制安装、使用主机包管理工具apt-get/yum等多种方法,我为了省事,就选择了apt-get来安装docker-compose

此Linux主机的发行版和版本如下所示:

$ cat /etc/issue
Ubuntu 16.04.6 LTS

1、故障出现

docker-compose安装完成之后,事情开始变得不对劲起来,我发现kubectl命令无法连接Api-Server,报错信息是The connection to the server 172.31.186.248:6443 was refused - did you specify the right host or port?

docker-compose-error1

并且此时发现docker也变得不正常起来,状态变为masked。说实话,我虽然猜到了docker肯定出了问题,但这个masked的状态我是真没见过。多次尝试restart docker无果,又尝试了apt-get install docker,均无济于事。最终为了快速解决问题恢复正常,我选择了google

docker-error-masked

restart-docker

(google跳转到了国内CSDN网站,不得不说有时候CSDN还是有点干货的。)

经参考,通过以下三行命令将docker状态从masked变为了failed

docker-masked-failed

报错信息如下所示:

Failed to start LSB: Create lightweight, portable, self-sufficient containers..

使用journalctl -xe -u docker也并没有找到多余的报错信息(其实这里有重要信息--图中绿色标注的地方,只不过当时着急并没有网罗到关键信息)

docker-error-journalctl-fd3d03ad0faf499dbf101646bc40b30a

我有一点怀疑是docker可能被删除掉了些什么东西,既然是apt-get install删除的,我就想着先把docker-compose删除掉,然后apt-get把docker重新下载回来,结果发现并没有起作用。

image

image.png

2、故障解决

找寻了多篇关于docker报错:Failed to start LSB: Create lightweight, portable, self-sufficient containers的解决办法,最终尝试了stack overflow的方法解决了故障。

image.png

wget -qO- https://get.docker.com/ | sh

下面是执行脚本的输出,从该输出其实可以看出来脚本的作用其实就是检查执行脚本的机器是否安装了docker,如果是使用脚本安装的docker再次执行该脚本默认会更新docker的版本。

当我执行该脚本之后,发现docker可以重新运行了,k8s集群的系统组件也重新跑起来了。
image.png

至此,k8s集群恢复正常了,问题也算是解决了,悄悄松口气(虽然不是生产环境,但毕竟上边也跑着一个内部使用的app和最近在调试的一个app)

image.png

3、复盘问题

既然问题已经解决了,那就做个复盘把所有的操作信息和相关的日志等分析梳理一下叭。为什么我只是安装docker-compose就会导致k8s集群以及docker的崩溃呢?

首先问题出现于Ubuntu 16.04.6 LTS使用apt-get install docker-compose,我们来仔细看一下apt-get install docker-compose的输出信息,

似乎发现了一行关键的信息,如下图箭头所示处:
apt-get-install-docker-compose-remove-docker-ce-contained

问题根源应该就是这里,Ubuntu 16.04.6 LTS使用使用apt-get install docker-compose命令安装docker-compose时把docker-ce containerd.io都给卸载掉了

问题算是找到,那有几个疑问需要去解决一下:

问题一
containerd.io、docker-ce、docker.io、docker-io都是什么?

容器技术命名方式第一阶段
为什么会有 docker.io、docker-io这种命名方式?

在 Docker 技术出现之前,Linux中已经有一个叫 docker 的工具,但此 docker 非彼 Docker。这个 docker 是一个窗口停靠栏程序,就像苹果MAC系统中的dock那个程序一样的工具。

这个 docker 是一个窗口停靠栏程序,就像苹果MAC系统中的dock那个程序一样的工具。我们暂时以 Docker 和 docker 来区分。Docker:指容器技术。docker:指窗口停靠栏程序

容器技术命名方式第二阶段:
从docker.io到docker-engine再到docker

docker容器技术火了之后,为了不与已经出现的窗口停靠栏程序docker重名,且又因为当时的docker官网是docker.io,所以就在软件名称上加了 io 的后缀,于是,在 Ubuntu 中就是docker.io,在 CentOS 中就是docker-io. 虽然软件名跟 docker 程序不一样了,但软件安装后的命令还是一样的,都是 docker 这个命令,所以要安装 Docker 软件,要先看看有没有安装 docker 这个停靠栏程序,有的话要先卸载。

使用 docker.io 和 docker-io 为软件名,主要是前期的一段时间。后来随着 Docker 的发展,软件包名改成了 docker-engine,名称达到了统一。

再后来,随着 Docker 技术的火爆,在征得 docker 停靠栏程序作者的同意下,给他的软件名称改成了wmdocker,Docker 容器技术的软件包名才正式成了 docker 这个名称,Docker软件包的名称又得到了一次统一。

这里需要特别注意一点,Docker容器的几次改名之后,最开始的那个窗口停靠栏docker同时使用着两个名称,一个是docker、一个是wmdocker。这一点我会在下文的问题三处详细做证明****

这样到 Docker 1.13.1 版本之前,Docker 软件包的名称就有了两次变化:从 docker-io 到 docker-engine,再到 docker

容器技术命名方式第三阶段:
docker-ce 与 docker-ee

Docker 发展到 1.13.1 版本后,Docker 公司把 Docker 分成了两种形式,一种是社区版docker-ce,一种是收费版docker-ee.

并且版本号的命名方式也改了,以前都是那种常用的版本号命名方式,比如0.1、0.2、1.0之类的,现在分社区版和商业版后,版本号是『YY.MM-xx』的形式命名的,比如2019年10月发布的,版本号就是19.10。所以在 Docker 1.13.1 之后,直接是 Docker-ce 17.03.0 版本。

现在要安装docker公司社区最新版的 Docker 软件包,就是使用 docker-ce 这个名称了,如果是商业版的就是 docker-ee

在安装 docker-ce 之前,要先卸载旧版本:

# Ubuntu
apt-get remove docker docker-engine docker.io
# CentOS
yum remove docker docker-common docker-selinux docker-engine

Ubuntu维护的 docker.io

随着docker的发展,docker的名称虽然发生了三番五次的变化,但Ubuntu上的 docker.io 软件包却一直在维护,维护者变成了Debain团队。它的版本也在不停地更新(中间好像停止维护了一段时间)

基于以上描述,做一下总结

docker-ee: Docker Data Center is now Docker EE (Enterprise Edition) .

docker-ce: Docker Community Edition (CE) 是免费 Docker 产品的新名称。Docker Engine (the free one we all know and love) is now Docker CE (Community Edition). Notice the drop of the word Engine. I suspect we can just call this Docker now. It includes the cli client and backend daemon/service and api (just like it did before). 简言之,老版本的docker-engine更名为了docker-ce,仍然作为免费的社区版本,docker-ce包含了客户端cli、后端守护进程/服务以及docker api接口。也就是说Docker CE 包括完整的 Docker 平台,适合开始构建容器应用程序的开发人员和运维团队。

docker.io: `如果你在Ubuntu上安装过docker-ce和docker.io你就会知道,在Ubuntu上安装docker.io比安装docker-ce要方便的多。事实上有这些区别是因为,docker-ce 是 docker 官方维护的,docker-ce 用 go 的方式管理依赖,会自己管理所有的依赖。而 docker.io 是 Debian 团队维护的,且 docker.io 采用 apt 的方式管理依赖。【来自参考4】【来自参考8】【来自参考9】

docker-ce-cli: docker的命令行工具,不包括引擎,可用于远程访问其他主机上的docker引擎

containerd.io: 它是一个容器守护进程,最初是作为像 runc 这样的 OCI 运行时的集成点而构建的,但在过去的一段时间,它添加了许多功能,使其能够满足 Docker 和 Kubernetes 等现代容器平台的需求。Containerd 旨在供 Docker 和 Kubernetes 以及任何其他想要抽象出系统调用或操作系统特定功能以在 linux、windows、solaris 或其他操作系统上运行容器的容器平台使用。【来自参考5

问题二
Ubuntu apt-get 安装 docker-compose 为什么会删除docker-ce、containerd.io?

为什么安装docker-compose会删除我原本的docker-ce和containerd.io呢?经过我时候复盘我发现了问题所在,该服务器上原本的docker-ce版本是19.0.3(这一点没有截图留下证明,因为当时忙着处理问题嘛)。然后我去Ubuntu包管理网站搜索了一下docker.io软件包的版本,数据显示docker.io此时的最新版本是20.10.7,此时的docker.io版本高于我本机的docker-ce 19.0.3版本,所以 apt-get 安装 docker-compose 的时候删掉了我老版本的docker-ce、containerd.io,但是只是给出了建议的docker.io,并没有帮我装上新版的docker.io或是新版本的 docker-ce,所以导致我的k8s没有了容器运行时,直接干掉了k8s系统组件例如Api-Server等

image.png

问题三
为什么处理的过程中使用apt-get install docker并不起作用?

image.png

基于问题二,既然是容器运行时docker-ce被删除了,为什么使用apt-get install docker重新装回来了并不能解决问题?甚至不能让docker重新运行起来呢?如果大家仔细看了这篇文章,应该还记得前面提到的那个linux窗口停靠程序wmdocker叭。没错!聪明的朋友应该已经想到了,执行apt-get install docker装回来的程序就是那个窗口停靠程序,而不是容器技术的docker。证据如下(不是我打字慢,是gif自动放慢了速度。。):

docker-package

参考:
1、Stack Overflow: Failed to start LSB: Create lightweight, portable, self-sufficient containers
2、台部落: Ubuntu Docker: Failed to start LSB,沒有dockerd
3、CSDN: Docker 无法启动 Failed to start LSB

4、stackoverflow: docker.io relation docker-ce
5、docker.com: containerd
6、bretfisher.com: docker version name change
7、docker.com: docker-enterprise-edition
8、CSDN:docker.io与docker-ce区别
9、知乎:docker的版本,你真的搞清楚了吗?
10、docker.com: ubuntu install docker-ce

11、ubuntu packages

0

评论