随着物联网、工业互联网的快速发展,边缘计算作为"靠近数据源头的计算架构",逐渐成为解决终端设备响应延迟、带宽占用过高、数据隐私保护等问题的核心方案。而 Kubernetes(K8s)作为容器编排领域的事实标准,因强大的自动化部署、扩缩容和运维能力,成为边缘计算场景下的理想选择。但传统 K8s 集群部署复杂、资源占用高,难以适配边缘节点(如物联网网关、工业控制器)的轻量化需求。
K3s 作为 Rancher 推出的轻量级 K8s 发行版,通过裁剪非核心组件、优化资源占用,完美解决了传统 K8s 在边缘场景的适配难题。本文将从核心概念入手,详细讲解 K3s 的部署流程、实战示例,并拓展边缘计算场景下的进阶应用,帮助读者快速掌握 K3s 部署与运维核心能力。
一、核心概念解析:边缘计算与 K3s 的适配逻辑
1.1 边缘计算的核心诉求
边缘计算的核心是将计算资源从云端下沉到靠近终端设备的"边缘节点",其核心诉求包括:
-
低延迟响应:终端设备(如工业传感器、自动驾驶车辆)需要毫秒级数据处理能力,避免云端传输的延迟损耗;
-
低资源占用:边缘节点多为嵌入式设备(如树莓派、ARM 架构网关),CPU、内存、存储资源有限;
-
高可靠性:支持离线运行,避免云端故障导致业务中断;
-
易部署运维:边缘节点分布分散,需要轻量化、自动化的部署和管理工具。
1.2 K3s 为何适配边缘计算?
K3s 是"经过认证的 Kubernetes 发行版",专为资源受限环境设计,其核心优势的:
-
轻量紧凑:二进制文件仅 60MB 左右,最低可运行在 1GB 内存、1 核 CPU 的设备上;
-
部署简单:单命令一键部署,自动集成容器运行时(containerd)、网络插件(flannel)等核心组件;
-
低依赖:无需外部 ETCD 集群(默认使用嵌入式 SQLite 数据库,支持 ETCD/PostgreSQL 集群化部署);
-
全兼容 K8s:支持标准 K8s API,现有 K8s 资源清单(YAML)可直接复用;
-
内置运维工具:集成 K3s 命令行工具(kubectl 功能内置)、日志收集、监控等功能。
1.3 K3s 核心组件精简逻辑
K3s 对传统 K8s 组件进行了针对性裁剪和优化:
-
移除非核心组件:如 Ingress Controller(默认集成 Traefik 轻量级网关,可禁用)、云服务商插件、CSI 存储插件(默认提供 local-path 本地存储);
-
简化组件实现:用 containerd 替代 Docker(默认集成,可切换),减少中间层开销;用嵌入式 SQLite 替代 ETCD(适用于单节点,集群化场景可替换);
-
组件集成化:将 kube-apiserver、kube-controller-manager、kube-scheduler、kube-proxy 等核心组件打包为单个进程,降低资源占用。
二、部署前置准备:环境要求与规划
2.1 环境要求
K3s 支持 x86_64、ARM64、ARMv7 等多种架构,边缘场景常见的设备(如树莓派 4B、Intel NUC、工业网关)均能适配,最低环境要求:
| 资源类型 | 最低配置 | 推荐配置(生产环境) |
|---|---|---|
| CPU | 1 核 | 2 核及以上 |
| 内存 | 1GB | 2GB 及以上 |
| 存储 | 10GB 可用空间 | 20GB SSD 及以上 |
| 操作系统 | Linux 发行版(CentOS 7+/Ubuntu 18.04+/Debian 10+) | 同最低配置,建议关闭 SELinux/AppArmor |
| 网络 | 节点间网络互通,支持 TCP/UDP 协议 | 稳定局域网,建议配置静态 IP |
2.2 部署规划
本文采用"单 Server 节点 + 多 Agent 节点"的集群架构(边缘场景最常用),规划如下:
| 节点角色 | IP 地址 | 架构 | 备注 |
|---|---|---|---|
| K3s Server(控制平面) | 192.168.1.100 | x86_64 | 管理集群资源,运行核心组件 |
| K3s Agent(工作节点) | 192.168.1.101 | ARM64(树莓派 4B) | 运行边缘业务容器 |
| K3s Agent(工作节点) | 192.168.1.102 | x86_64(工业网关) | 运行边缘业务容器 |
| 提示:单 Server 节点适用于小规模边缘场景(≤5 个 Agent 节点);若需高可用,可部署 3 个 Server 节点,使用外部 ETCD/PostgreSQL 数据库。 |
2.3 前置操作(所有节点)
部署前需在所有节点执行以下操作,避免权限、网络等问题:
bash
# 1. 关闭 SELinux(CentOS 系统,Ubuntu 可跳过)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
# 2. 关闭防火墙(边缘场景建议关闭,生产环境可按需配置规则)
sudo systemctl stop firewalld
sudo systemctl disable firewalld
# 3. 禁用 Swap(K8s 要求,避免内存交换影响性能)
sudo swapoff -a
sudo sed -i '/swap/s/^/#/' /etc/fstab
# 4. 配置主机名(每个节点主机名唯一)
# Server 节点
sudo hostnamectl set-hostname k3s-server
# Agent 节点 1
sudo hostnamectl set-hostname k3s-agent-1
# Agent 节点 2
sudo hostnamectl set-hostname k3s-agent-2
# 5. 配置 hosts 文件(实现节点间主机名解析)
sudo cat >> /etc/hosts << EOF
192.168.1.100 k3s-server
192.168.1.101 k3s-agent-1
192.168.1.102 k3s-agent-2
EOF
# 6. 安装依赖工具(curl、wget 等)
# CentOS
sudo yum install -y curl wget
# Ubuntu/Debian
sudo apt update && sudo apt install -y curl wget
三、K3s 核心部署步骤
3.1 单 Server 节点部署(控制平面)
K3s 提供官方一键部署脚本,默认集成 containerd、flannel、Traefik、local-path 等组件,部署命令如下:
bash
# 登录 Server 节点,执行部署命令
curl -sfL https://get.k3s.io | sh -
# 说明:
# 1. 脚本会自动下载 K3s 二进制文件,配置系统服务(k3s.service)
# 2. 默认使用嵌入式 SQLite 数据库,单节点部署无需额外配置
# 3. 自动生成 kubectl 配置文件:/etc/rancher/k3s/k3s.yaml
# 4. 自动创建集群令牌:/var/lib/rancher/k3s/server/node-token(用于 Agent 节点加入)
3.1.1 部署验证
bash
# 1. 检查 K3s 服务状态
sudo systemctl status k3s
# 正常输出应显示 "active (running)"
# 2. 查看集群节点状态(K3s 内置 kubectl 功能,可直接用 k3s kubectl 命令)
sudo k3s kubectl get nodes
# 输出示例(Server 节点为 Ready 状态):
# NAME STATUS ROLES AGE VERSION
# k3s-server Ready control-plane,master 1m v1.29.3+k3s1
# 3. 查看集群组件状态
sudo k3s kubectl get pods -A
# 输出示例(核心组件均为 Running 状态):
# NAMESPACE NAME READY STATUS RESTARTS AGE
# kube-system metrics-server-648b5df564-2z7xq 1/1 Running 0 1m
# kube-system local-path-provisioner-957fdf8bc-7x4pz 1/1 Running 0 1m
# kube-system coredns-597584b69d-2f9qf 1/1 Running 0 1m
# kube-system traefik-7cd4fcff68-8xqzk 1/1 Running 0 1m
# kube-system svclb-traefik-7c8b9f5d4d-4x7vq 2/2 Running 0 1m
3.1.2 自定义部署参数(可选)
若需自定义部署(如禁用 Traefik、指定 K3s 版本、修改数据目录),可通过环境变量或命令参数配置,示例:
bash
# 示例 1:禁用 Traefik(边缘场景无需网关时)
curl -sfL https://get.k3s.io | sh -s - --disable=traefik
# 示例 2:指定 K3s 版本(推荐使用稳定版,可在 https://github.com/k3s-io/k3s/releases 查看)
curl -sfL https://get.k3s.io | K3S_VERSION=v1.29.3+k3s1 sh -
# 示例 3:修改数据目录(默认 /var/lib/rancher/k3s,适用于存储分区挂载场景)
curl -sfL https://get.k3s.io | sh -s - --data-dir /data/k3s
# 示例 4:指定集群 CIDR(Pod 网络网段,避免与本地网络冲突)
curl -sfL https://get.k3s.io | sh -s - --cluster-cidr=10.42.0.0/16 --service-cidr=10.43.0.0/16
3.2 Agent 节点加入集群
Agent 节点需要通过 Server 节点的"集群令牌"加入集群,步骤如下:
3.2.1 获取 Server 节点的集群令牌
bash
# 登录 Server 节点,执行以下命令获取令牌
sudo cat /var/lib/rancher/k3s/server/node-token
# 输出示例(令牌字符串,后续需用到):
# K10e8f7d6c5b4a39281706f5e4d3c2b1a09876543210fedcba9876543210fedcba::server:1234567890abcdef1234567890abcdef
3.2.2 Agent 节点执行加入命令
bash
# 登录每个 Agent 节点,替换以下命令中的 <SERVER_IP> 和 <NODE_TOKEN>
curl -sfL https://get.k3s.io | K3S_URL=https://<SERVER_IP>:6443 K3S_TOKEN=<NODE_TOKEN> sh -
# 示例(替换为实际 Server IP 和令牌):
curl -sfL https://get.k3s.io | K3S_URL=https://192.168.1.100:6443 K3S_TOKEN=K10e8f7d6c5b4a39281706f5e4d3c2b1a09876543210fedcba9876543210fedcba::server:1234567890abcdef1234567890abcdef sh -
# 说明:
# 1. K3S_URL:Server 节点的 API 地址(默认端口 6443)
# 2. K3S_TOKEN:Server 节点的集群令牌
# 3. 脚本会自动配置 Agent 服务(k3s-agent.service),并连接 Server 节点
3.2.3 加入结果验证
bash
# 登录 Server 节点,查看所有节点状态
sudo k3s kubectl get nodes
# 输出示例(所有 Agent 节点均为 Ready 状态):
# NAME STATUS ROLES AGE VERSION
# k3s-server Ready control-plane,master 10m v1.29.3+k3s1
# k3s-agent-1 Ready <none> 2m v1.29.3+k3s1
# k3s-agent-2 Ready <none> 1m v1.29.3+k3s1
四、实战示例:部署边缘业务容器(Nginx 案例)
下面以部署 Nginx 服务为例,演示如何在 K3s 集群中部署边缘业务,包括资源清单编写、部署验证、服务访问等步骤。
4.1 编写 Nginx 部署清单(YAML)
K3s 完全兼容 K8s 资源清单,创建 nginx-deployment.yaml 文件,内容如下:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-edge # 部署名称
namespace: default # 命名空间(默认 default)
spec:
replicas: 2 # 副本数(2 个,分布在 Agent 节点)
selector:
matchLabels:
app: nginx-edge # 标签匹配(与下面 template.labels 一致)
template:
metadata:
labels:
app: nginx-edge
spec:
containers:
- name: nginx
image: nginx:alpine # 轻量级 Nginx 镜像(适合边缘场景)
ports:
- containerPort: 80 # 容器内部端口
resources:
limits: # 资源限制(边缘节点资源有限,需合理配置)
cpu: "500m" # 最大 CPU 占用 0.5 核
memory: "256Mi" # 最大内存占用 256MB
requests: # 资源请求(调度时参考)
cpu: "200m"
memory: "128Mi"
volumeMounts:
- name: nginx-html # 挂载本地存储(边缘场景常用)
mountPath: /usr/share/nginx/html
volumes:
- name: nginx-html
persistentVolumeClaim:
claimName: nginx-html-pvc # 关联 PVC(下面创建)
---
# 创建 PVC(持久化存储,使用 K3s 默认的 local-path 存储类)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nginx-html-pvc
namespace: default
spec:
accessModes:
- ReadWriteOnce # 读写权限(仅单个节点挂载)
resources:
requests:
storage: 1Gi # 存储大小 1GB
storageClassName: local-path # K3s 默认存储类
---
# 创建 Service(暴露 Nginx 服务,ClusterIP 类型,集群内部访问)
apiVersion: v1
kind: Service
metadata:
name: nginx-edge-svc
namespace: default
spec:
selector:
app: nginx-edge
ports:
- port: 80 # Service 端口
targetPort: 80 # 目标容器端口
type: ClusterIP
4.2 部署 Nginx 服务
bash
# 登录 Server 节点,执行部署命令
sudo k3s kubectl apply -f nginx-edge-deployment.yaml
# 查看部署状态
sudo k3s kubectl get deployments
# 输出示例(READY 2/2 表示部署成功):
# NAME READY UP-TO-DATE AVAILABLE AGE
# nginx-edge 2/2 2 2 30s
# 查看 Pod 状态(-o wide 显示运行节点)
sudo k3s kubectl get pods -o wide
# 输出示例(2 个 Pod 分布在不同 Agent 节点):
# NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
# nginx-edge-7f96548d6c-2xqzk 1/1 Running 0 1m 10.42.1.2 k3s-agent-1 <none> <none>
# nginx-edge-7f96548d6c-5p7vq 1/1 Running 0 1m 10.42.2.2 k3s-agent-2 <none> <none>
# 查看 PVC 状态(确认存储挂载成功)
sudo k3s kubectl get pvc
# 输出示例(STATUS 为 Bound 表示绑定成功):
# NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
# nginx-html-pvc Bound pvc-12345678-1234-5678-90ab-cdef12345678 1Gi RWO local-path 2m
4.3 验证服务访问
bash
# 1. 查看 Service 信息(获取 ClusterIP)
sudo k3s kubectl get svc
# 输出示例:
# NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
# kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 15m
# nginx-edge-svc ClusterIP 10.43.123.45 <none> 80/TCP 5m
# 2. 在集群内访问 Nginx 服务(以 Server 节点为例)
curl 10.43.123.45
# 输出示例(Nginx 默认页面内容):
# <!DOCTYPE html>
# <html>
# <head>
# <title>Welcome to nginx!</title>
# ...
# </body>
# </html>
# 3. 边缘场景拓展:若需外部访问(如边缘网关访问),可修改 Service 为 NodePort 类型
# 编辑 Service 配置
sudo k3s kubectl edit svc nginx-edge-svc
# 将 type: ClusterIP 改为 type: NodePort,保存退出
# 查看修改后的 Service(获取 NodePort 端口,如 30xxx)
sudo k3s kubectl get svc
# 输出示例:
# NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
# nginx-edge-svc NodePort 10.43.123.45 <none> 80:30123/TCP 8m
# 外部访问(通过任意 Agent 节点 IP + NodePort 端口)
curl 192.168.1.101:30123
# 同样可获取 Nginx 默认页面
五、进阶拓展:边缘计算场景下的 K3s 优化与集成
5.1 高可用部署(HA)方案
单 Server 节点存在单点故障风险,生产级边缘场景可部署 3 个 Server 节点(高可用控制平面),并使用外部数据库(如 PostgreSQL)替代嵌入式 SQLite:
bash
# 1. 部署 PostgreSQL 数据库(自行部署或使用云数据库,需创建 k3s 数据库和用户)
# 示例:创建数据库和用户(PostgreSQL 命令行)
CREATE DATABASE k3s;
CREATE USER k3s WITH ENCRYPTED PASSWORD 'k3s@123';
GRANT ALL PRIVILEGES ON DATABASE k3s TO k3s;
# 2. 部署第一个 Server 节点(指定外部数据库)
curl -sfL https://get.k3s.io | sh -s - \
--datastore-endpoint "postgres://k3s:k3s@123@192.168.1.200:5432/k3s" \
--disable=traefik \
--cluster-init
# 3. 部署另外 2 个 Server 节点(加入高可用集群)
curl -sfL https://get.k3s.io | sh -s - \
--datastore-endpoint "postgres://k3s:k3s@123@192.168.1.200:5432/k3s" \
--disable=traefik \
--server https://192.168.1.100:6443 \
--token <第一个 Server 节点的令牌>
5.2 边缘场景资源优化
针对边缘节点资源有限的特点,可通过以下方式优化 K3s 资源占用:
-
禁用不必要组件:如 Traefik、metrics-server(通过 --disable=traefik,metrics-server 部署);
-
限制组件资源 :修改 K3s 服务配置,为 kube-apiserver、kube-controller-manager 等组件添加资源限制;
`# 编辑 K3s 服务配置
sudo vi /etc/systemd/system/k3s.service
在 ExecStart 后添加资源限制参数
ExecStart=/usr/local/bin/k3s server --kube-apiserver-arg=runtime-config=api/all=true --kube-apiserver-arg=requestheader-allowed-names=front-proxy-client --kube-apiserver-arg=requestheader-group-headers=X-Remote-Group --kube-apiserver-arg=requestheader-extra-headers-prefix=X-Remote-Extra- --kube-apiserver-arg=requestheader-user-headers=X-Remote-User --kube-apiserver-arg=service-account-signing-key-file=/var/lib/rancher/k3s/server/tls/service-account.key --kube-apiserver-arg=service-account-key-file=/var/lib/rancher/k3s/server/tls/service-account.pub --kube-apiserver-arg=service-account-issuer=https://kubernetes.default.svc.cluster.local --kube-apiserver-arg=authorization-mode=Node,RBAC --kube-controller-manager-arg=cluster-signing-key-file=/var/lib/rancher/k3s/server/tls/ca.key --kube-controller-manager-arg=leader-elect=false --kube-scheduler-arg=leader-elect=false --kube-proxy-arg=metrics-bind-address=0.0.0.0:10249 --kubelet-arg=node-ip=192.168.1.100 --kubelet-arg=eviction-hard=imagefs.available<15%,memory.available<100Mi --kubelet-arg=eviction-soft=imagefs.available<20%,memory.available<200Mi --kubelet-arg=eviction-soft-grace-period=imagefs.available=2m,memory.available=2m --kubelet-arg=eviction-max-pod-grace-period=30
重启 K3s 服务
sudo systemctl daemon-reload
sudo systemctl restart k3s`
-
使用轻量级镜像:业务容器优先使用 alpine、slim 等轻量级基础镜像,减少内存和存储占用;
-
配置 Pod 优先级:为核心边缘业务设置高优先级,避免资源竞争时被驱逐。
5.3 边缘计算平台集成
K3s 可与主流边缘计算平台集成,实现更全面的边缘管理能力:
-
Rancher 管理:通过 Rancher 平台统一管理多个 K3s 边缘集群,支持可视化运维、升级、监控;
-
EdgeX Foundry 集成:EdgeX Foundry 是边缘计算设备管理平台,可与 K3s 集成,实现设备数据采集、处理与业务容器的联动;
-
监控告警集成:部署 Prometheus + Grafana 轻量级监控套件,监控边缘节点资源和业务容器状态,配置离线告警(如通过本地邮件、短信网关)。
5.4 安全配置最佳实践
边缘节点分布分散,安全风险较高,建议配置以下安全措施:
-
启用 TLS 加密:K3s 默认启用组件间 TLS 加密,可定期更新证书(通过 k3s certificate rotate 命令);
-
配置网络策略:使用 NetworkPolicy 限制 Pod 间通信,避免恶意访问;
-
权限控制:为运维人员创建最小权限的 ServiceAccount,避免使用管理员权限;
-
镜像安全:使用私有镜像仓库,禁止拉取未知镜像;配置镜像签名验证,确保镜像完整性。
六、常见问题与排查
6.1 Agent 节点无法加入集群
-
检查 Server 节点 IP 和端口是否可达:
telnet 192.168.1.100 6443; -
验证集群令牌是否正确:重新获取 Server 节点的 token,确认加入命令中的令牌无误;
-
检查防火墙规则:确保 Server 节点开放 6443(API)、8472(flannel VXLAN)端口。
6.2 Pod 无法调度到 Agent 节点
-
检查节点状态:
sudo k3s kubectl get nodes,确保节点为 Ready 状态; -
检查节点污点:若节点存在污点(Taint),可能导致 Pod 无法调度,执行
sudo k3s kubectl describe node <节点名>查看,必要时删除污点:sudo k3s kubectl taint nodes <节点名> <污点键>:NoSchedule-; -
检查资源限制:确认节点资源是否满足 Pod 的 resources.requests 配置。
6.3 本地存储挂载失败
-
检查 local-path 存储类是否存在:
sudo k3s kubectl get sc,默认应存在 local-path 存储类; -
查看 PVC 事件:
sudo k3s kubectl describe pvc <PVC 名称>,根据事件信息排查(如存储目录权限问题); -
确认节点存储目录可用:K3s 本地存储默认使用 /var/lib/rancher/k3s/storage,检查该目录是否有足够空间和权限。
七、总结
K3s 作为轻量级 K8s 发行版,以其部署简单、资源占用低、全兼容 K8s 的优势,成为边缘计算场景的理想容器编排方案。本文从核心概念出发,详细讲解了 K3s 集群的部署流程、实战案例,并拓展了高可用部署、资源优化、平台集成等进阶内容,帮助读者快速落地边缘计算场景下的 K3s 部署与运维。
随着边缘计算的不断发展,K3s 还将持续优化边缘场景的适配能力。未来,结合边缘AI、边缘存储等技术,K3s 有望在工业互联网、智能物联网、自动驾驶等领域发挥更大的价值。建议读者在实际部署中,根据边缘节点的硬件配置和业务需求,灵活调整部署参数和资源配置,确保集群稳定高效运行。