Kubernetes集群性能测试之kubemark集群搭建

Kubernetes集群性能测试之kubemark集群搭建

Kubemark是K8s官方提供的一个对K8s集群进行性能测试的工具。它可以模拟出一个K8s cluster(Kubemark cluster),不受资源限制,从而能够测试的集群规模比真实集群大的多。这个cluster中master是真实的机器,所有的nodes是Hollow nodes。Hollow nodes执行的还是真实的K8s程序,只是不会调用Docker,因此测试会走一套K8s API调用的完整流程,但是不会真正创建pod。

Kubermark是在模拟的Kubemark cluster上跑E2E测试,从而获得集群的性能指标。Kubermark cluster的测试数据,虽然与真实集群的稍微有点误差,不过可以代表真实集群的数据,具体数据见Updates to Performance and Scalability in Kubernetes 1.3 – 2,000 node 60,000 pod clusters。因此,可以借用Kubermark,直接在真实集群上跑E2E测试,从而对我们真实集群进行性能测试。

在这里插入图片描述

kubemark包括两个部分:

  1. 一个真实的kubemark master控制面,可以是单节点也可以是多节点。
  2. 一组注册到kubemark集群中的Hollow node,通常是由另一个k8s集群(external集群)中的Pod模拟,该pod ip即为kubemark集群中对应Hollow node的IP。

说明:

上面的external和kubemark集群也可以使用一个集群进行测试。

kubemark项目编译及镜像制作

kubemark镜像可以使用网上已经构建好的,也可以自己构建。kubemark源码位于kubernetes项目中,编辑及制作kubemark镜像是搭建kubemark集群的第一步。准备好go语言环境,环境中需要安装docker,如果使用国内网络请自行配置goproxy及docker镜像加速源,然后执行命令:

mkdir -p go/src/k8s.io/
cd go/src/k8s.io/
# 克隆kubernetes源码
git clone https://github.com/kubernetes/kubernetes.git
cd kubernetes# 根据自己的需要,checkout目标分支
git checkout v1.19.0 -f# 编译
make WHAT='cmd/kubemark'
cp _output/bin/kubemark cluster/images/kubemark/
cd cluster/images/kubemark/
# 构建镜像,过程其实就是将编译构建的kubemark二进制文件拷贝到基础镜像中,可以根据需要修改Dockerfile文件。
sudo make build

说明:

默认情况下构建kubemark镜像的base镜像会从gcr.io仓库拉取base镜像,一方面该仓库需要魔法上网才能拉取,另外就是测试发现该镜像做了很多裁剪,不方面后续进入容器排查。这里可以改为使用其他镜像,例如centos:7。

制作出的容器镜像为staging-k8s.gcr.io/kubemark, 可以通过docker image ls命令看到:

test@ubuntu:~$ sudo docker images
REPOSITORY                         TAG       IMAGE ID       CREATED         SIZE
lldhsds/kubemark                   1.19.0    e38978301036   3 hours ago     116MB
staging-k8s.gcr.io/kubemark        1.19.0    e38978301036   3 hours ago     116MB
staging-k8s.gcr.io/kubemark        latest    e38978301036   3 hours ago     116MB

此镜像用于启动模拟k8s节点的pod容器,镜像构建完成后打包并导入到external k8s集群的各节点中。

这里构建镜像的时候默认会到gcr去拉取基础镜像,国内无法pull镜像,可以修改Dockefile文件改用其他基础镜像:

[root@k8s-master kubemark]# pwd
/root/go/src/k8s.io/kubernetes/cluster/images/kubemark
# 修改Dockerfile,改用centos7.0作为基础镜像构建kubemark镜像
[root@k8s-master kubemark]# cat Dockerfile
FROM centos:centos7.0.1406
COPY kubemark /kubemark
# 构建镜像
[root@k8s-master kubemark]# IMAGE_TAG=v1.19.0 make build
[root@k8s-master kubemark]# docker images | grep kubemark
staging-k8s.gcr.io/kubemark   v1.19.0           b3c808cf091c   3 hours ago    309MB

kubemark集群搭建实战

准备好两套K8S环境:

  • kubemark cluster: 进行性能测试的集群,上面会出现一些 hollow node

  • external cluster: 运行一些名为 hollow-node-* 的 pod 的集群,这些 pod 通过 kubemark cluster 的 kubeconfig 文件注册为 kubemark cluster 的 node

创建hollow-nodes步骤如下:

说明:

下面用到的一些配置文件来自源码路径,kubernetes/test/kubemark/resources/,不同版本配置文件可能不同。本文部署针对源码配置文件做了部分删减。

