捣鼓 k3s

2,865 阅读4分钟

起因

最近打算熟悉k8s的一些搭建和操作,但是电脑同时启动三台虚拟机时候比较卡顿,所以在找是否存在既能体验K8S功能同时又可以减低资源消耗的办法,了解到有一个minikube,包括k8s官网还有油管儿各路大神都在使用,但是无奈国内的网络环境,想使用minikube还不算特别容易。后来听说了有家叫rancher的公司出了一个叫k3s的软件,据说是Kubernetes的发行版,专为物联网及边缘计算设计,有简单,轻量化的设计,于是就开始了搭建测试(因为网络问题,后来还会遇到一些坑)。

架构图

环境准备

k3s架构上分k3s server,k3s agent. 这里打算仅仅使用一台机器,同时充当server和agent端,所以随便在自己的电脑上启动一个虚拟机就可以了,本文以centos7.x 为例.

官网以及一些参考链接

https://docs.rancher.cn/docs/k3s/quick-start/_index/
https://www.infoq.cn/article/jizyup2sl30kkfqjfblw
https://rancher.com/docs/k3s/latest/en/installation/private-registry/

开始安装k3s

参考官网的quick start手册,可以看到官方提供了安装脚本,并且有适合国内用户使用的选项:

curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -

运行此安装后:

  • K3s 服务将被配置为在节点重启后或进程崩溃或被杀死时自动重启
  • 将安装其他实用程序,包括kubectl, crictl, ctr, k3s-killall.sh 和 k3s-uninstall.sh
  • 将kubeconfig文件写入到/etc/rancher/k3s/k3s.yaml,由 K3s 安装的 kubectl 将自动使用该文件 这里解释下crictl命令,之前k8s官方宣布在1.20版本之后不再支持docker作为k8s的底层容器运行时,并且k3s以轻量化著称,所以默认情况下直接内置了containerd软件作为容器运行时,但是拉取镜像啊,调试啊等等操作还是需要一个命令行工具,现在没有docker的情况下我们只能使用这个crictl命令,cri是container runtime interface的缩写,所以符合cri标准的容器运行时都可以用这个工具操作。

将agent注册到server端

如果之前的脚本顺利执行,那么可以看到k3s服务器端已经在运行了,这时我们需要提前过去一个token的值以便后续使用:

cat /var/lib/rancher/k3s/server/node-token

输出是一个很长的字符串,先放在这里.下面执行下面命令注册agent

curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_URL=https://myserver:6443 K3S_TOKEN=mynodetoken sh -

这里myserver替换成你的服务器的ip,mynodetoken替换成上面的字符串即可. 执行到这里可以通过以下命令查看到你的节点了.

kubectl get nodes

配置containerd拉取镜像的国内镜像地址

前面提到默认情况下k3s使用内置的containerd作为底层运行时,而且默认和docker一样会去docker hub下载镜像。Docker 中可以通过 registry-mirrors 设置镜像加速地址。如果 pull 的镜像不带仓库地址(项目名+镜像名:tag),则会从默认镜像仓库去拉取镜像。如果配置了镜像加速地址,会先访问镜像加速仓库,如果没有返回数据,再访问默认的镜像仓库。

Containerd 目前没有直接配置镜像加速的功能,但 containerd 中可以修改 docker.io 对应的 endpoint,所以可以通过修改 endpoint 来实现镜像加速下载。

在配置文件"/etc/rancher/k3s/registries.yaml"中添加以下内容(文件如果没有请直接创建):

mirrors:
  "docker.io":
    endpoint:
      - "https://hub-mirror.c.163.com"

我这边配置了一个163的地址,你可以随意配置国内的加速镜像站点,可以添加多个,会轮询的。 之后重启k3s服务(保险起见agent也一起重启):

systemctl restart k3s
systemctl restart k3s-agent

下面检查配置是否生效:

crictl info

如果看到mirror那里变成了你配置的地址就说明可以了。

尝试拉取镜像

可以通过下面的命令尝试拉取docker hub的镜像试试:

crictl pull nginx

查看本地镜像都有哪些:

crictl image ls

最后

最后看一眼kubectl get node的状态是ready就可以了。后续有时间会再写docker+k8s的传统方式。