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

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

Fre5h1nd Lv6

💡简介

为了在单机上测试大规模性能,需要安装 kwok 创建轻量的测试环境。前期已经通过 kind 创建了虚拟测试环境,现在记录一下安装和使用 kwok 的方法、问题以及常用操作。

🖼️背景

  • 需要测试大规模 Kubernetes 集群的性能和资源调度。
  • 实际硬件资源有限,无法部署大量真实节点。
  • kwok 可以模拟大量虚拟节点,适合性能测试场景。
  • 前期已经通过 kind 搭建了基础测试环境。

🧠思路

  1. 在已有 kind 集群上安装 kwok。
  2. 配置 kwok 模拟节点。
  3. 验证虚拟节点状态。
  4. 进行性能测试。
  5. 记录常见问题与解决方法。

🔨解决

0. 安装 Go

安装 kwok 和 kwokctl 时会使用 go env 命令获取系统信息。同时,为了更好的兼容性和未来可能的扩展,建议安装 Go。以下是安装步骤:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 下载最新版本的 Go(以 1.22.0 为例)
wget https://go.dev/dl/go1.22.3.linux-amd64.tar.gz

# 删除旧版本(如果存在)
sudo rm -rf /usr/local/go

# 解压到 /usr/local
sudo tar -C /usr/local -xzf go1.22.3.linux-amd64.tar.gz

# 配置环境变量(如果使用 bash)
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
source ~/.bashrc

# 验证安装
go version

注意:如果不想安装 Go,也可以手动指定系统信息:

  • 对于 Linux 系统,可以直接使用 linux-amd64 替代 $(go env GOOS)-$(go env GOARCH)
  • 对于 MacOS 系统,可以使用 darwin-amd64darwin-arm64(M1/M2芯片)
  • 对于 Windows 系统,可以使用 windows-amd64

1. 安装 kwok 和 kwokctl

组件作用:
• kwokctl — 也是一个 CLI 管理,允许你使用 Docker 建立独立集群(类似于 Kind 集群)。如果已经有 kind 就不需要使用 kwokctl 了。
• kwok — 负责模拟集群及其资源的资源控制器。

kwok 提供了多种安装方式,这里使用二进制安装方式。

a. 首先配置相关变量

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')

b. 安装 kwokctl

1
2
3
4
# 安装最新版本 kwokctl
wget -O kwokctl -c "https://github.com/${KWOK_REPO}/releases/download/${KWOK_LATEST_RELEASE}/kwokctl-$(go env GOOS)-$(go env GOARCH)"
chmod +x kwokctl
sudo mv kwokctl /usr/local/bin/kwokctl

c. 安装 kwok

1
2
3
4
# 安装最新版本 kwok
wget -O kwok -c "https://github.com/${KWOK_REPO}/releases/download/${KWOK_LATEST_RELEASE}/kwok-$(go env GOOS)-$(go env GOARCH)"
chmod +x kwok
sudo mv kwok /usr/local/bin/kwok

2. 创建虚拟集群

因为已经有 kind 就不需要使用 kwokctl 再创建了。

如果没有使用 kind 的话,按照以下指令进行创建:

1
2
3
4
5
6
# 创建虚拟集群
kwokctl create cluster --name kwok-cluster
# 验证是否已创建
kwokctl get clusters
# 如果需要删除,和 kind 指令类似
kwokctl delete cluster --name=kwok-cluster

3. 启动 kwok 控制器

