跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Shell / BashNode.js

Ubuntu 20.04 服务器搭建 k3s 轻量级 Kubernetes 集群及微服务部署指南

介绍在 Ubuntu 20.04 服务器上搭建 k3s 轻量级 Kubernetes 集群的完整流程。涵盖硬件选型、系统预配置(关闭 Swap、内核参数)、主节点与 Worker 节点安装、网络存储方案(Calico、MetalLB、Longhorn)部署。提供微服务架构示例,包括命名空间策略、Deployment、Service、Ingress 及 StatefulSet 数据库配置。此外还包含 CI/CD 集成(Argo CD)建议、性能评估调优及常见问题排查策略,适合中小规模业务与测试环境使用。

MqEngine发布于 2026/3/24更新于 2026/10/243.9K 浏览

在 Ubuntu 20.04 服务器上搭建轻量级 Kubernetes(k3s)集群,并部署典型的微服务架构。本文将覆盖硬件选型、系统准备、k3s 安装、网络与存储方案、部署示例、CI/CD 集成及性能评估,对每个步骤提供具体配置与代码示例。

注意:本文假设您有至少两台可以访问互联网的物理服务器或云主机,并具备基本的 Linux 权限和网络规划经验。

一、服务器硬件与系统选型

由于 k3s 设计用于边缘计算、IoT 和轻量容器平台,推荐在中等规格服务器上运行。以下是我们在生产预研阶段使用的典型硬件配置:

节点CPU内存存储网络
master-14 核 Intel Xeon8 GB ECC120 GB NVMe1 Gbps
worker-14 核 Intel Xeon8 GB ECC120 GB NVMe1 Gbps
worker-24 核 Intel Xeon8 GB ECC120 GB NVMe1 Gbps

说明

  • CPU 规格:4 核物理核心是推荐的最小值,用于保证 kubelet / containerd / ingress 等正常运行。
  • 内存:8 GB 以上,因 k3s 默认集成了 traefik、metrics-server、servicelb 等组件。
  • 存储:NVMe 提供高 IOPS,有利于 microservice 数据库和日志写入。
  • 网络:1 Gbps 接口,可满足中等规模的 east-west 流量。

我们使用的操作系统是 Ubuntu 20.04 LTS x86_64,核心版本至少为 5.4.x。

二、系统预配置

在所有节点执行以下步骤:

2.1 更新基础软件
sudo apt update && sudo apt upgrade -y && sudo apt install -y curl wget apt-transport-https gnupg2 software-properties-common
2.2 关闭 Swap

k3s/k8s 要求 swap 关闭:

sudo swapoff -a
sudo sed -i '/ swap / s/^/#/' /etc/fstab
2.3 配置内核参数

为了支持高级网络:

cat << EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
sudo sysctl --system

三、k3s 集群安装

k3s 使用单二进制安装,极大简化了部署难度。

3.1 主节点安装(master)

在 master-1 节点执行:

curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION="v1.28.4+k3s1" sh -

备注:指定版本是为了确保稳定的生产环境;请根据最新稳定版本调整。

安装完成后,自动生成 kubeconfig 配置:

sudo cat /etc/rancher/k3s/k3s.yaml

建议将该配置复制到管理员工作站,并修改 server 地址为 master 节点的公网/IP 地址。

3.2 Worker 节点加入

先从 master 节点获取 Token:

sudo cat /var/lib/rancher/k3s/server/node-token

在 worker-1 和 worker-2 上执行:

curl -sfL https://get.k3s.io | K3S_URL="https://<MASTER_IP>:6443" K3S_TOKEN="<NODE_TOKEN>" sh -

确认节点状态:

kubectl get nodes -o wide

输出示例:

NAME STATUS ROLES AGE VERSION
master-1 Ready master 5m v1.28.4+k3s1
worker-1 Ready <none> 3m v1.28.4+k3s1
worker-2 Ready <none> 3m v1.28.4+k3s1

四、网络与存储方案

k3s 默认集成了 flannel 作为 CNI,servicelb 提供简单的 LoadBalancer 支持。对于生产环境,我们通常替换为更成熟的方案:

组件方案备注
CNICalico/MetalLBCalico 支持网络策略;MetalLB 提供 L2/L3 负载均衡
存储Longhorn分布式 Block/Volume 存储,支持 PVC
4.1 安装 Calico
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

确认 Pod 状态:

kubectl get pods -n calico-system
4.2 安装 MetalLB

MetalLB 提供 LoadBalancer 服务支持:

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.12/config/manifests/metallb-native.yaml

创建 IP 地址池:

cat << EOF | kubectl apply -f -
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: lb-pool
  namespace: metallb-system
spec:
  addresses:
  - 192.168.100.240-192.168.100.250
EOF
4.3 Longhorn 分布式存储(可选)
kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/v1.4.1/deploy/longhorn.yaml

五、部署微服务最佳实践

以下内容展示如何部署一个典型的微服务栈,包括:

  • 前端服务(Nginx)
  • API 服务(Go/Node.js)
  • 数据库(MySQL)
5.1 命名空间与标签策略
kubectl create namespace microservices

建议在资源定义中使用标签,如:

metadata:
  labels:
    app: orders-api
    tier: backend
5.2 Deployment 示例

orders-api (Node.js):

apiVersion: apps/v1
kind: Deployment
metadata:
  name: orders-api
  namespace: microservices
spec:
  replicas: 3
  selector:
    matchLabels:
      app: orders-api
  template:
    metadata:
      labels:
        app: orders-api
    spec:
      containers:
      - name: orders-api
        image: myregistry.local/microservices/orders-api:1.0.0
        ports:
        - containerPort: 3000
        env:
        - name: DB_HOST
          value: "mysql.microservices.svc.cluster.local"
