跳到主要内容
极客日志极客日志面向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/7/213.8K 浏览

在 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. 九、结论与实践建议
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 神经网络核心原理与入门指南
  • 基于 LangChain 和 ChatGPT 构建 PDF 问答机器人
  • C++ unordered 系列容器使用与模拟实现
  • OpenClaw 多端交互实测指南:Web、TUI 与钉钉集成详解
  • 蚂蚁金服 AIGC 产品经理面试经验与复盘
  • Android 自定义视图复刻 Apple 心率图表实现
  • 高鋒集團與 Web3Labs:以資本與生態賦能傳統企業 Web3 轉型
  • ROS1 机器人 SLAM 系列(四):Gmapping 算法详解与实战
  • 为什么 AI 圈会有这么多带'Llama'的产品?
  • Cardinal:macOS 极简本地文件检索工具深度解析
  • Go 语言 Ebiten 坦克大战实现
  • Vue3 + Spring Boot 文件下载异常错误友好提示处理
  • 无人机如何通过视觉闭环实现精准空投
  • 利用 AI 快速生成《无尽冬日》游戏自动化脚本
  • Windows 11 环境下使用 llama.cpp 测试 Qwen3.5 量化模型
  • Pandas 类型检查函数与 Index 类用法详解
  • GitNexus 核心引擎:架构、流程与优化实践
  • C++ 的引用、inline 和 nullptr:怎么用才对
  • Kafka 核心架构与分布式存储深度解析
  • 贪心算法核心解析:局部最优与全局策略
  • 相关免费在线工具

    • 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