如何在 Ubuntu 20.04 系统的服务器上用k3s实现轻量级 Kubernetes 集群并部署微服务最佳实践

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

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

一、香港服务器www.a5idc.com硬件与系统选型

由于 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 更新基础软件

sudoapt update &&sudoapt upgrade -y sudoaptinstall -y curlwget apt-transport-https gnupg2 software-properties-common 

2.2 关闭 Swap

k3s/k8s 要求 swap 关闭:

sudo swapoff -a sudosed -i '/ swap / s/^/#/' /etc/fstab 

2.3 配置内核参数

为了支持高级网络:

cat<<EOF|sudotee /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 EOFsudo sysctl --system 

三、k3s 集群安装

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

3.1 主节点安装(master)

在 master-1 节点执行:

curl -sfL https://get.k3s.io |INSTALL_K3S_VERSION="v1.28.4+k3s1"sh - 
备注:指定版本是为了确保稳定的生产环境;请根据最新稳定版本调整。

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

sudocat /etc/rancher/k3s/k3s.yaml 

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

3.2 Worker 节点加入

先从 master 节点获取 Token:

sudocat /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:3selector: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:3000env:-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:80targetPort: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:1selector:matchLabels:app: mysql template:metadata:labels:app: mysql spec:containers:-name: mysql image: mysql:8.0env:-name: MYSQL_ROOT_PASSWORD valueFrom:secretKeyRef:name: mysql-secret key: root-password ports:-containerPort:3306volumeMounts:-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.requestsresources.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 状态正常。


九、结论与实践建议

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

如果需要支持更大规模或多集群管理,可以考虑 Rancher 进一步增强运维能力。

Read more

C语言Web开发:CGI、FastCGI、Nginx深度解析

C语言Web开发:CGI、FastCGI、Nginx深度解析

C语言Web开发:CGI、FastCGI、Nginx深度解析 一、前言:为什么Web开发是C语言开发的重要技能? 学习目标 * 理解Web开发的本质:编写程序实现Web应用、服务器端逻辑和客户端交互 * 明确Web开发的重要性:支撑互联网、电子商务、社交网络等领域的发展 * 掌握本章学习重点:CGI、FastCGI、Nginx的开发方法、避坑指南、实战案例分析 * 学会使用C语言开发Web应用,实现服务器端逻辑和客户端交互 重点提示 💡 Web开发是C语言开发的重要技能!随着互联网的普及,Web开发的需求越来越大,C语言的高性能和可移植性使其在Web开发中具有重要地位。 二、模块1:CGI(通用网关接口)基础 2.1 学习目标 * 理解CGI的本质:通用网关接口,用于Web服务器与服务器端程序之间的通信 * 掌握CGI的核心架构:Web服务器、CGI程序、客户端 * 掌握CGI的开发方法:使用C语言编写CGI程序 * 掌握CGI的避坑指南:避免环境变量未设置、避免输出格式错误、避免资源泄漏 * 避开CGI使用的3大常见坑

By Ne0inhk
Go map 底层原理

Go map 底层原理

Go map 底层原理 * 1. 一语戳破哈希表 * 2. 经典版:Go map 到底长什么样 * 2.1 `hmap` 解决什么问题 * 2.2 `bmap` 解决什么问题 * 2.3 `tophash[8]` 到底在干什么 * 2.4 `overflow bucket` 是怎么来的 * 3. 扩容不是“多加几个桶”那么简单 * 3.1 为什么旧桶必须搬 * 3.2 为什么 Go 要做渐进式扩容 * 3.3 增量扩容和等量扩容 * 4. 并发安全:原生 map 为什么不能裸奔 * 5. 现版本的Go

By Ne0inhk
PostgreSQL动态分区裁剪技术:查询性能优化解析(2026年版)

PostgreSQL动态分区裁剪技术:查询性能优化解析(2026年版)

PostgreSQL动态分区裁剪技术:从原理到实战的查询性能优化 一、引言 1.1 研究背景与意义 随着企业数据量从TB级向PB级演进,数据库管理系统面临着严峻的挑战。PostgreSQL作为一款功能强大的开源关系型数据库,凭借其高度的可扩展性和标准兼容性,在金融、电商、物联网等领域得到了广泛应用。然而,在处理海量数据时,如何通过分区裁剪技术精准定位目标数据,避免无关分区的无效扫描,已成为查询性能优化的关键突破口。 在实际应用中,许多场景对查询性能有着极高要求。以电商行业为例,订单数据量庞大,每天可能产生数百万甚至数千万条订单记录。在进行订单查询、统计分析等操作时,如果不能有效利用分区裁剪技术,查询可能会耗费大量时间,严重影响用户体验。又如在金融领域,交易数据的实时查询对于风险控制至关重要,动态分区裁剪技术能够帮助金融机构快速获取所需数据。 1.2 研究目标与范围 本文旨在深入研究PostgreSQL声明式分区表的动态裁剪机制,通过结合源码分析与实际案例,系统地阐述其实现原理、优化策略及性能影响因素。研究目标包括: * 从源码层面深入剖析动态分区裁剪的实现原理 *

By Ne0inhk
黑马点评完整代码(RabbitMQ优化)+简历编写+面试重点 ⭐

黑马点评完整代码(RabbitMQ优化)+简历编写+面试重点 ⭐

简历上展示黑马点评 完整代码地址 微服务学成在线项目 前言 当初就是当作一个学习笔记和个人面试记录发的,没想到这么多人收藏浏览,还是感慨学Java的人确实多啊。 适合什么人看呢,我仅仅说说我个人的理解,因为我现在也是个经历秋招的双非学生。 1.初学者学习完Redis基础,想来个实战,黑马点评还是特别好的一个项目,基本包含了所有数据类型的运用和redis其他功能的扩展,这篇文章可以带你提炼重点,很好的走下流程。 2.但大部分人是冲着找实习和秋招去的,像我这种学历不高的秋招就不要写黑马点评了,即使包装,也会很容易看出来,我找实习的时候就被面试官问到这是不是黑马点评过,我们可以把其中的闪光点迁移到你找的其他项目中,比如缓存穿透雪崩击穿的解决方法,redisson分布式锁解决一人一单,这种在大多项目中都可以添加,自圆其说就行。 3.对于找实习的像大二,大三上的,想找个小厂试试手垂直向上升的,可以吃透它,面试官问你遇到的困难或者是你觉得难点,就可以重点讲一人一单这个解决方法和流程,越详细越好。 4.前提是大家不用直接用这套模板,太多人用了,这也是我从网上找的别人的,巧用AI让它改改项

By Ne0inhk