openEuler 系统 Kubernetes 集群部署与性能测试

38 阅读5分钟

概述

本文将介绍如何在 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 部署需求。

集群部署提供了两种方式:

  1. Eggo 自动化部署:通过安装 Go 环境、克隆 eggo 源码并编译,结合配置文件快速完成集群搭建。配置中指定了集群 ID、网络参数(如 podCIDR 10.244.0.0/16、serviceCIDR 10.96.0.0/16)以及 Calico 网络插件,部署后通过 kubectl get nodeskubectl get pods -A 验证节点和 Pod 状态均为 Ready 和 Running。

  2. Kubeadm 手动部署:通过脚本完成节点清理、Master 初始化、Worker 加入以及 Calico 网络插件安装。脚本包含强制清理 Kubernetes 残留、端口释放、镜像拉取等步骤,确保部署过程可靠。最终通过 kubectl cluster-infokubectl get componentstatuses 确认集群健康,测试部署 Nginx 服务验证基本功能。


4.2 性能测试

在 openEuler 25.09 环境下,对 Kubernetes 集群进行了多维度性能测试:

  1. 集群连通性:通过检查节点状态、核心组件 Pod、API 服务器响应及简单配置创建,验证集群基本功能正常。

  2. etcd 性能:测试 etcd 写入性能和数据库状态,确认其在 openEuler 上的高效运行。

  3. 容器启动时间:通过启动 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/​