虽然上篇文章中提到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 | # kubectl get nodes -o wide |
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
为什么没有正常启动,后来推测可能是两方面的问题:
- k3s不稳定(可以尝试多次重启服务或者重启系统解决)
- 系统环境影响(可以通过重新搭建系统环境来解决)
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 | $ docker pull gcr.azk8s.cn/google_containers/pause:3.1 |
使用containerd作为容器引擎时
k3s中默认使用containerd作为容器引擎,在运行Pod时也会先去获取pause镜像。
这里我总结了两种方法来为containerd提前下载pause镜像。
通过docker拉取
我们可以通过docker把pause镜像拉取下来,然后转换成containerd可以使用的pause镜像:
1 | # 通过docker拉取镜像 |
通过air-gap安装
k3s支持预加载containerd映像,方法是在启动之前将它们放在代理的images目录中。
先从 Releases · rancher/k3s 下载对应的 k3s-airgap-images-xxx.tar
安装包。
然后通过如下命令操作:
1 | sudo mkdir -p /var/lib/rancher/k3s/agent/images/ |
详见官方文档:Running K3S
启用端口
一般情况下,在局域网内测试k3s集群为了测试方便都会选择关闭防火墙 systemctl stop firewalld && systemctl disable firewalld
。但如果是在正式的生产环境中则需要启用防火墙并打开相关的端口。
按照k3s文档上的说明,需要启用 6443
和 8472
端口。
但是,不排除还有一些其他的潜在端口。这里我只找到了一篇相关的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 | ➜ ~ k3s kubectl get node |
错误信息是:在加载配置文件 /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 | ➜ ~ sudo systemctl daemon-reload |
具体关于这个问题的讨论可以参考:/etc/rancher/k3s/k3s.yaml is world readable · Issue #389 · rancher/k3s 这个issue讨论。
certificate has expired
在安装 k3s-agent
过程中,发现启动服务后日志中一直报如下的错误:
1 | 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" |
看错误信息 x509: certificate has expired or is not yet valid"
提示是证书过期了,但刚一安装证书怎么就过期了呢?多次重启服务后发现一直报这个错误。
后来才发现原来是master服务器和agent服务器两个主机的系统时间不一致导致的,我将agent服务器重启后就好了。