根据[4]

  • 可以通过在集群外运行 kwok 控制器(如此处演示,通过 kubeconfig 监控和模拟),需要单独开一个终端用来维持,一旦终端关闭则 kwok 控制器关闭;
    1
    2
    3
    4
    5
    kwok \
    --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
      9
      kwok \
      --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 控制器(通过 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: v1
kind: Node
metadata:
name: kwok-node-1
labels:
kwok.x-k8s.io/node: fake
spec:
taints:
- key: kwok.x-k8s.io/node
effect: NoSchedule
---
apiVersion: v1
kind: Node
metadata:
name: kwok-node-2
labels:
kwok.x-k8s.io/node: fake
spec:
taints:
- key: kwok.x-k8s.io/node
effect: NoSchedule

或者使用 kwok 官网介绍的属性更丰富的 Node 配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
apiVersion: v1
kind: Node
metadata:
annotations:
node.alpha.kubernetes.io/ttl: "0"
kwok.x-k8s.io/node: fake
labels:
beta.kubernetes.io/arch: amd64
beta.kubernetes.io/os: linux
kubernetes.io/arch: amd64
kubernetes.io/hostname: kwok-node-0
kubernetes.io/os: linux
kubernetes.io/role: agent
node-role.kubernetes.io/agent: ""
type: kwok
name: kwok-node-0
spec:
taints: # Avoid scheduling actual running pods to fake Node
- effect: NoSchedule
key: kwok.x-k8s.io/node
value: fake
status:
allocatable:
cpu: 32
memory: 256Gi
pods: 110
capacity:
cpu: 32
memory: 256Gi
pods: 110
nodeInfo:
architecture: amd64
bootID: ""
containerRuntimeVersion: ""
kernelVersion: ""
kubeProxyVersion: fake
kubeletVersion: fake
machineID: ""
operatingSystem: linux
osImage: ""
systemUUID: ""
phase: Running

应用配置:

1
kubectl apply -f virtual-nodes.yaml

5. 验证节点状态

1
kubectl get nodes

6. 常用操作

  • 根据配置文件 virtual-pod.yaml创建虚拟 Pod :
1
2
3
4
5
6
7
8
9
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
nodeName: kwok-node-1
containers:
- name: nginx
image: nginx

或者使用 kwok 官网介绍的属性更丰富的 Pod 配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
apiVersion: apps/v1
kind: Deployment
metadata:
name: fake-pod
namespace: default
spec:
replicas: 10
selector:
matchLabels:
app: fake-pod
template:
metadata:
labels:
app: fake-pod
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: type
operator: In
values:
- kwok
# A taints was added to an automatically created Node.
# You can remove taints of Node or add this tolerations.
tolerations:
- key: "kwok.x-k8s.io/node"
operator: "Exists"
effect: "NoSchedule"
containers:
- name: fake-container
image: fake-image
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 命令外,还可以使用以下方法:

  1. 使用 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. 手动删除节点:

    1
    kubectl delete node kwok-node-1 kwok-node-2 ...
  2. 或者使用标签选择器批量删除:

    1
    kubectl delete node -l kwok.x-k8s.io/node=fake

这些虚拟节点不会对实际集群造成影响,因为:

  • 它们只是模拟的节点,不会消耗实际资源
  • 它们有特殊的污点(taint),不会调度实际的 Pod
  • 它们的状态是 kwok 控制器模拟的,不会影响实际集群的运行

7.4 kwok 到底起了什么作用

kwok 是一个轻量级的 Kubernetes 资源模拟器,它的工作原理如下:

  1. 资源模拟机制:

    • kwok 控制器会监听 Kubernetes API 服务器的请求
    • 当 Kubernetes API Server 请求资源状态时,kwok 会返回模拟的状态信息
    • 这些状态信息包括节点的 CPU、内存、网络等资源使用情况
    • kwok 不会真正创建或运行任何容器,只是”欺骗” Kubernetes API Server
  2. 与 Kubernetes 的交互:

    • 当使用 kubectl apply 创建资源时:
      1. kubectl 将请求发送到 Kubernetes API Server
      2. Kubernetes API Server 将资源信息存储在 etcd 中
      3. kwok 控制器检测到新资源,开始模拟其状态
      4. 当其他组件(如调度器)查询资源状态时,kwok 返回模拟数据
    • 当关闭 kwok 控制器时:
      1. 资源定义仍然存在于 etcd 中
      2. 但 kwok 不再提供模拟状态
      3. API 服务器会返回这些资源的真实状态(通常是 NotReady)
      4. 这些资源不会影响实际集群的运行,因为:
        • 它们有特殊的污点(taint),不会被调度实际的工作负载
        • 它们不消耗实际的系统资源
        • 它们只是 etcd 中的一些记录
  3. 实际应用场景:

    • 性能测试:可以模拟 1000 个节点,测试调度器性能
    • 开发测试:快速验证资源配置,无需等待实际资源创建
    • 演示环境:创建演示集群,展示 Kubernetes 功能
    • 学习环境:理解 Kubernetes 概念,无需实际资源
  4. 优势:

    • 轻量级:不消耗实际系统资源
    • 快速:可以瞬间创建大量节点
    • 安全:不会影响实际集群的运行
    • 灵活:可以模拟各种资源状态
  5. 限制:

    • 不能运行实际的容器
    • 不能测试实际的网络通信
    • 不能测试实际的存储操作
    • 主要用于测试 Kubernetes 控制平面的功能

🏥反思

  • kwok 适合大规模集群的性能测试场景。
  • 虚拟节点资源是模拟的,不能完全替代真实节点。
  • 建议结合 kind 等工具使用,构建完整的测试环境。


  • 希望这篇博客对你有帮助!如果你有任何问题或需要进一步的帮助,请随时提问。
  • 如果你喜欢这篇文章,欢迎动动小手给我一个follow或star。

🗺参考文献

[1] KWOK (Kubernetes WithOut Kubelet) 官方文档

[2] 介绍 KWOK(Kubernetes WithOut Kubelet,没有 Kubelet 的 Kubernetes) - Kubernetes 博客

[3] 使用kwok测试kube-scheduler

[4] KWOK: 1000节点集群,5秒搭建好

  • 标题: 【集群】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 进行许可。
评论