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

行万里路,此处相逢,共话云原生之道。

偶逗趣事,明月清风,与君同坐。

琦彦,在云原生百宝箱公众号等你,与你一起探讨应用迁移,GitOps,二次开发,解决方案,CNCF生态,以及生活况味。


你是否曾想过在几秒钟内搭建一个由数千个节点构成的集群,如何用少量资源模拟真实的节点, 如何不耗费太多基础设施就能大规模地测试你的 Kubernetes 控制器?

如果你曾有过这些想法,那你可能会对 KWOK 有兴趣。KWOK 是一个工具包,能让你在几秒钟内创建数千个节点构成的集群。

null

由数千个节点构成的集群

什么是 KWOK?

KWOK 是 Kubernetes WithOut Kubelet 的缩写,即没有 Kubelet 的 Kubernetes。到目前为止,KWOK 提供了两个工具:

  • kwok 是这个项目的基石,负责模拟伪节点、Pod 和其他 Kubernetes API 资源的生命周期。

  • kwokctl 是一个 CLI 工具,设计用于简化创建和管理由 kwok 模拟节点组成的集群。

为什么使用 KWOK?

KWOK 具有下面几点优势:

  • 速度 :你几乎可以实时创建和删除集群及节点,无需等待引导或制备过程

  • 兼容性 :KWOK 能够与兼容 Kubernetes API 的所有工具或客户端(例如 kubectl、helm、kui)协同作业。

  • 可移植性 :KWOK 没有特殊的软硬件要求。一旦安装了 Docker 或 Nerdctl,你就可以使用预先构建的镜像来运行 KWOK。另外,二进制文件包适用于所有平台,安装简单。

  • 灵活 :你可以配置不同类型的节点、标签、污点、容量、状况等,还可以配置不同的 Pod 行为和状态来测试不同的场景和边缘用例。

  • 性能 :你在自己的笔记本电脑上就能模拟数千个节点,无需大量消耗 CPU 或内存资源。

使用场景是什么?

KWOK 可用于各种用途:

  • 学习:你可以使用 KWOK 学习 Kubernetes 概念和特性,无需顾虑资源浪费或其他后果。

  • 开发:你可以使用 KWOK 为 Kubernetes 开发新特性或新工具,无需接入真实的集群,也不需要其他组件。

  • 测试

  • • 你可以衡量自己的应用程序或控制器 在使用不同数量节点和 Pod 时的扩缩表现如何。

  • • 你可以用不同的资源请求或限制创建大量 Pod 或服务,在集群上营造高负载的环境

  • • 你可以通过更改节点状况或随机删除节点来模拟节点故障或网络分区

  • • 你可以通过启用不同的特性门控或 API 版本来测试控制器如何与其他组件交互

有哪些限制?

KWOK 并非试图完整替代其他什么。当然也有一些限制需要你多加注意:

  • 功能性 :KWOK 不是 kubelet。KWOK 在 Pod 生命周期管理、卷挂载和设备插件方面所展现的行为与 kubelet 不同。 KWOK 的主要功能是模拟节点和 Pod 状态的更新。

  • 准确性 :需要重点注意 KWOK 还不能确切地反映各种工作负载或环境下真实节点的性能或行为。KWOK 只能使用一些公式来逼近真实的节点行为。

  • 安全性KWOK 没有对模拟的节点实施任何安全策略或安全机制。KWOK 假定来自 kube-apiserver 的所有请求都是经过授权且是有效的。

kwok的主要组件是一个Kubernetes控制器,它模拟集群资源,包括节点和pod。这可以在现有的 Kubernetes 集群(即 Kind)上完成,或者你可以使用提供的 kwokctl 工具创建类似集群。

KWOK入门

该项目相当新,可以使用Homebrew进行安装。

复制代码
brew install kwok

如果你不使用 Homebrew,那么你将需要执行几个步骤。

ini 复制代码
# 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')

安装kwokctl

bash 复制代码
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

安装kwok

行万里路,此处相逢,共话云原生之道。

偶逗趣事,明月清风,与君同坐。