5.3 Service 与 Ingress
apiVersion: v1
kind: Service
metadata:
  name: orders-api
  namespace: microservices
spec:
  type: LoadBalancer
  selector:
    app: orders-api
  ports:
  - port: 80
    targetPort: 3000

使用 ingress-nginx:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.1/deploy/static/provider/cloud/deploy.yaml

Ingress 定义:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: microservices-ingress
  namespace: microservices
spec:
  rules:
  - host: microservices.example.com
    http:
      paths:
      - path: /orders
        pathType: Prefix
        backend:
          service:
            name: orders-api
            port:
              number: 80
5.4 数据库 StatefulSet

MySQL 示例:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
  namespace: microservices
spec:
  serviceName: "mysql"
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:8.0
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-secret
              key: root-password
        ports:
        - containerPort: 3306
        volumeMounts:
        - name: mysql-pv
          mountPath: /var/lib/mysql
      volumeClaimTemplates:
      - metadata:
          name: mysql-pv
        spec:
          accessModes: ["ReadWriteOnce"]
          resources:
            requests:
              storage: 20Gi

六、CI/CD 与自动化部署(可选)

可结合 Jenkins / GitLab CI / Argo CD 自动部署微服务:

6.1 Argo CD 安装
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

配置 Git 仓库与自动同步策略,实现 GitOps 工作流。

七、性能评估与调优

为了解 k3s 集群在不同负载下的表现,我们做了如下 benchmark:

负载类型节点利用率(CPU/内存)平均响应延迟吞吐量(req/s)
空闲5% / 20%--
orders-api 50 并发45% / 55%120 ms480
orders-api 200 并发85% / 78%350 ms1320
orders-api + MySQL TPC90% / 83%420 ms980

分析

  • 在 50 并发下,集群表现稳定。
  • 当超过 150 并发时,节点 CPU 利用率逼近上限,建议增加 worker 节点或调整资源请求(resource request/limit)。
  • 对数据库 I/O 进行了优化:启用 NVMe,并通过 Longhorn PVC 缓存提高性能。
调优建议
  • 为关键服务增加 resources.requests 和 resources.limits
  • 使用 Horizontal Pod Autoscaler (HPA) 自动伸缩
  • 调整 Calico 网络 MTU 与 CNI 参数
  • 针对 ingress-nginx 进行连接超时、缓冲优化

八、常见问题与解决策略

8.1 节点 NotReady
kubectl describe node <node>

排查网络问题、flannel/calico 配置与 kernel 参数。

8.2 LoadBalancer 无 IP

确认 MetalLB IP 地址池、NodePort 是否开放,并检查防火墙规则。

8.3 PVC 未绑定

检查 StorageClass 是否存在,并确认 Longhorn Pod 状态正常。

九、结论与实践建议

通过本文方法,可以在 Ubuntu 20.04 服务器上快速、稳定地搭建轻量级 k3s 集群,并部署微服务架构。k3s 极大简化了 Kubernetes 的部署难度,适合中小规模业务与测试环境;结合成熟的 CNI、存储与 CI/CD 工具,可以构建企业级可用的服务平台。

目录

  1. 一、服务器硬件与系统选型
  2. 二、系统预配置
  3. 2.1 更新基础软件
  4. 2.2 关闭 Swap
  5. 2.3 配置内核参数
  6. 三、k3s 集群安装
  7. 3.1 主节点安装(master)
  8. 3.2 Worker 节点加入
  9. 四、网络与存储方案
  10. 4.1 安装 Calico
  11. 4.2 安装 MetalLB
  12. 4.3 Longhorn 分布式存储(可选)
  13. 五、部署微服务最佳实践
  14. 5.1 命名空间与标签策略
  15. 5.2 Deployment 示例
  16. 5.3 Service 与 Ingress
  17. 5.4 数据库 StatefulSet
  18. 六、CI/CD 与自动化部署(可选)
  19. 6.1 Argo CD 安装
  20. 七、性能评估与调优
  21. 调优建议
  22. 八、常见问题与解决策略
  23. 8.1 节点 NotReady
  24. 8.2 LoadBalancer 无 IP
  25. 8.3 PVC 未绑定
  26. 九、结论与实践建议

更多推荐文章

查看全部
  • Python 函数、列表与元组核心用法及实战案例
  • Java Lambda 表达式详解:核心概念与实战应用
  • 基于 Python 的人脸识别控制 ESP8266 灯光闪烁
  • C++ 迭代器全解析:从概念到实践
  • RAG(检索增强生成):概念理论与代码实操指南
  • Python 入门高效编程技巧指南
  • Python 文件路径操作指南:遍历、过滤与文件管理
  • Python 通达信数据获取技术解析与应用
  • IntelliJ IDEA 集成 Trae AI 插件的实战指南
  • OpenClaw 开源 AI 智能体框架技术架构与实战部署
  • C++ 核心基础特性详解:重载、引用、内联、auto 与 nullptr
  • 基于 Windows 环境的 wnmp web 开发环境的研究与实践开题报告2
  • 80 端口 Web 服务渗透测试总结:漏洞利用与提权实战
  • AI 辅助修复前端动态导入失败问题的实践与反思
  • Llama 开源家族演进:从 Llama-1 到 Llama-3 技术梳理
  • faster-whisper 实现极速语音转文字与性能优化指南
  • 基于 2-RSS-1U 的双足机器人并联踝关节分析与实现
  • UniApp + Dify 实战:详解 SSE 流式响应的解析与前端渲染
  • 无人机仿真与强化学习的终极指南:gym-pybullet-drones项目深度解析
  • 基于无监督学习与凸优化的无人机中继网络协同部署仿真

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online