云计算百科
云计算领域专业知识百科平台

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

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

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


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

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

节点CPU内存存储网络
master-1 4 核 Intel Xeon 8 GB ECC 120 GB NVMe 1 Gbps
worker-1 4 核 Intel Xeon 8 GB ECC 120 GB NVMe 1 Gbps
worker-2 4 核 Intel Xeon 8 GB ECC 120 GB NVMe 1 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 支持。对于生产环境,我们通常替换为更成熟的方案:

组件方案备注
CNI Calico/MetalLB Calico 支持网络策略;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: lbpool
namespace: metallbsystem
spec:
addresses:
192.168.100.240192.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: ordersapi
tier: backend

5.2 Deployment 示例

orders-api (Node.js):

apiVersion: apps/v1
kind: Deployment
metadata:
name: ordersapi
namespace: microservices
spec:
replicas: 3
selector:
matchLabels:
app: ordersapi
template:
metadata:
labels:
app: ordersapi
spec:
containers:
name: ordersapi
image: myregistry.local/microservices/ordersapi: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: ordersapi
namespace: microservices
spec:
type: LoadBalancer
selector:
app: ordersapi
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: microservicesingress
namespace: microservices
spec:
rules:
host: microservices.example.com
http:
paths:
path: /orders
pathType: Prefix
backend:
service:
name: ordersapi
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: mysqlsecret
key: rootpassword
ports:
containerPort: 3306
volumeMounts:
name: mysqlpv
mountPath: /var/lib/mysql
volumeClaimTemplates:
metadata:
name: mysqlpv
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 ms 480
orders-api 200 并发 85% / 78% 350 ms 1320
orders-api + MySQL TPC 90% / 83% 420 ms 980

分析

  • 在 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 状态正常。


九、结论与实践建议

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

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

赞(0)
未经允许不得转载:网硕互联帮助中心 » 如何在 Ubuntu 20.04 系统的服务器上用k3s实现轻量级 Kubernetes 集群并部署微服务最佳实践
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!