external集群创建 kubemark namespace

[root@k8s-master ~]# kubectl create ns kubemark

external集群创建配置:

# 在 external cluster创建configmap
[root@k8s-master ~]# kubectl create configmap node-configmap -n kubemark --from-literal=content.type="test-cluster"

准备 kubemark cluster 的 kubeconfig 文件:kubeconfig.kubemark

# 在 external cluster 上创建secret,其中kubeconfig为kubemark集群的kubeconfig文件
[root@k8s-master ~]# kubectl create secret generic kubeconfig --type=Opaque --namespace=kubemark --from-file=kubelet.kubeconfig=kubeconfig.kubemark --from-file=kubeproxy.kubeconfig=kubeconfig.kubemark

在k8s各个节点导入kubemark相关镜像,将上述构建的kubemark镜像,同时还会用到busybox镜像

# docker环境
docker load -i busybox.tar
docker load -i kubemark-v1.19.0.tar# containerd环境
ctr -n=k8s.io images import busybox.tar
ctr -n=k8s.io images import kubemark-v1.27.6.tar

准备hollow-node.yaml文件,该文件为创建hollow节点的配置文件:

以下yaml文件在k8s 1.19.0 + flannel 环境下测试正常:

apiVersion: apps/v1
kind: Deployment
metadata:name: hollow-nodenamespace: kubemarklabels:name: hollow-node
spec:replicas: 2selector:matchLabels:name: hollow-nodetemplate:metadata:labels:name: hollow-nodespec:nodeSelector:name: hollow-nodeinitContainers:- name: init-inotify-limitimage: busyboximagePullPolicy: IfNotPresentcommand: ['sysctl', '-w', 'fs.inotify.max_user_instances=524288']securityContext:privileged: truevolumes:- name: kubeconfig-volumesecret:secretName: kubeconfigcontainers:- name: hollow-kubeletimage: staging-k8s.gcr.io/kubemark:v1.19.0imagePullPolicy: IfNotPresentports:- containerPort: 4194- containerPort: 10250- containerPort: 10255env:- name: CONTENT_TYPEvalueFrom:configMapKeyRef:name: node-configmapkey: content.type- name: NODE_NAMEvalueFrom:fieldRef:fieldPath: metadata.namecommand:- /bin/sh- -c- /kubemark --morph=kubelet --name=$(NODE_NAME) --kubeconfig=/kubeconfig/kubelet.kubeconfig  --alsologtostderr --v=2volumeMounts:- name: kubeconfig-volumemountPath: /kubeconfigreadOnly: truesecurityContext:privileged: true- name: hollow-proxyimage: staging-k8s.gcr.io/kubemark:v1.19.0imagePullPolicy: IfNotPresentenv:- name: CONTENT_TYPEvalueFrom:configMapKeyRef:name: node-configmapkey: content.type- name: NODE_NAMEvalueFrom:fieldRef:fieldPath: metadata.namecommand:- /bin/sh- -c- /kubemark --morph=proxy --name=$(NODE_NAME) --use-real-proxier=false --kubeconfig=/kubeconfig/kubeproxy.kubeconfig  --alsologtostderr --v=2volumeMounts:- name: kubeconfig-volumemountPath: /kubeconfigreadOnly: truetolerations:- key: keyvalue: valueeffect: NoScheduleaffinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: nameoperator: Invalues:- hollow-node

说明:

上述配置文件中kubemark运行参数,由于pod启动报错,kubemark不识别,所以去掉了$(CONTENT_TYPE)参数。

如果集群是通过域名访问的,需要在hollow-node.yaml文件中添加如下配置:

spec:hostAliases:- ip: "10.233.0.1"   ###如果是高可用,则填写集群的vip地址hostnames:- "vip.sanyi.com"   ###集群域名nodeSelector:name: hollow-node 

以下yaml文件在k8s 1.27.6 + flannel 环境下测试正常,主要区别就是需要映射的volume和kubemark参数不同:

