行万里路,此处相逢,共话云原生之道。
偶逗趣事,明月清风,与君同坐。
琦彦,在云原生百宝箱公众号等你,与你一起探讨应用迁移,GitOps,二次开发,解决方案,CNCF生态,以及生活况味。
你是否曾想过在几秒钟内搭建一个由数千个节点构成的集群,如何用少量资源模拟真实的节点, 如何不耗费太多基础设施就能大规模地测试你的 Kubernetes 控制器?
如果你曾有过这些想法,那你可能会对 KWOK 有兴趣。KWOK 是一个工具包,能让你在几秒钟内创建数千个节点构成的集群。
由数千个节点构成的集群
什么是 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,那么你将需要执行几个步骤。
# 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
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生态,以及生活况味。
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 守护进程已启动并正在运行。然后使用以下命令创建集群:
kwokctl create cluster --name kwok-cluster
这将下载并运行必要的 Docker 镜像来设置新集群。你可以通过以下方式验证这一点:
$ 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
验证集群是否已创建:
$ kwokctl get clusters
kwok-cluster
启动资源控制器
接下来,你需要启动 kwok 资源控制器。你可以通过在单独的终端中运行 kwok 二进制文件(如此处演示)来完成此操作。你还可以在集群中运行控制器(有关详细信息,请参阅 kwok 文档)。
$ kwok \
--kubeconfig=~/.kube/config \
--manage-all-nodes=true \
--cidr=10.0.0.1/24 \
--node-ip=10.0.0.1
上面的命令启动 kwok 资源控制器,并指定该控制器将所有节点作为 Kwok 节点进行管理。由于该集群不与另一个集群共享,因此这是有道理的。否则,你需要添加其他参数来过滤 Kwok 节点和资源。
添加节点
接下来,使用节点定义创建一个文件,如下所示。你可以将任意数量的节点添加到你想要模拟的 YAML 文件中。
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
接下来,我们需要将节点应用到集群中。执行此操作之前,请确保你使用正确的集群上下文:
$ kubectl config use-context kwok-kwok-cluster
然后,使用 kubectl 工具应用节点:
kubectl apply -f nodes.yaml
成功应用 YAML 后,你可以在集群中看到你的节点:
$ 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。
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 文件,如下所示:
$ kubectl apply -f deployments.yaml
几秒钟之内,你将看到你的假资源出现在集群中:
$ 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 是云原生生态系统的一个重要补充,能让你在几秒钟内创建数千个节点构成的集群,用来测试集群和应用的性能是如此地丝滑和简便。
本文使用 文章同步助手 同步