k3s本质是轻量级kubernetes发行版,专为边缘和iot设计,512mb内存即可运行,无需docker、不依赖systemd,安装命令curl | sh封装了自动检测与部署逻辑。

直接装 k3s 就行,不用先装 Docker、不依赖 systemd、512MB 内存设备也能跑起来——这是它和标准 Kubernetes 最本质的区别。
为什么 k3s 安装命令里带 curl | sh?
因为 k3s 官方把安装逻辑封装成一个自解压脚本,自动检测系统类型(Ubuntu/CentOS/Alpine)、内核版本、cgroup 版本(v1/v2),然后下载二进制、生成默认配置、注册为服务。它不是“偷懒”,而是刻意避开包管理器的碎片化问题。
- 执行
curl -sfL https://get.k3s.io | sh -后,k3s二进制会落进/usr/local/bin/k3s,服务单元写在/etc/systemd/system/k3s.service - 如果系统没装
iptables或ip6tables,安装会失败;Alpine 用户需提前apk add iptables - 脚本默认启用
containerd,但不启动 Docker daemon —— 这是故意的,Docker 与k3s的 containerd 冲突
k3s 启动后怎么确认集群真就绪了?
别只看 systemctl status k3s 是 active,那只是进程活着。真正要验证的是控制平面 API 和本地 kubeconfig 是否可用。
-
kubectl get nodes必须返回Ready状态,且STATUS列不是NotReady或空 -
kubectl get pods -A中kube-system命名空间下所有 pod 的READY列应为1/1,尤其注意local-path-provisioner和coredns不能是0/1 - 默认 kubeconfig 在
/etc/rancher/k3s/k3s.yaml,用export KUBECONFIG=/etc/rancher/k3s/k3s.yaml后再试命令
边缘节点加不进去?重点查这三处
加节点本质是让新机器上的 k3s agent 连上已有 server 的 HTTPS endpoint 和 token。失败基本卡在这三个地方:
- token 文件路径不对:
/var/lib/rancher/k3s/server/node-token必须从 server 节点复制,不能手敲;内容含换行符,建议用cat直接输出,别用编辑器中转 - server 地址写成
https://127.0.0.1:6443—— agent 必须填 server 对外可访问的 IP 或域名,比如https://192.168.1.100:6443 - 防火墙没放开端口:server 节点必须开放
6443(kube-apiserver)和8472(flannel VXLAN),CentOS 用firewall-cmd --add-port=6443/tcp --permanent,Ubuntu 用ufw allow 6443
资源吃紧时哪些组件可以关?
k3s 默认开了一堆东西,但在 512MB 内存的树莓派或工业网关上,traefik、servicelb、local-storage 全部非必需,关掉能省 120MB+ 常驻内存。
- 禁用 ingress controller:
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="server --disable traefik" sh - - 禁用内置负载均衡:
--disable servicelb,改用 hostPort 或手动配 NodePort - 跳过默认存储类:
--disable local-storage,有 NFS 或外部 CSI 插件时才需要 - 这些
--disable参数只能在首次安装时加,重装前得先sudo /usr/local/bin/k3s-uninstall.sh
最常被忽略的是 cgroup 驱动兼容性:旧版 Ubuntu(如 18.04)默认用 cgroup v1,而新内核 + k3s v1.25+ 默认要求 v2。如果 k3s 日志里反复出现 failed to load cgroup parent,就得在 kernel cmdline 加 cgroup_enable=cpuset cgroup_enable=memory cgroup_memory=1 并重启。这不是配置问题,是内核启动参数没对齐。











