如何在 Ubuntu 20.04 服务器上搭建轻量级 Kubernetes(k3s)集群,并部署典型的微服务架构。A5数据将覆盖硬件选型、系统准备、k3s 安装、网络与存储方案、部署示例、CI/CD 集成及性能评估,对每个步骤提供具体配置与代码示例。
注意:本文假设您有至少两台可以访问互联网的物理服务器或云主机,并具备基本的 Linux 权限和网络规划经验。
一、香港服务器www.a5idc.com硬件与系统选型
由于 k3s 设计用于边缘计算、IoT 和轻量容器平台,推荐在中等规格服务器上运行。以下是我们在生产预研阶段使用的典型硬件配置:
| 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: 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:
| 空闲 | 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 进一步增强运维能力。
网硕互联帮助中心






评论前必须登录!
注册