两台电脑建立K3s服务器的核心思路是:一台机器做中控节点(Server),另一台做工作节点(Agent),通过K3s内置的轻量级网络组件插上即用,整个过程大约20分钟就能跑通。
为什么两台电脑更适合用K3s而不是K8s
行业共识认为,原生Kubernetes集群最低配置通常需要三台机器,且内存资源要求较高,两台电脑组集群时,K3s的轻量架构优势就比较明显了。
K3s是经过CNCF认证的Kubernetes发行版,把etcd、API Server、Scheduler等组件打包进一个二进制文件,安装包只有几十兆,内存占用相当大幅度降低,两台电脑跑K3s,建k3服务器时资源分配压力比原生K8s小很多,这一点在低配笔记本或老旧台式机上差异尤其明显。
两台电脑建立K3s服务器,工作原理上采用单Server节点加一个Agent节点的拓扑,控制面与数据面分离部署,这也是K3s双节点集群最常见的部署形态,另一台机器出现故障时,集群的调度能力会受限,但已运行的工作负载不会立刻中断。
两台电脑搭建K3s集群前的硬件与系统准备
动手前先把两台机器的身份理清楚:
- 机器A:安装Server组件,管控整个集群,需要固定内网IP
- 机器B:安装Agent组件,承担实际工作负载,IP可动态获取但建议也固定
K3s server节点的最低配置通常认为1核CPU、512MB内存即可运行,实际体验下来,配置在2核2GB以上的机器做中控节点会更顺畅,Agent节点需要视工作负载而定,跑容器多的那台尽量给足内存,K3s服务器需要多大内存这个问题没有固定答案,两台机器合计内存4GB以上属于常规操作区间,低于这个值跑轻量应用也能跑,只是容器密度要控制。
操作系统方面,64位Linux(Ubuntu、Debian、CentOS、openEuler等)支持最完善,两台机器均需开放特定端口:
| 节点类型 | 需要放行的端口 | 用途 |
|---|---|---|
| Server | 6443(Kubernetes API)、8472(Flannel VXLAN)、10250(kubelet) | 控制面通信、容器网络、节点管理 |
| Agent | 8472、10250 | 容器网络、节点管理 |
需要留意的是,如果两台电脑跨网段组集群,路由器需支持UDP广播转发,否则Flannel网络模式下节点间通信会异常,同网段组网则没有这个顾虑,这也是组k3集群前最值得优先确认的环境因素。
两台电脑建立K3s集群实操步骤:中控节点安装
先在中控机器A上操作,使用官方安装脚本,指定节点角色并禁用自带Traefik(后续可自定义Ingress):
curl -sfL https://get.k3s.io | sh -s - server --disable=traefik --write-kubeconfig-mode=644
--write-kubeconfig-mode=644是为了让普通用户能读取kubeconfig文件,方便后续用kubectl控制集群。
安装完成后,记录中控节点的Token,Agent节点加入时需要用到:
sudo cat /var/lib/rancher/k3s/server/node-token
验证Server节点状态:
sudo k3s kubectl get nodes
看到STATUS列为Ready即说明中控节点就绪,此时执行集群配置检查,确认kube-system命名空间中各Pod均处于Running状态:
sudo k3s kubectl get pods -A
如果某个Pod处于ContainerCreating状态,多半是镜像拉取中断或网络策略问题,可稍等几十秒再查看。
Agent工作节点的加入与配置
在工作节点机器B上执行:
curl -sfL https://get.k3s.io | K3S_URL=https://中控节点IP:6443 K3S_TOKEN=中控节点Token sh -
这里的K3S_URL必须填写机器A的内网IP,不能填localhost或外网IP,否则Agent进程无法定位到中控节点。K3S_TOKEN就是上一个步骤里获取的那段字符串。
安装完成后,回到中控节点执行:
sudo k3s kubectl get nodes
此时应该能看到两台机器都在线,ROLES列区分CONTROL-PLANE和<none>,STATUS都为Ready,若Agent状态一直NotReady,优先排查两台机器的8472端口连通性:
nc -uv 中控节点IP 8472
业内专家指出,K3s双节点集群的排障思路与原生K8s基本一致,先查节点状态,再查Pod事件,最后看网络插件日志,按顺序排查效率最高。
部署测试应用验证集群可用
集群状态Ready后,部署一个简单的Nginx应用来做验证:
# test-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-test
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
应用这份文件:
sudo k3s kubectl apply -f test-deploy.yaml
观察Pod是否在两个节点上各运行一个:
sudo k3s kubectl get pods -o wide
NODE列显示两个不同主机名,说明调度器正确的把Pod分散到两台电脑上了,用两层网络验证集群内部通信:
sudo k3s kubectl expose deployment nginx-test --type=NodePort --port=80 --name=nginx-service sudo k3s kubectl get svc nginx-service
访问中控节点的NodePort端口,浏览器能打开Nginx欢迎页,集群网络路径就基本确认畅通了。
内网环境下两台电脑K3s集群的离线安装方案
完全无外网的内网环境里安装,官方脚本方式不可用,团队内部源码交付、政企内网部署K3s的场景下,多数采用离线安装包的方式,这也是K3s双节点集群离线搭建时的主流做法。
在有网的一台电脑上,先下载K3s二进制文件和安装脚本,再从https://github.com/k3s-io/k3s/releases获取对应版本的k3s-airgap-images-amd64.tar镜像包,将这些文件拷贝到两台机器上后,执行:
sudo mkdir -p /var/lib/rancher/k3s/agent/images/ sudo cp k3s-airgap-images-amd64.tar /var/lib/rancher/k3s/agent/images/ sudo chmod +x k3s sudo cp k3s /usr/local/bin/ sudo INSTALL_K3S_SKIP_DOWNLOAD=true ./install.sh
Server和Agent安装时都加上INSTALL_K3S_SKIP_DOWNLOAD=true参数,脚本会跳过从外网下载的步骤,直接使用本地文件,离线方式下,--disable=traefik参数的用法保持一致,存储类和默认配置与在线安装完全一致。
两台电脑建立K3s集群时,Agent节点的镜像加载方式与Server节点一致,都需要将airgap镜像包放入对应目录。
双节点K3s集群的局限与可扩展方向
两台电脑的K3s集群作为学习环境或轻量生产环境是够用的,但有一个明显短板:中控节点是单点,一旦宕机,整个集群的控制面就失去响应,若后续需要高可用,可以升级为三节点或更多节点的K3s集群,数据存储模式上选用内置etcd或外部数据库,但需要额外增加一台中控节点。
集群存储默认使用local-path,即数据落在各节点本地磁盘,两台电脑组K3s集群时,如果关心数据在节点迁移时的持久性,建议预留一块独立的存储路径,或提前规划好PV与PVC的绑定关系。
K3s节点认证信息管理
中控节点的/etc/rancher/k3s/config.yaml文件可以预设一些常用参数,
token: "自定义的集群密钥" node-ip: "中控节点内网IP" flannel-iface: "内网网卡名"
设置flannel-iface在多网卡机器上尤为重要,它能让Flannel确定走哪块网卡,避免VXLAN流量错误穿透到外部网络。
常见问题与排查建议
两台电脑建立K3s服务器时,Agent节点一直NotReady是什么原因?
先看Agent节点k3s-agent的日志,重点检查与Server节点的6443端口通信和8472端口隧道建立,端口不通是常见现象,大多情况下是两台机器位于不同网段,且网络设备未开启VXLAN相关转发,同一网段下检查防火墙规则,放行所需端口后重启agent服务即可。
双节点下Pod一直Pending无法调度?
用kubectl describe pod查看事件,如果提示节点资源不足,说明内存请求超过可分配值,两台电脑组建K3s集群前应提前评估负载,或在Deployment的resources字段缩小请求量。
K3s双节点能不能实现滚动更新?
可以,K3s本身是完整的K8s发行版,Deployment的滚动更新策略完整支持,多副本运行情况下,更新过程会逐个替换Pod,不会同时中断所有服务,单副本情况下更新会有短暂的服务中断,这是由单副本特性决定的,而非K3s的限制。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/743463.html





