K3S 架构方案
- Server 节点指的是运行 k3s server 命令的主机,control plane 和数据存储组件由 K3s 管理
- Agent 节点指的是运行 k3s agent 命令的主机,不具有任何数据存储或 control plane 组件
- Server 和 Agent 都运行 kubelet、容器运行时和 CNI
基于 SQLite 的单机架构
在此配置中,每个 Agent 节点都注册到同一个 Server 节点。K3s 用户可以通过调用 Server 节点上的 K3s API 来操作 Kubernetes 资源
基于 Etcd 的高可用架构
两个或多个 Server 节点为 Kubernetes API 提供服务并运行其他的 control plane 服务
嵌入式etcd数据存储(相对于嵌入式SQLite数据存储用于单服务器设置)
基于 外部数据库 的高可用架构
K3S 安装要求
官网文档
先决条件
无论 K3s 在容器中运行还是作为原生 Linux 服务运行,每个运行 K3s 的节点都应满足以下最低要求:
两个节点不能具有相同的主机名。如果多个节点将具有相同的主机名,或者主机名可以被自动配置系统重复使用,请使用 --with-node-id 选项为每个节点附加一个随机后缀,或者使用 --node-name 或 $K3S_NODE_NAME 为添加到集群的每个节点设计一个独特的名称
hostnamectl set-hostname master1 && hostname # 在主节点1设置
hostnamectl set-hostname node1 && hostname # 在从节点2设置
vi /etc/hosts # 所有节点编辑文件,注意不能有空格
192.168.111.50 master1
192.168.111.51 node1
systemctl disable nftables.service && systemctl stop nftables.service && systemctl status nftables.service # 所有节点关闭防火墙
swapoff -a && sed -i 's/.*swap.*/#&/' /etc/fstab # 所有节点永久禁用各节点的交换分区
timedatectl set-timezone Asia/Shanghai # 所有节点同步时区
操作系统条件
Red Hat/CentOS Enterprise Linux 操作系统:
1、systemctl disable firewalld --now # 关闭 firewalld
# 如果要保持启用 firewalld,默认情况下需要以下规则:
# firewall-cmd --permanent --add-port=6443/tcp #apiserver
# firewall-cmd --permanent --zone=trusted --add-source=10.42.0.0/16 #pods
# firewall-cmd --permanent --zone=trusted --add-source=10.43.0.0/16 #services
# firewall-cmd --reload
#
2、systemctl disable nm-cloud-setup.service nm-cloud-setup.timer && reboot # 禁用 nm-cloud-setup 并重新启动节点
Ubuntu 操作系统:
1、ufw disable # 关闭 ufw
# 如果要保持启用 ufw,默认情况下需要以下规则:
# ufw allow 6443/tcp #apiserver
# ufw allow from 10.42.0.0/16 to any #pods
# ufw allow from 10.43.0.0/16 to any #services
Raspberry Pi 操作系统:Raspberry Pi OS 基于 Debian,可能会受到旧 iptables 版本的影响
1、标准 Raspberry Pi OS 不会在启用 cgroups 的情况下开始。K3S 需要 cgroups 来启动 systemd 服务。你可以通过将 cgroup_memory=1 cgroup_enable=memory 附加到 /boot/cmdline.txt 来启用 cgroups
# cmdline.txt:
# console=serial0,115200 console=tty1 root=PARTUUID=58b06195-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait cgroup_memory=1 cgroup_enable=memory
2、sudo apt install linux-modules-extra-raspi # 从 Ubuntu 21.10 开始,对 Raspberry Pi 的 vxlan 支持已移至单独的内核模块中
网络条件
K3s Server 需要 6443 端口才能被所有节点访问
使用 Flannel VXLAN 时,节点需要能够通过 UDP 端口 8472 访问其他节点,
使用 Flannel Wireguard 后端时,节点需要能够通过 UDP 端口 51820 和 51821(使用 IPv6 时)访问其他节点。
该节点不应侦听任何其他端口。如果不使用 Flannel 并提供自己的自定义 CNI,那么 K3s 不需要 Flannel 所需的端口。
如果要使用 Metrics Server,所有节点必须可以在端口 10250 上相互访问
如果计划使用嵌入式 etcd 来实现高可用性,则 Server 节点必须可以在端口 2379 和 2380 上相互访问
大型集群对硬件的要求
对于硬件的要求取决于 K3s 集群的大小。对于生产和大型集群,我们建议使用具有外部数据库的高可用性设置
集群性能取决于数据库性能。为确保最佳速度,我们建议为 K3s 集群使用 SSD 磁盘。在云提供商上,你还需使用能获得最大 IOPS 的最小大小
考虑增加集群 CIDR 的子网大小,避免用尽 Pod 的 IP。你可以通过在启动时将 --cluster-cidr 选项传递给 K3s Server 来实现这一点
K3S 在线脚本安装
官网文档
当前搭建的是单节点,生产环境是需要做高可用的,高可用详情参考这边文章
Server安装
# K3s 提供了一个安装脚本,可以方便地将其作为服务安装在基于 systemd 或 openrc 的系统上
# curl -sfL https://get.k3s.io | sh -
# 中国用户,可以使用以下方法加速安装:
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -s - server \
--datastore-endpoint="mysql://lixing:LI1234MYSQL!@tcp(192.168.111.11:3306)/k3s"
运行此安装后:
1、K3s 服务将会作为一个systemd服务运行, 支持开机自启动 、奔溃自动重启
2、将自动安装以下程序到 /usr/local/bin,包括 crictl ctr k3s k3s-killall.sh k3s-uninstall.sh kubectl
3、自动创建 kubeconfig 文件到 /etc/rancher/k3s/k3s.yaml,由 K3s 安装的 kubectl 将会自动使用该文件
- 查看 K3S Server 运行状态
systemctl status k3s
- 关闭 K3S Server 服务
systemctl stop k3s
- 重启 K3S Server 服务
systemctl restart k3s
- 查看 TOKEN
cat /var/lib/rancher/k3s/server/node-token
K1079b8fffb160738d67d89c3755f0c2dcf043a966a373e2fc147d4475bbfe87424::server:54433a6f55b50c042f37350fd1551fbd
Agent安装
# 要安装其他 Agent 节点并将它们添加到集群
# curl -sfL https://get.k3s.io | K3S_URL=<https://myserver:6443> K3S_TOKEN=<mynodetoken> sh -
# 中国用户,可以使用以下方法加速安装:
# K3S_TOKEN 使用的值存储在 Server 节点上的 /var/lib/rancher/k3s/server/node-token 中
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn \
K3S_URL=https://192.168.111.50:6443 \
K3S_TOKEN=K104152af4547b9171e9d53fef1fcf12df8339e5bbfeec33aa0f4e98da1fa2869e7::server:ab66e6a096ddc3ea282de0dbd13f4cae \
sh -
K3S_URL 参数会导致安装程序将 K3s 配置为 Agent 而不是 Server:
1、K3s Agent 将注册到在 URL 上监听的 K3s Server
2、将自动安装以下程序到 /usr/local/bin,包括 crictl ctr k3s k3s-killall.sh k3s-uninstall.sh kubectl
- 查看 K3S agent 运行状态
systemctl status k3s-agent
- 关闭 K3S Server 服务
systemctl stop k3s-agent
- 重启 K3S Server 服务
systemctl restart k3s-agent
验证 K3S 安装
k3s kubectl get node
升级 K3S
官方地址
卸载 K3S
- 卸载 k3s
/usr/local/bin/k3s-uninstall.sh
- 卸载 k3s-agent
/usr/local/bin/k3s-agent-uninstall.sh
K3S 离线二进制安装
二进制文件下载地址
# 下载2文件:镜像文件(k3s-airgap-images-$ARCH.tar) 和 K3s执行文件(k3s-$ARCH)
mkdir -p /var/lib/rancher/k3s/agent/images/
cp ./k3s-airgap-images-$ARCH.tar /var/lib/rancher/k3s/agent/images
Server安装
INSTALL_K3S_SKIP_DOWNLOAD=true ./install.sh
Agent安装
INSTALL_K3S_SKIP_DOWNLOAD=true K3S_URL=https://<SERVER_IP>:6443 K3S_TOKEN=<YOUR_TOKEN> ./install.sh