Install and Configure k3s on Raspberry Pi

on 2024-06-29

k3s 介绍

K3s 是一个轻量级的 Kubernetes 发行版,它针对边缘计算、物联网等场景进行了高度优化。K3s 有以下增强功能:

  • 打包为单个二进制文件。
  • 使用基于 sqlite3 的轻量级存储后端作为默认存储机制。同时支持使用 etcd3、MySQL 和 PostgreSQL 作为存储机制。
  • 封装在简单的启动程序中,通过该启动程序处理很多复杂的 TLS 和选项。
  • 默认情况下是安全的,对轻量级环境有合理的默认值。
  • 添加了简单但功能强大的 batteries-included 功能,例如:本地存储提供程序,服务负载均衡器,Helm controller 和 Traefik Ingress controller。
  • 所有 Kubernetes control-plane 组件的操作都封装在单个二进制文件和进程中,使 K3s 具有自动化和管理包括证书分发在内的复杂集群操作的能力。
  • 最大程度减轻了外部依赖性,K3s 仅需要 kernel 和 cgroup 挂载。 K3s 软件包需要的依赖项包括:
    • containerd
    • Flannel
    • CoreDNS
    • CNI
    • 主机实用程序(iptables、socat 等)
    • Ingress controller(Traefik)
    • 嵌入式服务负载均衡器(service load balancer)
    • 嵌入式网络策略控制器(network policy controller)

——《K3s官方介绍

架构介绍

K3s 在单主节点的情况下的架构如下图所示, Server 节点使用内置的 SQLite 数据库

其他节点作为 Agent 注册到 Server 节点, 本次将使用单 Server 的部署模式

单节点架构图

同时 K3s 也支持多 Server 节点的高可用部署, 这种场景下会部署多个 Server 节点, 保证在单个 Server 故障也可以让集群正常工作, 同时与单节点 k3s 设置中使用的嵌入式 SQLite 数据存储相反, 高可用 K3s 需要挂载一个外部数据库作为数据存储的媒介

高可用架构图

系统安装

树莓派上安装的操作系统为 Arch Linux ARM, 本次安装会使用 yay 进行安装

# 输入以下命令进行安装
yay -Syy && yay -S k3s
# 选择最新的k3s版本

Server 模式

安装完成后, systemctl 中注册的默认是 server 模式, 可以直接启动

systemctl start k3s
# 启动k3s
systemctl enable k3s
# 添加开机自启

修改 NodePort 范围

启动时添加 --service-node-port-range "1024-32767"

禁用 worker 角色

默认情况下, k3s 启动 master 节点也同时具有 worker 角色, 是可调度的, 因此可以在它们上启动工作

启动时添加 --node-taint k3s-controlplane=true:NoExecute

查看 node-token

server 启动后会生成 node-token

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

查看 kubelet config

将以下内容内容保存到 ~/.kubelet/config, 就可以在本地使用 kubelet 控制集群, 记得将其中的 127.0.0.1 替换为 Server 节点的地址

cat /etc/rancher/k3s/k3s.yaml

Agent 模式

将启动模式修改为 Agent

vim /lib/systemd/system/k3s.service
# 将启动命令由 `server` 改成 `agent`
systemctl daemon-load
# 重新载入服务配置

修改 /etc/systemd/system/k3s.service.env 文件, 填入 server 节点地址, 与 node-token

K3S_URL="https://{{.my-server-ip}}:6443"
K3S_TOKEN="{{.my-server-token}}"
# K3S_NODE_NAME=
# K3S_ARGS=

然后用 systemctl 启动服务即可

修改节点角色

K3s worker 节点默认为 none, 可以通过以下命令修改

kubectl lable node {{.your-node}} node-role.kubernetes.io/worker=worker