琦彦,在云原生百宝箱公众号等你,与你一起探讨应用迁移,GitOps,二次开发,解决方案,CNCF生态,以及生活况味。

bash 复制代码
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

这将在你的本地计算机上安装两个二进制文件:

  • • kwokctl --- 也是一个 CLI 管理,允许你使用 Docker 建立独立集群(类似于 Kind 集群)。

  • • kwok --- 负责模拟集群及其资源的资源控制器。

创建集群

要在本地模拟假集群,请确保你的 Docker 守护进程已启动并正在运行。然后使用以下命令创建集群

lua 复制代码
kwokctl create cluster --name kwok-cluster

这将下载并运行必要的 Docker 镜像来设置新集群。你可以通过以下方式验证这一点:

bash 复制代码
$ docker ps
CONTAINER ID   IMAGE                                             COMMAND                  CREATED          STATUS          PORTS                                NAMES
aba80a50803A   registry.k8s.io/kwok/kwok:v0.1.1                  "kwok --manage-all-n..."   11 minutes ago   Up 11 minutes                                        kwok-kwok-cluster-kwok-controller
7df468aaecf7   registry.k8s.io/kube-controller-manager:v1.26.0   "kube-controller-man..."   11 minutes ago   Up 11 minutes                                        kwok-kwok-cluster-kube-controller-manager
ac2d44e4f259   registry.k8s.io/kube-scheduler:v1.26.0            "kube-scheduler --ku..."   11 minutes ago   Up 11 minutes                                        kwok-kwok-cluster-kube-scheduler
2bbe46094c41   registry.k8s.io/kube-apiserver:v1.26.0            "kube-apiserver --ad..."   11 minutes ago   Up 11 minutes   0.0.0.0:32766->6443/tcp              kwok-kwok-cluster-kube-apiserver
2eb999726db3   registry.k8s.io/etcd:3.5.6-0                      "etcd --name=node0 -..."   11 minutes ago   Up 11 minutes   2379-2380/tcp, 4001/tcp, 7001/tcp

验证集群是否已创建:

arduino 复制代码
$ kwokctl get clusters
kwok-cluster

启动资源控制器

接下来,你需要启动 kwok 资源控制器。你可以通过在单独的终端中运行 kwok 二进制文件(如此处演示)来完成此操作。你还可以在集群中运行控制器(有关详细信息,请参阅 kwok 文档)。

ini 复制代码
$ kwok \
  --kubeconfig=~/.kube/config \
  --manage-all-nodes=true \
  --cidr=10.0.0.1/24 \
  --node-ip=10.0.0.1

上面的命令启动 kwok 资源控制器,并指定该控制器将所有节点作为 Kwok 节点进行管理。由于该集群不与另一个集群共享,因此这是有道理的。否则,你需要添加其他参数来过滤 Kwok 节点和资源。

添加节点

接下来,使用节点定义创建一个文件,如下所示。你可以将任意数量的节点添加到你想要模拟的 YAML 文件中。

bash 复制代码
apiVersion: v1
items:
- apiVersion: v1
  kind: Node
  metadata:
    annotations:
      node.alpha.kubernetes.io/ttl: "0"
      kwok.x-k8s.io/node: fake
    labels:
      beta.kubernetes.io/arch: arm64
      beta.kubernetes.io/os: linux
      kubernetes.io/arch: arm64
      kubernetes.io/hostname: kwok-node-0
      kubernetes.io/os: linux
      minikube.k8s.io/name: kwok-node-0
      minikube.k8s.io/primary: "true"
      node-role.kubernetes.io/control-plane: ""
      node-role.kubernetes.io/master: ""
      type: kwok
    name: kwok-node-0
  spec:
    taints: # Avoid scheduling 
      - effect: NoSchedule
      key: kwok.x-k8s.io/node
      value: fake
  status:
    allocatable:
      cpu: "4"
      memory: 512Gi
      pods: "110"
    capacity:
      cpu: "4"
      memory: 512Gi
      pods: "110"
    nodeInfo:
      architecture: arm64
      kubeProxyVersion: fake
      kubeletVersion: fake
      operatingSystem: linux
