0%

轻量级Kubernetes发行版k3s之配置问题汇总

虽然上篇文章中提到k3s安装非常简单,但由于现在k3s的版本还是 v0.8.1,可能会出现不稳定的情况以及一些配置上的问题,还不推荐在生产环境中正式使用。

下面我总结了一些我在配置k3s集群过程中遇到的一些问题及解决方法。

关于容器引擎

containerd

k3s默认推荐使用 Containerd 作为容器引擎。通过用containderd替换Docker,K3s能够显著减少运行时占用空间,删除了libnetwork、swarm、Docker存储驱动程序和其他插件等功能。

k3s服务在安装时也默认设置了containerd容器管理工具 crictl

关于containerd的详细内容,这里暂且不细说,后续我会单独用一篇文章来介绍。

docker

k3s 也支持使用docker来作为容器引擎。只需要在服务启动时指定参数 --docker 即可。

因为我平时习惯了使用docker,所以我就选择了docker作为默认的容器引擎。启动后如下,会在 CONTAINER-RUNTIME 一栏显示所用的容器引擎信息:

1
2
3
4
# kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
k3s-agent Ready worker 6m2s v1.14.6-k3s.1 192.168.5.18 <none> CentOS Linux 7 (Core) 3.10.0-957.10.1.el7.x86_64 docker://18.6.3
k3s-master Ready master 4m38s v1.14.6-k3s.1 192.168.5.17 <none> CentOS Linux 7 (Core) 3.10.0-957.10.1.el7.x86_64 docker://18.6.3

docker版本

我安装的k3s版本为 v0.8.1,对应的kubernetes版本为 v1.14.6。安装的docker版本为 v18.06

一开始我使用的docker版本为 v18.09,配置k3s的master客户端时服务能正常启动,但当安装agent服务时,添加了 --docker 参数后k3s服务一直无法启动。于是我只好将docker版本从 v18.09 降级到了 v18.06 版本才正常启动。

我去查看了一下Kubernetes支持的docker版本,对于Kubernetes v1.14 版本支持的docker版本为 1.13.1, 17.03, 17.06, 17.09, 18.06, 18.09。

至于我的 v18.09 为什么没有正常启动,后来推测可能是两方面的问题:

  1. k3s不稳定(可以尝试多次重启服务或者重启系统解决)
  2. 系统环境影响(可以通过重新搭建系统环境来解决)

pause镜像

Kubernetes集群在运行时需要获取一个基础镜像pause:k8s.gcr.io/pause:3.1,k3s中也不例外。但由于pause镜像的仓库为 k8s.gcr.io,在国内是无法正常拉取的,也就导致了你在创建Pod时一直处于 ImagePullBackOff 状态。

一般我们可以通过折中的方法来获取该镜像。

使用docker作为容器引擎时

这种方法是相对来说比较简单的,只需要在k3s服务命令中添加 --docker 就可以指定k3s使用Docker容器引擎。pause镜像的获取可以按照之前搭建Kubernetes集群环境时 Kubernetes入门 – 一使用kubeadm部署Kubernetes集群v1.14.1 | IT范儿 中的步骤来操作。

我这里使用的是 azure中国 的镜像地址:

1
2
3
$ docker pull gcr.azk8s.cn/google_containers/pause:3.1
$ docker tag gcr.azk8s.cn/google_containers/pause:3.1 k8s.gcr.io/pause:3.1
$ docker rmi gcr.azk8s.cn/google_containers/pause:3.1
使用containerd作为容器引擎时

k3s中默认使用containerd作为容器引擎,在运行Pod时也会先去获取pause镜像。

这里我总结了两种方法来为containerd提前下载pause镜像。

通过docker拉取

我们可以通过docker把pause镜像拉取下来,然后转换成containerd可以使用的pause镜像:

1
2
3
4
5
6
7
8
9
10
11
# 通过docker拉取镜像
$ docker pull gcr.azk8s.cn/google_containers/pause:3.1

# 通过tag重命名pause镜像
$ docker tag gcr.azk8s.cn/google_containers/pause:3.1 k8s.gcr.io/pause:3.1

# 保存镜像为tar包
$ docker save k8s.gcr.io/pause:3.1 -o pause.tar