apiVersion: apps/v1
kind: Deployment
metadata:name: hollow-nodenamespace: kubemarklabels:name: hollow-node
spec:replicas: 3selector:matchLabels:name: hollow-nodetemplate:metadata:labels:name: hollow-nodespec:nodeSelector:name: hollow-nodeinitContainers:- name: init-inotify-limitimage: busyboximagePullPolicy: IfNotPresentcommand: ['sysctl', '-w', 'fs.inotify.max_user_instances=524288']securityContext:privileged: truevolumes:- name: kubeconfig-volumesecret:secretName: kubeconfig- name: containerdhostPath:path: /run/containerd- name: logs-volumehostPath:path: /var/logcontainers:- name: hollow-kubeletimage: staging-k8s.gcr.io/kubemark:v1.27.6imagePullPolicy: IfNotPresentports:- containerPort: 4194- containerPort: 10250- containerPort: 10255env:- name: CONTENT_TYPEvalueFrom:configMapKeyRef:name: node-configmapkey: content.type- name: NODE_NAMEvalueFrom:fieldRef:fieldPath: metadata.namecommand:- /bin/sh- -c- /kubemark --morph=kubelet --name=$(NODE_NAME) --kubeconfig=/kubeconfig/kubelet.kubeconfig  --v=2volumeMounts:- name: kubeconfig-volumemountPath: /kubeconfigreadOnly: true- name: logs-volumemountPath: /var/log- name: containerdmountPath: /run/containerdsecurityContext:privileged: true- name: hollow-proxyimage: staging-k8s.gcr.io/kubemark:v1.27.6imagePullPolicy: IfNotPresentenv:- name: CONTENT_TYPEvalueFrom:configMapKeyRef:name: node-configmapkey: content.type- name: NODE_NAMEvalueFrom:fieldRef:fieldPath: metadata.namecommand:- /bin/sh- -c- /kubemark --morph=proxy --name=$(NODE_NAME) --use-real-proxier=false --kubeconfig=/kubeconfig/kubeproxy.kubeconfig  --v=2volumeMounts:- name: kubeconfig-volumemountPath: /kubeconfigreadOnly: true- name: logs-volumemountPath: /var/log- name: containerdmountPath: /run/containerdtolerations:- key: keyvalue: valueeffect: NoScheduleaffinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: nameoperator: Invalues:- hollow-node

创建hollow pod和node:

# 为节点设置label,label与上述配置文件中的labels保持一致
[root@k8s-master1 kubemark]# kubectl label node k8s-master1 name=hollow-node
node/k8s-master1 labeled
[root@k8s-master1 kubemark]# kubectl label node k8s-node1 name=hollow-node
node/k8s-node1 labeled
[root@k8s-master1 kubemark]# kubectl label node k8s-node2 name=hollow-node
node/k8s-node2 labeled# 在 external cluster 创建相应的 hollow-node pod
[root@k8s-master ~]# kubectl create -f hollow-node.yaml
# 在 external cluster 检查相应的 hollow-node pod
[root@k8s-master ~]# kubectl  get pod -n kubemarkNAME                           READY   STATUS    RESTARTS   AGE
hollow-node-7b9b96674c-4kp7r   2/2     Running   0          23m
hollow-node-7b9b96674c-wzzf2   2/2     Running   0          23m# 在 kubemark cluster 上检查相应的 hollow node
[root@k8s-master ~]# kubectl get nodeNAME                           STATUS     ROLES    AGE     VERSION
hollow-node-7b9b96674c-4kp7r   Ready      <none>   22m     v1.19.0-dirty
hollow-node-7b9b96674c-wzzf2   Ready      <none>   23m     v1.19.0-dirty
k8s-master                     Ready      master   7d22h   v1.19.0
k8s-node1                      Ready      <none>   7d22h   v1.19.0
k8s-node2                      Ready      <none>   7d22h   v1.19.0# 进一步查看模拟hollow-node节点的容器和hollow-node节点上的容器(flannel容器没有运行,应该是kubemark没有适配该cni插件)
[root@k8s-master ~]# kubectl get pod -A -o wide | grep hollow-node-7b9b96674c-4kp7r
kube-flannel kube-flannel-ds-bvh8b  0/1 Init:0/2 0  34m 192.168.192.168   hollow-node-7b9b96674c-4kp7r   <none>           <none>
kube-system  kube-proxy-c92nr        1/1 Running  0  34m 192.168.192.168   hollow-node-7b9b96674c-4kp7r   <none>           <none>
kubemark  hollow-node-7b9b96674c-4kp7r  2/2 Running  0  34m 10.244.2.105   k8s-node2     <none>           <none>
monitoringnode-exporter-cdck9  2/2 Running  0 34m  192.168.192.168  hollow-node-7b9b96674c-4kp7r <none>   <none>

说明:关于模拟hollow node节点的pod资源,官方给出的建议是每个pod 0.1 CPU核心和220MB内存。

在hollow节点启动pod测试:

