如何在 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

WebGL基础教程 (六):采用索引缓存共享数据,提升内存使用效率

WebGL基础教程 (六):采用索引缓存共享数据,提升内存使用效率

一、前言 1.1 适用人群 本教程适合已经了解基础的HTML/CSS/JavaScript,对WebGL有基本概念(知道着色器、绘制流程),但希望深入理解其核心性能机制——缓冲区(Buffer) 以及索引缓存(Index Buffer) 的开发者。我们将聚焦于“索引缓存如何通过顶点复用高效管理顶点数据”,并通过一个5个顶点绘制两个共用顶点三角形的经典案例,解决内存浪费的核心痛点。 效果如图: 1.2 核心目标 * 理解本质:掌握索引缓存(ELEMENT_ARRAY_BUFFER)的作用,它如何与GPU通信,以及为何它是处理复杂模型绘制的基石。 * 掌握方法:学会创建、绑定、配置索引缓冲区,并使用 drawElements 进行绘制,体验顶点复用带来的内存节省。 * 实战应用:通过完整代码示例,使用 5个唯一顶点 和 6个索引,绘制两个空间上不重叠但共用同一个顶点的彩色三角形。

By Ne0inhk
【前端实战】构建 Vue 全局错误处理体系,实现业务与错误的清晰解耦

【前端实战】构建 Vue 全局错误处理体系,实现业务与错误的清晰解耦

目录 【前端实战】构建 Vue 全局错误处理体系,实现业务与错误的清晰解耦 一、为什么要做全局错误处理? 1、将业务逻辑与错误处理解耦 2、为监控和埋点提供统一入口 二、Vue 中的基础全局错误处理方式 1、Vue 中全局错误处理写法 2、它会捕获哪些错误? 3、它不会捕获哪些错误? 4、errorHandler 的参数含义 三、全局错误处理的进阶设计 1、定义“可识别的业务错误” 2、在 errorHandler 中做真正的“分类处理” 3、补齐 Promise reject 的捕获能力 4、错误处理的策略化封装 四、结语         作者:watermelo37         ZEEKLOG优质创作者、华为云云享专家、阿里云专家博主、腾讯云“

By Ne0inhk

Spring Boot 开发入门:从 0 到 1 搭建第一个 Web 项目

前言 Spring Boot 是由 Pivotal 团队推出的基于 Spring 框架的轻量级开发框架,它简化了 Spring 应用的配置流程,通过 “约定大于配置” 的核心思想,让开发者无需繁琐的 XML 配置就能快速搭建和运行项目。本文将从环境准备、项目创建、核心代码编写到运行测试,手把手教你入门 Spring Boot 开发,全程附带可运行的代码示例,新手也能轻松上手! 一、前置准备 1. 环境要求 * JDK:推荐 JDK 8 及以上(Spring Boot 3.x 需 JDK 17+,本文以 Spring Boot 2.7.x + JDK 8

By Ne0inhk