概述
本文将介绍如何在 openEuler 25.09 操作系统上快速部署一个 1 主 2 从的 Kubernetes 集群,并对集群进行全面的性能测试。我们将采用在线部署方式,使用 eggo 自动化部署工具完成集群搭建,然后从多个维度评估 openEuler 系统上 K8s 集群的性能表现。
一、环境准备
1.1 集群规划
本次部署采用最小化集群配置:
-
1 个 Master 节点: 承担控制平面和工作负载
-
2 个 Worker 节点: 专门运行工作负载
-
操作系统: openEuler 25.09 x86_64
-
虚拟化平台: VMware Workstation
-
部署方式: 在线安装
节点配置建议:
Master 节点: 2 vCPU, 2GB RAM, 50GB 磁盘
Worker 节点: 2 vCPU, 2GB RAM, 50GB 磁盘
1.2 openEuler 25.09 x86_64镜像包下载
下载地址:www.openEuler .org/zh/download/#openEuler %2025.09
下载openEuler 25.09的Offline Standard ISO软件包(离线标准ISO安装包)
1.3 虚拟机准备
在 VMware 上创建 3 台 openEuler 25.09 虚拟机,配置如下:
节点信息:
master: 192.168.153.10
node1: 192.168.153.11
node2: 192.168.153.12
网关:192.168.153.2
DNS:223.5.5.5
三台服务器已经准备就绪
所有节点执行以下操作:
# 1. 设置主机名
hostnamectl set-hostname master # 各节点按实际修改(master,node1,node2)
# 2. 配置 hosts 文件
cat >> /etc/hosts << EOF
192.168.153.10 master
192.168.153.11 node1
192.168.153.12 node2
EOF
hosts文件配置完成后,在master节点ping node1和node2节点,测试成功
所有节点继续执行以下操作
# 3. 关闭防火墙和 SELinux
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
# 4. 关闭 swap
swapoff -a
sed -i '/swap/s/^/#/' /etc/fstab
# 5. 配置内核参数
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
modprobe br_netfilter
sysctl -p /etc/sysctl.d/k8s.conf
# 6. 配置时间同步
dnf install -y chrony
systemctl enable chronyd
systemctl start chronyd
# 7. 配置 SSH 免密登录(仅在 master 节点执行)
ssh-keygen -t rsa -N "" -f /root/.ssh/id_rsa
ssh-copy-id root@192.168.153.10
ssh-copy-id root@192.168.153.11
ssh-copy-id root@192.168.153.12
二、快速部署 Kubernetes 集群
2.1 使用eggo 部署工具
在 Master 节点上安装 eggo:
# 1. 安装 Go 环境 (eggo 需要 Go 1.16+)
dnf install -y golang git
# 2. 克隆 eggo 源码
git clone https://gitee.com/openEuler /eggo.git
cd eggo
# 4.使用国内代理(如阿里云、七牛云)
export GOPROXY=https://goproxy.cn,direct
# 4. 编译 eggo
go build -o eggo main.go
# 5. 安装到系统路径
cp eggo /usr/local/bin/
chmod +x /usr/local/bin/eggo
# 6. 验证安装
eggo -v
生成集群配置文件
# 生成配置模板
eggo template -f k8s-cluster.yaml \
-n master \
-u root \
--masters 192.168.153.10 \
--workers 192.168.153.11,192.168.153.12
编辑配置文件
编辑 k8s-cluster.yaml,关键配置如下:
cluster-id: k8s-cluster
username: root
password: "123456"
masters:
- name: k8s-master-0
ip: 192.168.153.10
port: 22
arch: amd64
workers:
- name: k8s-worker-0
ip: 192.168.153.11
port: 22
arch: amd64
- name: k8s-worker-1
ip: 192.168.153.12
port: 22
arch: amd64
service:
cidr: 10.96.0.0/16
dnsaddr: 10.96.0.10
gateway: 10.96.0.1
network:
podcidr: 10.244.0.0/16
plugin: calico
apiserver-endpoint: 192.168.153.10:6443
apiserver-cert-sans:
- 192.168.153.10
- kubernetes
- kubernetes.default
dns-vip: 10.96.0.10
dns-domain: cluster.local
runtime: docker
# 修正 open-ports 配置
open-ports:
master:
- port: 6443 # Kubernetes API Server
protocol: tcp
- port: 2379 # etcd client
protocol: tcp
- port: 2380 # etcd peer
protocol: tcp
- port: 10250 # Kubelet API
protocol: tcp
- port: 10251 # kube-scheduler
protocol: tcp
- port: 10252 # kube-controller-manager
protocol: tcp
worker:
- port: 10250 # Kubelet API
protocol: tcp
- port: 30000 # NodePort 起始端口
protocol: tcp
- port: 30001 # 明确指定端口,避免范围语法问题
protocol: tcp
- port: 32767 # NodePort 结束端口
protocol: tcp
install:
package-source:
type: repo
部署集群
# 执行部署
eggo deploy -d -f k8s-cluster.yaml
# 配置 kubectl
export KUBECONFIG=/etc/eggo/k8s-cluster/admin.conf
echo 'export KUBECONFIG=/etc/eggo/k8s-cluster/admin.conf' >> ~/.bashrc
# 验证集群状态
kubectl get nodes
kubectl get pods -A
2.2 Kubernetes 集群部署(kubeadm 方式)
cat > /root/k8s-force-cleanup-deploy.sh << 'EOF'
#!/bin/bash
set -e
echo "=========================================="
echo "Kubernetes 集群部署(kubeadm 方式)"
echo "=========================================="
MASTER="192.168.153.10"
WORKER1="192.168.153.11"
WORKER2="192.168.153.12"
ALL_NODES="$MASTER $WORKER1 $WORKER2"
K8S_VERSION="1.28.2"
# ========== 步骤 1: 强制清理所有节点 ==========
echo ""
echo "步骤 1/5: 强制清理所有节点..."
echo "=========================================="
cat > /tmp/force-cleanup.sh << 'CLEANUP'
#!/bin/bash
set -e
echo ">>> 强制清理节点: $(hostname)"
# 1. 停止所有 Kubernetes 服务
echo "[1/8] 停止 Kubernetes 服务..."
systemctl stop kubelet 2>/dev/null || true
systemctl stop kube-apiserver 2>/dev/null || true
systemctl stop kube-controller-manager 2>/dev/null || true
systemctl stop kube-scheduler 2>/dev/null || true
systemctl stop kube-proxy 2>/dev/null || true
systemctl stop etcd 2>/dev/null || true
# 2. 杀死所有 Kubernetes 相关进程
echo "[2/8] 杀死 Kubernetes 进程..."
pkill -9 kube-apiserver 2>/dev/null || true
pkill -9 kube-controller 2>/dev/null || true
pkill -9 kube-scheduler 2>/dev/null || true
pkill -9 kube-proxy 2>/dev/null || true
pkill -9 kubelet 2>/dev/null || true
pkill -9 etcd 2>/dev/null || true
# 3. 等待端口释放
echo "[3/8] 等待端口释放..."
sleep 3
# 4. 检查并强制释放端口
echo "[4/8] 检查端口占用..."
for port in 2379 2380 6443 10250 10251 10252 10255; do
pid=$(lsof -ti:$port 2>/dev/null || true)
if [ -n "$pid" ]; then
echo " - 端口 $port 被进程 $pid 占用,强制杀死..."
kill -9 $pid 2>/dev/null || true
fi
done
# 5. 重置 kubeadm
echo "[5/8] 重置 kubeadm..."
kubeadm reset -f --cri-socket=unix:///var/run/containerd/containerd.sock 2>/dev/null || true
# 6. 清理 iptables
echo "[6/8] 清理 iptables..."
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X 2>/dev/null || true
ipvsadm -C 2>/dev/null || true
# 7. 清理网络接口
echo "[7/8] 清理网络接口..."
ip link delete cni0 2>/dev/null || true
ip link delete flannel.1 2>/dev/null || true
ip link delete kube-ipvs0 2>/dev/null || true
ip link delete tunl0 2>/dev/null || true
ip link delete vxlan.calico 2>/dev/null || true
# 8. 清理目录和文件
echo "[8/8] 清理目录..."
rm -rf /etc/cni/net.d
rm -rf /var/lib/etcd/*
rm -rf /var/lib/kubelet/*
rm -rf /var/lib/dockershim
rm -rf /var/run/kubernetes
rm -rf /var/lib/cni
rm -rf ~/.kube
rm -rf /etc/kubernetes
# 停止并清理容器
crictl --runtime-endpoint unix:///var/run/containerd/containerd.sock rm -af 2>/dev/null || true
crictl --runtime-endpoint unix:///var/run/containerd/containerd.sock rmp -af 2>/dev/null || true
# 重启服务
systemctl restart containerd
systemctl restart docker
sleep 2
# 验证端口已释放
echo ""
echo "验证端口状态:"
for port in 2379 2380 6443; do
if lsof -ti:$port 2>/dev/null; then
echo "端口 $port 仍被占用"
else
echo "端口 $port 已释放"
fi
done
echo "节点清理完成"
CLEANUP
chmod +x /tmp/force-cleanup.sh
for node in $ALL_NODES; do
echo ""
echo "--- 清理节点: $node ---"
scp -o StrictHostKeyChecking=no /tmp/force-cleanup.sh root@$node:/tmp/ > /dev/null
ssh -o StrictHostKeyChecking=no root@$node "bash /tmp/force-cleanup.sh"
done
# ========== 步骤 2: 验证清理结果 ==========
echo ""
echo "步骤 2/5: 验证清理结果..."
echo "=========================================="
echo "检查 Master 节点端口..."
ssh root@$MASTER << 'CHECKPORTS'
echo "关键端口状态:"
for port in 2379 2380 6443 10250 10251 10252; do
if lsof -ti:$port 2>/dev/null; then
echo "端口 $port 被占用: $(lsof -ti:$port)"
echo " 进程信息: $(ps aux | grep $(lsof -ti:$port) | grep -v grep)"
else
echo "端口 $port 空闲"
fi
done
echo ""
echo "etcd 目录状态:"
ls -la /var/lib/etcd/ 2>/dev/null || echo "etcd 目录为空或不存在"
echo ""
echo "Kubernetes 进程:"
ps aux | grep -E 'kube|etcd' | grep -v grep || echo "无 Kubernetes 进程运行"
CHECKPORTS
# ========== 步骤 3: 检查内存 ==========
echo ""
echo "步骤 3/5: 检查 Master 节点内存..."
echo "=========================================="
MASTER_MEM=$(ssh root@$MASTER "free -m | awk '/^Mem:/{print \$2}'")
echo "Master 节点当前内存: ${MASTER_MEM} MB"
if [ "$MASTER_MEM" -lt 1700 ]; then
echo "内存不足,将使用 --ignore-preflight-errors=Mem"
IGNORE_PREFLIGHT="--ignore-preflight-errors=Mem"
else
echo "内存充足"
IGNORE_PREFLIGHT=""
fi
# ========== 步骤 4: 初始化 Master 节点 ==========
echo ""
echo "步骤 4/5: 初始化 Master 节点..."
echo "=========================================="
ssh root@$MASTER << MASTERINIT
set -e
K8S_INSTALLED_VERSION=\$(kubeadm version -o short)
echo "Kubernetes 版本: \$K8S_INSTALLED_VERSION"
echo "[1/5] 验证环境..."
systemctl status containerd --no-pager | grep Active
crictl --runtime-endpoint unix:///var/run/containerd/containerd.sock version
echo "[2/5] 拉取镜像..."
kubeadm config images pull \
--image-repository=registry.aliyuncs.com/google_containers \
--kubernetes-version=\$K8S_INSTALLED_VERSION \
--cri-socket=unix:///var/run/containerd/containerd.sock
echo "[3/5] 初始化 Master..."
kubeadm init \
--apiserver-advertise-address=192.168.153.10 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/16 \
--image-repository=registry.aliyuncs.com/google_containers \
--kubernetes-version=\$K8S_INSTALLED_VERSION \
--cri-socket=unix:///var/run/containerd/containerd.sock \
$IGNORE_PREFLIGHT
echo "[4/5] 配置 kubectl..."
mkdir -p \$HOME/.kube
cp -f /etc/kubernetes/admin.conf \$HOME/.kube/config
chown \$(id -u):\$(id -g) \$HOME/.kube/config
echo "[5/5] 安装 Calico 网络插件..."
kubectl apply -f https://docs.projectcalico.org/v3.26/manifests/calico.yaml
echo "等待 Calico 启动..."
sleep 20
echo "生成 Worker 加入命令..."
kubeadm token create --print-join-command > /root/join-command.sh
echo " --cri-socket=unix:///var/run/containerd/containerd.sock" >> /root/join-command.sh
chmod +x /root/join-command.sh
echo "Master 初始化完成"
MASTERINIT
# ========== 步骤 5: Worker 节点加入集群 ==========
echo ""
echo "步骤 5/5: Worker 节点加入集群..."
echo "=========================================="
scp root@$MASTER:/root/join-command.sh /tmp/
for node in $WORKER1 $WORKER2; do
echo ""
echo "--- 节点 $node 加入集群 ---"
scp /tmp/join-command.sh root@$node:/tmp/
ssh root@$node "bash /tmp/join-command.sh"
done
# ========== 验证集群 ==========
echo ""
echo "验证集群状态..."
echo "=========================================="
echo "等待节点就绪..."
sleep 30
ssh root@$MASTER << 'VERIFY'
echo ""
echo "========== 节点状态 =========="
kubectl get nodes -o wide
echo ""
echo "========== 系统 Pod 状态 =========="
kubectl get pods -n kube-system -o wide
echo ""
echo "========== 所有 Pod =========="
kubectl get pods -A
echo ""
echo "========== 集群信息 =========="
kubectl cluster-info
echo ""
echo "========== 资源使用 =========="
free -h
df -h | grep -E '^/dev'
VERIFY
echo ""
echo "=========================================="
echo "✅ Kubernetes 集群部署完成!"
echo "=========================================="
echo ""
echo "快速访问:"
echo " ssh root@$MASTER"
echo " kubectl get nodes"
echo " kubectl get pods -A"
echo ""
echo "测试部署:"
echo " kubectl run nginx --image=nginx:latest"
echo " kubectl get pods"
echo " kubectl delete pod nginx"
echo ""
EOF
chmod +x /root/k8s-force-cleanup-deploy.sh
2.3 验证部署结果
检查集群节点状态
kubectl get nodes
所有节点显示为Ready状态。
检查所有命名空间下的Pod
kubectl get pods -A
核心组件如etcd、kube-apiserver、kube-controller-manager、kube-schedulers等Pod处于Running状态
检查集群信息
kubectl cluster-info
正确显示Kubernetes master和KubeDNS的运行地址
检查系统组件健康
kubectl get componentstatuses
所有组件如controller-manager、scheduler、etcd应为Healthy
测试基本功能
创建一个测试Deployment:
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
检查服务
kubectl get svc
如果以上步骤都通过,集群部署基本完成。如果未安装网络插件(如Calico),Pod间通信会失败。推荐安装一个CNI插件,例如:
安装Calico:
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml
三、在openEuler 系统上测试性能
本章节将从多个维度对部署在 openEuler 25.09 上的 Kubernetes 集群进行全面的性能测试,包括集群基础性能、网络性能、存储性能、应用性能等。
3.1 环境准备
3.1.1 安装性能测试工具
在 Master 节点上执行:
# 安装基础工具
dnf install -y wget curl git make gcc sysstat iperf3 fio
# 安装 Helm (用于部署测试应用)
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
# 验证安装
helm version
3.1.2 部署测试命名空间
# 创建性能测试专用命名空间
kubectl create namespace perf-test
# 设置默认命名空间
kubectl config set-context --current --namespace=perf-test
3.2 集群基础性能测试
3.2.1 集群连通性测试
cat > /root/simple-test-1.sh << 'EOF'
#!/bin/bash
echo "=== 集群连通性测试 ==="
# 测试1: 检查集群状态
echo "1. 检查节点状态:"
kubectl get nodes
# 测试2: 检查核心组件
echo -e "\n2. 检查核心Pod状态:"
kubectl get pods -n kube-system -o wide | grep -E "(coredns|etcd|apiserver)" | head -5
# 测试3: API测试
echo -e "\n3. API服务器响应测试:"
time kubectl get namespaces > /dev/null && echo "API服务器正常"
# 测试4: 创建简单配置
echo -e "\n4. 创建测试配置:"
kubectl create configmap simple-test --from-literal=test=success -n perf-test --dry-run=client -o yaml | kubectl apply -f -
# 测试5: 验证配置
kubectl get configmap simple-test -n perf-test && echo "配置创建成功"
# 清理
kubectl delete configmap simple-test -n perf-test
echo -e "\n=== 所有基础测试通过 ==="
EOF
chmod +x /root/simple-test-1.sh
测试结果:
暂时无法在飞书文档外展示此内容
3.2.2 etcd 性能测试
# etcd 性能测试脚本
cat > /root/etcd-perf-test.sh << 'EOF'
#!/bin/bash
echo "=========================================="
echo "etcd 性能测试"
echo "=========================================="
# 获取 etcd Pod 名称
ETCD_POD=$(kubectl get pods -n kube-system -l component=etcd -o jsonpath='{.items[0].metadata.name}')
echo -e "\n[测试 1] etcd 写入性能"
kubectl exec -n kube-system $ETCD_POD -- etcdctl \
--endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
check perf
echo -e "\n[测试 2] etcd 数据库大小"
kubectl exec -n kube-system $ETCD_POD -- etcdctl \
--endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
endpoint status --write-out=table
echo -e "\n=========================================="
echo "etcd 性能测试完成"
echo "=========================================="
EOF
chmod +x /root/etcd-perf-test.sh
bash /root/etcd-perf-test.sh
暂时无法在飞书文档外展示此内容
3.2.3 容器启动时间测试
# 容器启动时间测试
cat > /root/container-startup-test.sh << 'EOF'
#!/bin/bash
echo "=========================================="
echo "容器启动时间测试"
echo "=========================================="
start_time=$(date +%s%N)
kubectl run pause-test --image=registry.aliyuncs.com/google_containers/pause:3.9 -n perf-test
kubectl wait --for=condition=Ready pod/pause-test -n perf-test --timeout=60s
end_time=$(date +%s%N)
echo "启动时间: $(( (end_time - start_time) / 1000000 )) 毫秒"
kubectl delete pod pause-test -n perf-test
echo -e "\n=========================================="
echo "容器启动时间测试完成"
echo "=========================================="
EOF
chmod +x /root/container-startup-test.sh
bash /root/container-startup-test.sh
四、总结:基于 openEuler 25.09 的 Kubernetes 集群部署与性能测试
本文详细介绍了在 openEuler 25.09 操作系统上快速部署 1 主 2 从 Kubernetes 集群并进行性能测试的完整流程,充分展现了 openEuler 作为操作系统的稳定性与高效性。
4.1 部署流程
通过 VMware Workstation 虚拟化平台,我们在 openEuler 25.09 x86_64 上创建了三台虚拟机(1 个 Master 节点:192.168.153.10,2 个 Worker 节点:192.168.153.11、192.168.153.12),每台配置为 2 vCPU、2GB RAM 和 50GB 磁盘。环境准备包括下载 openEuler 25.09 标准 ISO 镜像、配置主机名、hosts 文件、关闭防火墙和 SELinux、禁用 swap、设置内核参数、时间同步以及 SSH 免密登录,确保系统环境满足 Kubernetes 部署需求。
集群部署提供了两种方式:
-
Eggo 自动化部署:通过安装 Go 环境、克隆 eggo 源码并编译,结合配置文件快速完成集群搭建。配置中指定了集群 ID、网络参数(如 podCIDR 10.244.0.0/16、serviceCIDR 10.96.0.0/16)以及 Calico 网络插件,部署后通过
kubectl get nodes和kubectl get pods -A验证节点和 Pod 状态均为 Ready 和 Running。 -
Kubeadm 手动部署:通过脚本完成节点清理、Master 初始化、Worker 加入以及 Calico 网络插件安装。脚本包含强制清理 Kubernetes 残留、端口释放、镜像拉取等步骤,确保部署过程可靠。最终通过
kubectl cluster-info和kubectl get componentstatuses确认集群健康,测试部署 Nginx 服务验证基本功能。
4.2 性能测试
在 openEuler 25.09 环境下,对 Kubernetes 集群进行了多维度性能测试:
-
集群连通性:通过检查节点状态、核心组件 Pod、API 服务器响应及简单配置创建,验证集群基本功能正常。
-
etcd 性能:测试 etcd 写入性能和数据库状态,确认其在 openEuler 上的高效运行。
-
容器启动时间:通过启动 pause 容器并测量时间,评估 openEuler 环境下容器调度效率。
测试工具包括 sysstat、iperf3、fio 和 Helm,测试环境通过专用命名空间 perf-test 隔离,确保结果准确。
4.3 openEuler 的优势
openEuler 25.09 作为基础操作系统,展现了以下优势:
-
高效兼容性:完美支持 Kubernetes 生态工具(如 eggo、kubeadm、Calico),部署过程流畅,系统配置(如内核参数、时间同步)与 Kubernetes 无缝适配。
-
性能稳定:性能测试表明,openEuler 在容器启动、etcd 读写和集群连通性方面表现优异,资源占用合理,适合中小规模 Kubernetes 集群。
-
易用性:系统提供的 dnf 包管理器和标准化的环境配置简化了工具安装和集群维护,适合企业级应用场景。
4.4 结论
基于 openEuler 25.09 的 Kubernetes 集群部署快速高效,自动化工具与手动部署均表现出色。性能测试验证了其在容器化环境下的稳定性和高性能,充分证明 openEuler 可为现代化云原生场景提供坚实可靠的基础设施支撑。
如果您正在寻找面向未来的开源操作系统,不妨看看DistroWatch 榜单中快速上升的 openEuler: https://distrowatch.com/table-mobile.php?distributinotallow=openeuler,一个由开放原子开源基金会孵化、支持“超节点”场景的Linux 发行版。 openEuler官网:https://www.openeuler.openatom.cn/zh/