【集群】K8S集群搭建记录——kwok搭建轻量测试环境

💡简介
为了在单机上测试大规模性能,需要安装 kwok 创建轻量的测试环境。前期已经通过 kind 创建了虚拟测试环境,现在记录一下安装和使用 kwok 的方法、问题以及常用操作。
🖼️背景
- 需要测试大规模 Kubernetes 集群的性能和资源调度。
- 实际硬件资源有限,无法部署大量真实节点。
- kwok 可以模拟大量虚拟节点,适合性能测试场景。
- 前期已经通过 kind 搭建了基础测试环境。
🧠思路
- 在已有 kind 集群上安装 kwok。
- 配置 kwok 模拟节点。
- 验证虚拟节点状态。
- 进行性能测试。
- 记录常见问题与解决方法。
🔨解决
0. 安装 Go
安装 kwok 和 kwokctl 时会使用 go env
命令获取系统信息。同时,为了更好的兼容性和未来可能的扩展,建议安装 Go。以下是安装步骤:
1 | # 下载最新版本的 Go(以 1.22.0 为例) |
注意:如果不想安装 Go,也可以手动指定系统信息:
- 对于 Linux 系统,可以直接使用
linux-amd64
替代$(go env GOOS)-$(go env GOARCH)
- 对于 MacOS 系统,可以使用
darwin-amd64
或darwin-arm64
(M1/M2芯片)- 对于 Windows 系统,可以使用
windows-amd64
1. 安装 kwok 和 kwokctl
组件作用:
• kwokctl — 也是一个 CLI 管理,允许你使用 Docker 建立独立集群(类似于 Kind 集群)。如果已经有 kind 就不需要使用 kwokctl 了。
• kwok — 负责模拟集群及其资源的资源控制器。
kwok 提供了多种安装方式,这里使用二进制安装方式。
a. 首先配置相关变量
1 | # 配置变量 KWOK repository |
b. 安装 kwokctl
1 | # 安装最新版本 kwokctl |
c. 安装 kwok
1 | # 安装最新版本 kwok |
2. 创建虚拟集群
因为已经有 kind 就不需要使用 kwokctl 再创建了。
如果没有使用 kind 的话,按照以下指令进行创建:
1 | # 创建虚拟集群 |
3. 启动 kwok 控制器
根据[4],
- 可以通过在集群外运行 kwok 控制器(如此处演示,通过 kubeconfig 监控和模拟),需要单独开一个终端用来维持,一旦终端关闭则 kwok 控制器关闭;
1
2
3
4
5kwok \
--kubeconfig=~/.kube/config \
--manage-all-nodes=true
# 上面的命令启动 kwok 控制器,并通过`manage-all-nodes=true`参数指定该控制器将所有节点作为 Kwok 节点进行管理(其它参数参阅 kwok 文档)。
# 仅当将整个集群都用来测试时才能这样(例如使用 kind 或 kwokctl创建的集群),否则应该添加其他参数来过滤 Kwok 节点和资源。- 以上只是示例,实际使用时应当多使用一些参数描述 kwok 需管理的对象,为其添加污点等描述,从而避免与真实节点 or 其他架构管理的节点(如 kind)产生冲突。
1
2
3
4
5
6
7
8
9kwok \
--kubeconfig=~/.kube/config \
--manage-all-nodes=false \
--manage-nodes-with-annotation-selector=kwok.x-k8s.io/node=fake \
--manage-nodes-with-label-selector= \
--manage-single-node= \
--cidr=10.0.0.1/24 \
--node-ip=10.0.0.1 \
--node-lease-duration-seconds=40
- 以上只是示例,实际使用时应当多使用一些参数描述 kwok 需管理的对象,为其添加污点等描述,从而避免与真实节点 or 其他架构管理的节点(如 kind)产生冲突。
- 也可以在集群中运行 kwok 控制器(通过 CRD 方式,使用 k8s 管理 kwok 的执行。有关详细信息,请参阅 kwok 文档[1])。
- 变量准备
1
2
3
4# KWOK repository
KWOK_REPO=kubernetes-sigs/kwok
# Get latest
KWOK_LATEST_RELEASE=$(curl "https://api.github.com/repos/${KWOK_REPO}/releases/latest" | jq -r '.tag_name') - 部署 kwok 并设置自定义资源定义 (CRD)(必需)
1
kubectl apply -f "https://github.com/${KWOK_REPO}/releases/download/${KWOK_LATEST_RELEASE}/kwok.yaml"
- 设置
自定义资源类型-Stage
的默认自定义资源 (CR)(必需)1
2# 注意:这将配置 Pod/Node 仿真行为,如果不这样做,kwok 将无法执行任何模拟操作。
kubectl apply -f "https://github.com/${KWOK_REPO}/releases/download/${KWOK_LATEST_RELEASE}/stage-fast.yaml" - 设置
自定义资源类型-resource usage资源使用情况
的默认自定义资源 (CR)(可选)1
2
3# 这允许模拟节点、Pod 和容器的资源使用情况。
kubectl apply -f "https://github.com/${KWOK_REPO}/releases/download/${KWOK_LATEST_RELEASE}/metrics-usage.yaml"
# 上述配置将由 kwok 管理的所有容器的 CPU 和内存使用量分别设置为 1m 和 1Mi。要覆盖默认值,您可以向伪 Pod 添加注释 "kwok.x-k8s.io/usage-cpu"(用于 CPU 使用量)和 "kwok.x-k8s.io/usage-memory"(用于内存使用量),其中包含您想要的任何数量值。
- 变量准备
4. 创建虚拟节点
4.1 简单创建方式
若使用 kwokctl
管理集群:
1 | kwokctl scale node --replicas=1000 |
4.2 根据配置文件创建方式
创建虚拟节点配置文件 virtual-nodes.yaml
:
1 | apiVersion: v1 |
或者使用 kwok 官网介绍的属性更丰富的 Node 配置:
1 | apiVersion: v1 |
应用配置:
1 | kubectl apply -f virtual-nodes.yaml |
5. 验证节点状态
1 | kubectl get nodes |
6. 常用操作
- 根据配置文件
virtual-pod.yaml
创建虚拟 Pod :
1 | apiVersion: v1 |
或者使用 kwok 官网介绍的属性更丰富的 Pod 配置:
1 | apiVersion: apps/v1 |
1 | kubectl apply -f virtual-pod.yaml |
- 查看节点资源使用情况:
1 | kubectl describe node kwok-node-1 |
- 停止 kwok 控制器:
1 | pkill kwok |
7. 常见问题
7.1 创建集群时出现网络超时
当使用 kwokctl create cluster
时出现类似以下错误:
1 | Error response from daemon: Head "https://asia-east1-docker.pkg.dev/v2/k8s-artifacts-prod/images/etcd/manifests/3.5.21-0": dial tcp 108.177.97.82:443: i/o timeout |
只能在其他机器上拉取镜像后传递到本服务器上。
7.2 批量创建虚拟节点
除了使用 kwokctl scale node
命令外,还可以使用以下方法:
- 使用 kubectl 的
--dry-run=client -o yaml
生成模板,通过脚本自动撰写 yaml 配置文件(一个文件中会有 1000 个节点的信息,看起来有点笨笨的):1
2
3
4
5
6# 生成一个节点模板
kubectl create node kwok-node-1 --dry-run=client -o yaml > node-template.yaml
# 使用脚本批量生成
for i in {1..1000}; do sed "s/kwok-node-1/kwok-node-$i/g" node-template.yaml >> nodes.yaml; done
# 应用配置
kubectl apply -f nodes.yaml
从 kwok 官方 GitHub 仓库的一条 Discussion 中也能看到,目前仅支持使用一个巨大的 yaml 文件来创建。
7.3 关闭 kwok 后节点仍然存在
这是因为 kwok 控制器只是模拟节点的状态,并不会真正创建或删除节点。要删除这些节点,需要:
手动删除节点:
1
kubectl delete node kwok-node-1 kwok-node-2 ...
或者使用标签选择器批量删除:
1
kubectl delete node -l kwok.x-k8s.io/node=fake
这些虚拟节点不会对实际集群造成影响,因为:
- 它们只是模拟的节点,不会消耗实际资源
- 它们有特殊的污点(taint),不会调度实际的 Pod
- 它们的状态是 kwok 控制器模拟的,不会影响实际集群的运行
7.4 kwok 到底起了什么作用
kwok 是一个轻量级的 Kubernetes 资源模拟器,它的工作原理如下:
资源模拟机制:
- kwok 控制器会监听 Kubernetes API 服务器的请求
- 当 Kubernetes API Server 请求资源状态时,kwok 会返回模拟的状态信息
- 这些状态信息包括节点的 CPU、内存、网络等资源使用情况
- kwok 不会真正创建或运行任何容器,只是”欺骗” Kubernetes API Server
与 Kubernetes 的交互:
- 当使用
kubectl apply
创建资源时:- kubectl 将请求发送到 Kubernetes API Server
- Kubernetes API Server 将资源信息存储在 etcd 中
- kwok 控制器检测到新资源,开始模拟其状态
- 当其他组件(如调度器)查询资源状态时,kwok 返回模拟数据
- 当关闭 kwok 控制器时:
- 资源定义仍然存在于 etcd 中
- 但 kwok 不再提供模拟状态
- API 服务器会返回这些资源的真实状态(通常是 NotReady)
- 这些资源不会影响实际集群的运行,因为:
- 它们有特殊的污点(taint),不会被调度实际的工作负载
- 它们不消耗实际的系统资源
- 它们只是 etcd 中的一些记录
- 当使用
实际应用场景:
- 性能测试:可以模拟 1000 个节点,测试调度器性能
- 开发测试:快速验证资源配置,无需等待实际资源创建
- 演示环境:创建演示集群,展示 Kubernetes 功能
- 学习环境:理解 Kubernetes 概念,无需实际资源
优势:
- 轻量级:不消耗实际系统资源
- 快速:可以瞬间创建大量节点
- 安全:不会影响实际集群的运行
- 灵活:可以模拟各种资源状态
限制:
- 不能运行实际的容器
- 不能测试实际的网络通信
- 不能测试实际的存储操作
- 主要用于测试 Kubernetes 控制平面的功能
🏥反思
- kwok 适合大规模集群的性能测试场景。
- 虚拟节点资源是模拟的,不能完全替代真实节点。
- 建议结合 kind 等工具使用,构建完整的测试环境。
- 希望这篇博客对你有帮助!如果你有任何问题或需要进一步的帮助,请随时提问。
- 如果你喜欢这篇文章,欢迎动动小手给我一个follow或star。
🗺参考文献
[1] KWOK (Kubernetes WithOut Kubelet) 官方文档
[2] 介绍 KWOK(Kubernetes WithOut Kubelet,没有 Kubelet 的 Kubernetes) - Kubernetes 博客
- 标题: 【集群】K8S集群搭建记录——kwok搭建轻量测试环境
- 作者: Fre5h1nd
- 创建于 : 2025-05-20 21:08:13
- 更新于 : 2025-05-21 23:48:31
- 链接: https://freshwlnd.github.io/2025/05/20/k8s/k8s-kwok-install/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。