Kubernetes 安装踩坑记录

倒腾了一段时间的 Kubernetes 的(安装)。

安装教程

Kubernetes 的安装教程参考 Kubernetes 官方的教程 就可以。 当前其他的教程也能参考,但是还是没有官方的靠谱,尤其是版本更新或者是。而且官方的教程也是由中文的。

OpenSUSE 官方的软件源中是有 Kubernetes 相关的组建的,可以直接安装(我用的 15.3)。安装两个包 kubernetes1.20-kubeadmkubernetes1.20-client 就行,后面包里面有 kubectl 等命令。

折腾环境

还是要介绍一下配置的环境的。折腾的环境还是比较复(gan)杂(ga)的。

Master 节点是安装在一台树莓派 4B 上,内存 8G,然后系统是安装在 USB 的移动硬盘上。第一次安装的是基于 Manjaro 系统,这个是滚动更新的,后来觉得可能不稳定(因为没有心情每天更新)。所以就换成了 JeOS (OpenSUSE 系统的精简版) 版本是 15.3 。

然后 Node 节点有个,一个是安装在 HP Z800 上,双路老至强,24G 内存,另一个是 Dell 的 R620,双路至强 v2,96G 内存。两个机子都安装的是 Ubuntu 20.04,然后是有计划更换 OpenSUSE 的,但是要等 OpenSUSE 定制操作系统的事情搞定,这个是另一个坑。

Docker、 Containerd、CRI-O

Kubernetes 使用的,我们一般惯性思维的是 Docker。但是现在 Docker 安装的过程中会有同时安装 Containerd,所以可以选择只安装 Containerd。至于如何安装,看 Docker 官方的教程就好。现在,如果不纠结版本的话,很多发行版,比如 OpenSUSE,官方的仓库会有 Docker。

而要说的另一个问题,是 OpenSUSE 软件源里面是由 Kuberenetes 相关的组件的,这个安装 kubernetes 默认用的是 CRI-O(当然也会安装 CRI-O) 所以也就不需要额外安装 Docker。

Kubernetes 的容器是可以混搭的,至少我现在 Master 节点用的是 CRI-O,然后两个 Node 节点用的是 Docker,之后换 OpenSUSE 再换,CRI-O。(还有没有说的是 CRI-O 之所以被 SUSE 相关的发行版当作默认的容器运行时,是因为,这个 CRI-O 背后之一就是 SUSE)。

在 OpenSUSE 中安装 CRI-O 遇到了一个问题,就是 CRI-O 的版本不太对(主要是旧),所以从 CRI-O 的官方仓库 下载编译好的就行,版本和 Kubernetes 差不多就行(v1.x 对应的就是 k8s v1.x)。这个东西安装的过程也简单,就是直接 make install 就行。然后会覆盖掉原来安装的文件。安装文件中还有 cni 网络的相关内容与 cri-o 相关的脚本(比如系统服务的配置)。安装完更新配置后,启动 cri-o 服务就行。

如果 Docker 和 Containerd 同时安装的话,则会优先使用 Docker,但是如果 Docker 和 CRI-O 同时安装的话,就需要人工指定了(通过命令行或者是配置文件)。

配置

这个安装的过程中,不少坑是配置中。

安装的配置

安装要配置的东西也不多,建议将配置放在 yaml 文件里面,然后配置(没有变的就删除掉就好)。这个配置通过 kubeadm config print init-defaults 会打印出来。里面有一些不用改,但是也不能留的的,就比如 localAPIEndpoint.advertiseAddress 这个就要不改成实际的本机的 ip,要不就删除了。

需要修改的内容包括:

  • 如果不使用 Docker 的话,可能需要指定 CRI-O 或者 Containerd 的 unix-sock。
  • 需要指定集群的网络信息,一个是 pod 子网(networking.podSubnet) 和 service 子网 (networking.serviceSubnet) 。同时还要注意,cni 相关的网络配件中的网络也要配置对。比如我这里,在使用的 CRI-O 带的 CNI 的配置 /etc/cni/net.d/10-crio-bridge.conf 中,配置了 crio 的网段,这个网段就要和 pod 子网的配置一致。

可以选择修改的配置包括:

  • Kubernetes 的版本,所安装的通过 kubernetesVersion 控制。这个版本一般和 kubeadm 相关,也就是说,默认的情况下会安装和 kubeadm 相同的版本,当然也可以不同。整个集群的版本也可以有一定差异。
  • 镜像仓库。因为 Kuberenetes 是 Google 搞得,所以 Kubernetes 所使用的镜像往往是不方便访问的,所以这里就需要使用镜像服务。比如阿里的镜像。这个网上查一下就好,然后修改 imageRepository 这个部分就行。此外 OpenSUSE 官方的软件源安装软件使用的是 OpenSUSE 官方的镜像源,这个是可以较为直接的访问的,不需要求改。当然同时还需要主要镜像架构的问题,有些镜像源是没有 ARM64 之类的镜像的。

网络

Kubernetes 的安装完成后就需要配置网络,我这里用的 flannel(也没啥选择这个东西的理由,之后说不定会还更换)。这个具体安装的方式在各个插件相关的网站会有,通过 kubectl create -f file.yaml 来进行配置就行

节点

我们在主节点上做的初始化,仅初始化了主节点,还需要初始化其他的节点。其他的节点上需要安装 kubeadm 和 kubelet,其他的可以不用安装。如果是在虚拟机之类的进行的配置,直接拷贝的配置好的主节点的虚拟机作为新的虚拟机的话,需要将环境进行重置。

将节点加入集群也相对比较简单。在主节点完成初始化的过程后,会将相关的命令打印在终端上,然后复制到其他的机子上执行就可以了。如果没有看见,或者丢失了,可以参照这个格式:

kubeadm join 172.22.6.4:6443 --token $TOKEN --discovery-token-ca-cert-hash sha256:$CERT_HASH

其中 $TOKEN$CERT_HASH 为在初始化过程中配置的,具体这个内容可以网上查一下(其实就是我也不记得咋整了,或者看 https://cloud.tencent.com/developer/article/1361250)。

重置

重置也简单,执行 kubeadm reset 就可以。但是需要注意的是,如果初始化失败时,要先修复导致失败的问题,然后在重新初始化(也就是要先重置)。

Docker/CRI-O cgroup driver

这个是要配置, kuberenetes 和 容器运行时一致就可以。

排错

  1. 很多初始化的错误都是 kubelet service 启动的问题,建议仔细检查相关日志。

  2. Swap,这个建议关掉,但是新的版本貌似又支持这个东西了。

  3. 如果网络有问题,首先先检查 DNS 是不是对的,在主节点和其他节点上面通过 nslookup 之类的命令对 CoreDNS 的服务进行检查。DNS 出问题有几种可能,一个是 kubernetes 集群的网络配置有问题,也可能是 CoreDNS 无法访问所设定的上游 DNS 服务器。如果是集群网络配置的有问题,那就可以参考 https://zhuanlan.zhihu.com/p/368559385 这个来进行排错。或者无脑重启 flannel 相关的容器就行(删除相关的 pod)。