# 为hollow node节点添加标签,如下:
[root@k8s-master ~]# kubectl label node hollow-node-7b9b96674c-4kp7r app=nginx
[root@k8s-master ~]# kubectl label node hollow-node-7b9b96674c-wzzf2 app=nginx# 执行yaml脚本,在hollow节点启动pod,如下:
kubectl apply -f deploy-pod.yaml
###yaml问价内容如下:
---
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploylabels:app: nginx
spec:replicas: 2selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:nodeSelector:app: nginxcontainers:- name: nginx-deployimage: nginx:latestimagePullPolicy: IfNotPresent# 查看部署的容器
[root@k8s-master ~]# kubectl get pod -A -o wide | grep nginx-deploydefault   nginx-deploy-9654cffc5-l8c2w 1/1  Running  0  12m 192.168.192.168 hollow-node-7b9b96674c-wzzf2 <none> <none>
default   nginx-deploy-9654cffc5-smqpj 1/1  Running  0  12m 192.168.192.168 hollow-node-7b9b96674c-wzzf2 <none> <none>

参考文档

kubernetes 性能测试工具 kubemark-CSDN博客

Kubernetes集群性能测试 - 乐金明的博客 | Robin Blog (supereagle.github.io)

Kubernetes Community

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/41485.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

运维锅总详解系统启动流程

本文详细介绍Linux及Windows系统启动流程&#xff0c;并分析了它们启动流程的异同以及造成这种异同的原因。希望本文对您理解系统的基本启动流程有所帮助&#xff01; 一、Linux系统启动流程 Linux 系统的启动流程可以分为几个主要阶段&#xff0c;从电源开启到用户登录。每个…

有一个日期(Date)类的对象和一个时间(Time)类的对象,均已指定了内容,要求一次输出其中的日期和时间

可以使用友元成员函数。在本例中除了介绍有关友元成员函数的简单应用外&#xff0c;还将用到类的提前引用声明&#xff0c;请读者注意。编写程序&#xff1a; 运行结果&#xff1a; 程序分析&#xff1a; 在一般情况下&#xff0c;两个不同的类是互不相干的。display函…

关于Java异常机制及finally关键字的详解

异常机制(Exception) 软件程序在运行过程中&#xff0c;非常可能遇到异常问题。常见的异常&#xff1a; 1、用户输入错误 2、设备错误 3、硬件问题&#xff0c;例如打印机关掉、服务器问题 4、物理限制&#xff1a;磁盘满了 Java是采用面向对象的方式来处理异常的。 处理过程…

基于Java的水果商品销售网站

1 水果商品销售网站概述 1.1 课题简介 随着电子商务在当今社会的迅猛发展&#xff0c;水果在线销售已逐渐演变为一种极为便捷的购物方式&#xff0c;日益受到人们的青睐。本系统的设计初衷便是构建一个功能完备、用户体验友好的水果销售平台&#xff0c;致力于为用户提供优质、…

【植物大战僵尸杂交版】获取+存档插件

文章目录 一、还记得《植物大战僵尸》吗&#xff1f;二、在哪下载&#xff0c;怎么安装&#xff1f;三、杂交版如何进行存档功能概述 一、还记得《植物大战僵尸》吗&#xff1f; 最近&#xff0c;一款曾经在15年前风靡一时的经典游戏《植物大战僵尸》似乎迎来了它的"文艺复…

渐开线花键测量学习笔记分享

大家好&#xff0c;继续渐开线花键的相关内容&#xff0c;本期是渐开线花键测量相关的学习笔记分享&#xff1a; 花键检测项目有花键大径和小径检验&#xff1b;内花键齿槽宽和外花键齿厚&#xff0c;以及渐开线终止圆 和起始圆直径检测&#xff1b;齿距累计误差 、齿形误差 、…

排序算法简述(第八jiang)

目录 排序 选择排序 O(n2) 不稳定&#xff1a;48429 归并排序 O(n log n) 稳定 插入排序 O(n2) 堆排序 O(n log n) 希尔排序 O(n log2 n) 图书馆排序 O(n log n) 冒泡排序 O(n2) 优化&#xff1a; 基数排序 O(n k) 快速排序 O(n log n)【分治】 不稳定 桶排序 O(n…

Mysql-常用函数及其用法总结

1、字符串函数 测试用例如下&#xff1a; 1.1 CONCAT() 将多个字符串连接成一个字符串。 SELECT CONCAT(first_name, , last_name) AS full_name FROM users; -- 期望结果&#xff1a;John Doe, Jane Smith, Michael Johnson 1.2 SUBSTRING() 提取子字符串 SELECT SUBSTR…

STM32-PWR和WDG看门狗