# 让containerd加载该tar包
$ ctr cri load pause.tar
通过air-gap安装

k3s支持预加载containerd映像,方法是在启动之前将它们放在代理的images目录中。

先从 Releases · rancher/k3s 下载对应的 k3s-airgap-images-xxx.tar 安装包。

然后通过如下命令操作:

1
2
sudo mkdir -p /var/lib/rancher/k3s/agent/images/
sudo cp ./k3s-airgap-images-$ARCH.tar /var/lib/rancher/k3s/agent/images/

详见官方文档:Running K3S


启用端口

一般情况下,在局域网内测试k3s集群为了测试方便都会选择关闭防火墙 systemctl stop firewalld && systemctl disable firewalld 。但如果是在正式的生产环境中则需要启用防火墙并打开相关的端口。

按照k3s文档上的说明,需要启用 64438472 端口。

但是,不排除还有一些其他的潜在端口。这里我只找到了一篇相关的issues:k3s service cannot start in RHEL with firewall enabled · Issue #401 · rancher/k3s

扩展:Configuration Info Open Ports / Network Security


卸载k3s

如果是通过 install.sh 脚本安装的k3s,默认会在服务中安装一个卸载的脚本文件:

/usr/local/bin/k3s-uninstall.sh (or as k3s-agent-uninstall.sh).


Running in Docker

除了通过二进制的方式来部署k3s,还可以使用更简单的Docker容器方式来部署。k3s官方也给出了两种方法来通过Docker容器安装k3s。

docker-compose

可以直接从k3s的github仓库中获取该 docker-compose.yaml 文件,或执行:

1
$ wget https://raw.githubusercontent.com/rancher/k3s/master/docker-compose.yml
k3d

k3d 可以理解成 k3s in docker ,是一个设计用于在Docker中轻松运行k3s的实用程序。

详见:rancher/k3d: Little helper to run Rancher Lab’s k3s in Docker


异常处理

kube config permissions

在通过非root账户配置好k3s-master 服务后,我想着通过 kubectl get node 查看一下节点的运行状态,结果却报出了如下的错误:

1
2
3
➜  ~ k3s kubectl get node
WARN[2019-08-30T12:14:50.841714144+08:00] Unable to read /etc/rancher/k3s/k3s.yaml, please start server with --write-kubeconfig-mode to modify kube config permissions
error: Error loading config file "/etc/rancher/k3s/k3s.yaml": open /etc/rancher/k3s/k3s.yaml: permission denied

错误信息是:在加载配置文件 /etc/rancher/k3s/k3s.yaml 时没有权限。

让人欣喜的是在错误信息也给出了解决方法,通过设置 --write-kubeconfig-mode 参数来赋予权限。

只需在 k3s.service 中将 ExecStart 的值 ExecStart=/usr/local/bin/k3s server --docker 改成:

1
/usr/local/bin/k3s server --docker --write-kubeconfig-mode 644

之后,重启服务即可:

1
2
➜  ~ sudo systemctl daemon-reload
➜ ~ sudo systemctl restart k3s

具体关于这个问题的讨论可以参考:/etc/rancher/k3s/k3s.yaml is world readable · Issue #389 · rancher/k3s 这个issue讨论。

certificate has expired

在安装 k3s-agent 过程中,发现启动服务后日志中一直报如下的错误:

1
2
8月 30 17:07:00 node1 k3s[941]: time="2019-08-30T17:07:00.542226362+08:00" level=error msg="server https://127.0.0.1:35556/cacerts is not trusted: Get https://127.0.0.1:35556/cacerts: x509: certificate has expired or is not yet valid"
8月 30 17:07:02 node1 k3s[941]: time="2019-08-30T17:07:02.547358146+08:00" level=error msg="server https://127.0.0.1:35556/cacerts is not trusted: Get https://127.0.0.1:35556/cacerts: x509: certificate has expired or is not yet valid"

看错误信息 x509: certificate has expired or is not yet valid" 提示是证书过期了,但刚一安装证书怎么就过期了呢?多次重启服务后发现一直报这个错误。

后来才发现原来是master服务器和agent服务器两个主机的系统时间不一致导致的,我将agent服务器重启后就好了。

如有疑问或需要技术讨论,请留言或发邮件到 service@itfanr.cc