---
### Add more nodes

接下来,我们需要将节点应用到集群中。执行此操作之前,请确保你使用正确的集群上下文:

arduino 复制代码
$ kubectl config use-context kwok-kwok-cluster

然后,使用 kubectl 工具应用节点:

复制代码
kubectl apply -f nodes.yaml

成功应用 YAML 后,你可以在集群中看到你的节点:

arduino 复制代码
$ kubectl get nodes
NAME          STATUS   ROLES   AGE   VERSION
kwok-node-0   Ready    agent   32s   fake
kwok-node-1   Ready    agent   32s   fake
kwok-node-2   Ready    agent   32s   fake
kwok-node-3   Ready    agent   32s   fake
kwok-node-4   Ready    agent   32s   fake
kwok-node-5   Ready    agent   32s   fake
kwok-node-6   Ready    agent   32s   fake

部署应用

现在你已经有了一个运行着多个假节点的 kwok 集群,你可以向其部署应用,就像它是一个真正的集群一样

定义具有大量副本的Deployment。

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: fake-web-1
  namespace: default
spec:
  replicas: 100
  selector:
    matchLabels:
      app: fake-web-1
  template:
    metadata:
      labels:
        app: fake-web-1
    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

---
## Add as many resources as needed

和以前一样,你可以根据需要添加任意数量的虚假资源。接下来,应用 YAML 文件,如下所示:

php 复制代码
$ kubectl apply -f deployments.yaml

几秒钟之内,你将看到你的假资源出现在集群中:

vbnet 复制代码
$ kubectl get deployments
NAME             READY     UP-TO-DATE   AVAILABLE   AGE
fake-backend-1   25/25     25           25          42s
fake-backend-2   10/10     10           10          42s
fake-web-1       100/100   100          100         42s
fake-web-2       50/50     50           50          42s

总结

行万里路,此处相逢,共话云原生之道。

偶逗趣事,明月清风,与君同坐。

琦彦,在云原生百宝箱公众号等你,与你一起探讨应用迁移,GitOps,二次开发,解决方案,CNCF生态,以及生活况味。

相比于kubemark,kubemark是一个 kubelet,实际上并不运行容器。它的行为与 kubelet 完全相同,这意味着模拟大量节点和 pod 需要大量内存。然而,kwok只是模拟节点的行为。因此,它可以使用很少的内存来模拟大量节点和 Pod

相比于kind,kind在 Docker 中运行 Kubernetes,创建一个真正的集群。kwokctl在某些不需要实际运行任何 pod 的场景中,可以用作 kind的替代方案

简而言之,Kwok 是云原生生态系统的一个重要补充,能让你在几秒钟内创建数千个节点构成的集群,用来测试集群和应用的性能是如此地丝滑和简便

本文使用 文章同步助手 同步

相关推荐
Connie14511 天前
记一次K8s故障告警排查(Grafna告警排查)
云原生·容器·kubernetes·grafana
谷隐凡二1 天前
Kubernetes主从架构简单解析:基于Python的模拟实现
python·架构·kubernetes
陈陈CHENCHEN1 天前
SuperMap iManager for K8s 离线环境镜像仓库 Containerd 部署
kubernetes
会飞的小蛮猪1 天前
Ubuntu24.04 基于Containerd部署K8s1.34(私服部署)
docker·云原生·kubernetes
间彧2 天前
Kubernetes滚动发布详解
kubernetes
间彧2 天前
在实际生产环境中,Kubernetes声明式API如何实现蓝绿部署、金丝雀发布等高级部署策略?
kubernetes
间彧2 天前
Kubernetes声明式API相比传统命令式API在故障恢复场景下的具体优势有哪些?
kubernetes·github
间彧2 天前
为什么说Kubernetes的API设计是其成功的关键因素之一?
kubernetes
间彧2 天前
Kubernetes Deployment 配置简化实战:从复杂到高效
kubernetes
可爱的小小小狼2 天前
k8s:服务网格Service Mesh(服务网格)istio和envoy
kubernetes·istio·service_mesh