本内容基于江协科技STM32视频学习之后整理而得。 文章目录 1. PWR1.1 PWR简介1.2 电源框图1.3 上电复位和掉电复位1.4 可编程电压监测器1.5 低功耗模式1.6 模式选择1.7 睡眠模式1.8 停止模式1.9 待机模式1.10 库函数 2. WDG看门狗2.1 WDG简介2.2 IWDG框图2.3 IWDG键寄存器2.4 …

13 学习总结:指针 · 其一

目录 一、内存和地址 &#xff08;一&#xff09;内存 &#xff08;二&#xff09;内存单元 &#xff08;三&#xff09;地址 &#xff08;四&#xff09;拓展&#xff1a;CPU与内存的联系 二、指针变量和地址 &#xff08;一&#xff09;创建变量的本质 &#xff08;二…

ASRock Creator系列GPU:为AI推理及多GPU系统打造,采用16针电源接口的Radeon RX 7900系列显卡

ASRock 正在筹备推出专为人工智能推理和多GPU系统设计的AMD GPU——Creator系列显卡。这一系列显卡采用双槽位、吹风式设计&#xff0c;并配备16针电源连接器&#xff0c;首发产品包括基于Navi 31架构的AMD Radeon RX 7900XTX和RX 7900 XT型号。这些原属于WS系列的显卡最初在20…

机器学习与现代医疗设备的结合:革新医疗健康的未来

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言 随着技术的不断进步&#xff0c;机器学习&#xff08;Machine Learning, ML&#xff09;在现代医疗设备中的应用正在改变着…

python基础语法 006 内置函数

1 内置函数 材料参考&#xff1a;内置函数 — Python 3.12.4 文档 Python 解释器内置了很多函数和类型&#xff0c;任何时候都能直接使用 内置函数有无返回值&#xff0c;是python自己定义&#xff0c;不能以偏概全说都有返回值 以下为较为常用的内置函数&#xff0c;欢迎补充…

什么是CTO?如何成为一名优秀的CTO?

一、什么是CTO&#xff1f; 首席技术官&#xff08;CTO&#xff09;是一位负责领导和管理企业技术战略的高级职务。CTO的主要职责包括规划技术战略、监督研发活动、领导技术团队等。 二、CTO的主要职责 首席技术官&#xff0c;即CTO&#xff0c;是企业中负责技术和研发的高级管…

Redies基础篇(一)

Redis 是一个高性能的key-value数据库。Redies支持存储的value类型相对更多&#xff0c;包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作&#xff0c;而且这些操作都是原子性的&#xff…

【ETABS】【RHINO】案例:Swallow to ETABS

文章目录 01. Swallow Overview总览1 LOAD&#xff1a;Defination of LoadCase、Response Combo2 SectionArea Section and Area Load&#xff08;面截面定义与指定&#xff0c;面荷载指定&#xff09;Frame Section with rebarattr and linear load&#xff08;带钢筋属性框架…

下载,连接mysql数据库驱动(最详细)

前言 本篇博客&#xff0c;我讲讲如何连接数据库&#xff1f;我使用mysql数据库举例。 目录 下载对应的数据库jar 包 百度网盘 存有8.4.0版本压缩包&#xff1a;链接&#xff1a;https://pan.baidu.com/s/13uZtXRmuewHRbXaaCU0Xsw?pwduipy 提取码&#xff1a;uipy 复制这…

STM32-TIM定时器

本内容基于江协科技STM32视频内容&#xff0c;整理而得。 文章目录 1. TIM1.1 TIM定时器1.2 定时器类型1.3 基本定时器1.4 通用定时器1.4 高级定时器1.5 定时中断基本结构1.6 预分频器时序1.7 计数器时序1.8 计数器无预装时序1.9 计数器有预装时序1.10 RCC时钟树 2. TIM库函数…

前端面试题11(浅谈JavaScript深拷贝与浅拷贝)

在JavaScript中&#xff0c;数据的复制可以分为浅拷贝&#xff08;Shallow Copy&#xff09;和深拷贝&#xff08;Deep Copy&#xff09;。这两种拷贝方式主要区别在于如何处理对象中的嵌套对象。下面我会详细解释这两者的概念、区别&#xff0c;并提供相应的实现代码。 浅拷贝…

【机器学习实战】Datawhale夏令营:Baseline精读笔记2

# AI夏令营 # Datawhale # 夏令营 在原有的Baseline上除了交叉验证&#xff0c;还有一种关键的优化方式&#xff0c;即特征工程。 如何优化特征&#xff0c;关系着我们提高模型预测的精准度。特征工程往往是对问题的领域有深入了解的人员能够做好的部分&#xff0c;因为我们要…