使用 K3s 在树莓派上运行 Kubernetes 集群

什么是Kubernetes?

Kubernetes(k8s)是自动化容器操作的开源平台,这些操作包括部署,调度和节点集群间扩展。如果你曾经用过Docker容器技术部署容器,那么可以将Docker看成Kubernetes内部使用的低级别组件。Kubernetes不仅仅支持Docker,还支持Rocket,这是另一种容器技术。

使用Kubernetes可以:

自动化容器的部署和复制

随时扩展或收缩容器规模

将容器组织成组,并且提供容器间的负载均衡

很容易地升级应用程序容器的新版本

提供容器弹性,如果容器失效就替换它,等等…

跟随接下来的介绍,自己搭建一个三节点的 Kubernetes 集群。

我对在树莓派上搭建 Kubernetes 集群已经感兴趣很长时间了,只要照着网上的教程,我可以在由三个树莓派组成的集群中搭建一套 Kubernetes 并正常运行。但在这种情况下,主节点上的内存和 CPU 资源捉襟见肘,执行 Kubernetes 任务的时候往往性能不佳,想要升级 Kubernetes 就更不可能了。

这个时候,我非常激动地发现了 K3s 这个项目。K3s 被誉为在可用于资源受限环境下的轻量级 Kubernetes,它还针对 ARM 处理器做出了优化,这让 Kubernetes 集群可以在树莓派上运行得更好。在下文中,我们将会使用 K3s 来创建一个 Kubernetes 集群。

准备

要按照本文介绍的方式创建 Kubernetes 集群,首先需要准备:

至少一个树莓派(包括 SD 卡和电源)

网线

将所有树莓派连接到一起的交换机或路由器

我们会通过在线安装的方式安装 K3s,因此还需要可以连接到互联网。

集群概览

在这个集群里,我们会使用三个树莓派。其中一个树莓派作为主节点,我们将它命名为 kmaster ,并为其分配一个静态 IP 192.168.0.50 (注:假设使用的私有网段是 192.168.0.0/24),而另外两个树莓派作为工作节点,分别命名为 knode1 和 knode2 ,也分别分配 192.168.0.51 和 192.168.0.52 两个 IP 地址。

当然,如果你实际的网络布局和上面不同,只要将文中所提及到的 IP 替换成你实际可用的 IP 就可以了。

为了不需要通过 IP 来引用某一个节点,我们将每个节点的主机名记录到 PC 的 /etc/hosts 文件当中:

echo -e “192.168.0.50\tkmaster” | sudo tee -a /etc/hosts echo -e “192.168.0.51\tknode1” | sudo tee -a /etc/hosts echo -e “192.168.0.52\tknode2” | sudo tee -a /etc/hosts

部署主节点

我们首先部署主节点。最开始的步骤当然是使用镜像安装最新的 Raspbian,这个步骤可以参考我的另一篇文章,在这里就不展开介绍了。在安装完成之后,启动 SSH 服务,将主机名设置为 kmaster ,然后分配静态 IP 192.168.0.50 。

在主节点上安装 Raspbian 完成后,启动树莓派并通过 ssh 连接上去:

ssh pi@kmaster

在主节点上执行以下命令安装 K3s:

curl -sfL https://get.k3s.io | sh –

等到命令跑完以后,一个单节点集群就已经运行起来了。让我们检查一下,还在这个树莓派上执行:

sudo kubectl get nodes

就会看到这样的输出:

NAME STATUS ROLES AGE VERSION kmaster Ready master 2m13s v1.14.3-k3s.1

获取 连接令牌 join token

之后我们需要部署工作节点。在工作节点上安装 K3s 的时候,会需要用到连接令牌,它放置在主节点的文件系统上。首先把连接令牌保存出来以便后续使用:

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

部署工作节点

通过 SD 卡在每个作为工作节点的树莓派上安装 Raspbian。在这里,我们把其中一个树莓派的主机名设置为 knode1 ,为其分配 IP 地址 192.168.0.51 ,另一个树莓派的主机名设置为 knode2 ,分配 IP 地址 192.168.0.52 。接下来就可以安装 K3s 了。

启动主机名为 knode1 的树莓派,通过 ssh 连接上去:

ssh pi@knode1

在这个树莓派上,安装 K3s 的过程和之前差不多,但需要另外加上一些参数,表示它是一个工作节点,需要连接到一个已有的集群上:

curl -sfL http://get.k3s.io | K3S_URL=https://192.168.0.50:6443 \ K3S_TOKEN=刚才保存下来的连接令牌 sh –

K3S_TOKEN 的值需要替换成刚才保存下来的实际的连接令牌。完成之后,在主机名为 knode2 的树莓派上重复这个安装过程。

通过 PC 访问集群

现在如果我们想要查看或者更改集群,都必须 ssh 到集群的主节点才能使用 kubectl ,这是比较麻烦的。因此我们会将 kubectl 放到 PC 上使用。首先,在主节点上获取一些必要的配置信息, ssh 到 kmaster 上执行:

sudo cat /etc/rancher/k3s/k3s.yaml

复制上面命令的输出,然后在你的 PC 上创建一个目录用来放置配置文件:

mkdir ~/.kube

将复制好的内容写入到 ~/.kube/config 文件中,然后编辑该文件,将

server: https://localhost:6443

改为

server: https://kmaster:6443

出于安全考虑,只对自己保留这个配置文件的读写权限:

chmod 600 ~/.kube/config

如果 PC 上还没有安装 kubectl 的话,就可以开始安装了。Kubernetes 官方网站上有各种平台安装 kubectl 的方法说明,我使用的是 Ubuntu 的衍生版 Linux Mint,所以我的安装方法是这样的:

sudo apt update && sudo apt install -y apt-transport-https curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add – echo “deb https://apt.kubernetes.io/ kubernetes-xenial main” | sudo tee -a /etc/apt/sources.list.d/kubernetes.list sudo apt update && sudo apt install kubectl

上面几个命令的作用是添加了一个包含 Kubernetes 的 Debian 软件库,获取 GPG 密钥以确保安全,然后更新软件包列表并安装 kubectl 。如果 kubectl 有更新,我们将会通过 标准软件更新机制 standard software update mechanism 收到通知。

现在在 PC 上就可以查看 Kubernetes 集群了:

kubectl get nodes

输出大概会是这样:

NAME STATUS ROLES AGE VERSION kmaster Ready master 12m v1.14.3-k3s.1 knode1 Ready worker 103s v1.14.3-k3s.1 knode1 Ready worker 103s v1.14.3-k3s.1

至此,我们已经搭建了一个三节点的 Kubernetes 集群。

K3s 的彩蛋

如果执行 kubectl get pods –all-namespaces ,就会看到其它服务的一些 Pod,比如 Traefik。Traefik 在这里起到是反向代理和负载均衡器的作用,它可以让流量从单个入口进入集群后引导到集群中的各个服务。Kubernetes 支持这种机制,但 Kubernetes 本身不提供这个功能,因此 Traefik 是一个不错的选择,K3s 安装后立即可用的优点也得益于此。

在后续的文章中,我们会继续探讨 Traefik 在 Kubernetes ingress 中的应用,以及在集群中部署其它组件。敬请关注。

via: https://opensource.com/article/20/3/kubernetes-raspberry-pi-k3s

作者:Lee Carpenter 选题:lujun9972 译者:HankChow 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出