边缘计算:K3s 轻量级 K8s 部署实践

随着物联网、工业互联网的快速发展,边缘计算作为"靠近数据源头的计算架构",逐渐成为解决终端设备响应延迟、带宽占用过高、数据隐私保护等问题的核心方案。而 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 有望在工业互联网、智能物联网、自动驾驶等领域发挥更大的价值。建议读者在实际部署中,根据边缘节点的硬件配置和业务需求,灵活调整部署参数和资源配置,确保集群稳定高效运行。

相关推荐
武子康2 小时前
Java-196 消息队列选型:RabbitMQ vs RocketMQ vs Kafka
java·分布式·kafka·rabbitmq·rocketmq·java-rocketmq·java-rabbitmq
m0_740043732 小时前
SpringBoot02-SpringMVC入门
java·开发语言·spring boot·spring·mvc
Seven972 小时前
字符串匹配算法
java
古城小栈2 小时前
Go 语言 ARM64 架构优化:边缘计算场景适配
架构·golang·边缘计算
ss2732 小时前
阻塞队列:生产者-消费者模式
java·开发语言
艾莉丝努力练剑2 小时前
【Linux进程(一)】深入理解计算机系统核心:从冯·诺依曼体系结构到操作系统(OS)
java·linux·运维·服务器·git·编辑器·操作系统核心
guslegend2 小时前
SpringBoot 缓存深入
java
古城小栈2 小时前
2025 Go 语言生态:从云原生到边缘计算
云原生·golang·边缘计算
q_30238195562 小时前
Atlas200赋能水稻病虫害精准识别:AI+边缘计算守护粮食安全
人工智能·边缘计算