Kubernetes-Master 基准测试

news/2024/11/19 4:24:26/文章来源:https://www.cnblogs.com/david-cloud/p/18291763

背景

Kubernetes是容器集群管理系统,为容器化的应用提供资源调度、部署运行、滚动升级、扩容缩容等功能。容器集群管理给业务带来了便利,但是随着业务的不断增长,应用数量可能会发生爆发式的增长。那在这种情况下,Kubernetes能否快速地完成扩容、扩容到大规模时Kubernetes管理能力是否稳定成了挑战。

提前测试目前 Kubernetes 能承载的最大 Node、Pod 数量。

SLI & SLO

SLI(Service Level Indicator):服务等级指标,其实就是我们选择哪些指标来衡量我们的稳定性。

SLO(Service Level Objective):服务等级目标,指的就是我们设定的稳定性目标,比如“几个 9”这样的目标。

SLO 是 SLI 要达成的目标,我们需要选择合适的 SLI,设定对应的 SLO。

官方提供了三个指标,如下

SLISLO测试方法
Latency of processing mutating API calls for single objects for every (resource, verb) pair, measured as 99th percentile over last 5 minutes 99Line <= 1s 官方 Kubemark + perf-test
Latency of processing non-streaming read-only API calls for every (resource, scope) pair, measured as 99th percentile over last 5 minutes (a) <= 1s if scope=resource (b) <= 30s otherwise (if scope=namespace or scope=cluster) 官方 Kubemark + perf-test
Startup latency of schedulable stateless pods, excluding time to pull images and run init containers, measured from pod creation timestamp to when all its containers are reported as started and observed via watch, measured as 99th percentile over last 5 minutes 99Line <= 5s 官方 Kubemark + perf-test

上面我们有了“性能指标”,以及这些性能指标的“判断条件”。那么怎么测试?

Kubernetes开源了Clusterloader2性能测试框架,帮助我们完成上面的测试过程,并且统计测试结果。

Clusterloader2主要提供了两个测试用例:

(1)密度测试:该测试用例主要用来测试节点规模和容器规模的性能指标。它的大致思路是:在一个有N个节点的集群中,连续创建30*N个Pod,然后再删除这些Pod,然后跟踪这个过程中,上面的三个SLO是否满足。

(2)负载测试:该测试用例的主要思路是,向K8S进行大量的各种类型的资源创建、删除、LIST以及其他操作,然后跟踪这个过程中,上面的三个SLO是否满足。

另外,由于在大多数场景中,无法真实创建5000个节点,Kubernetes开源了一个kubemark项目,用来模拟真实节点。

使用 kubemark 模拟100个 Node 节点

环境说明:

  • work 环境作为 性能测试环境
  • test 环境节点,作为 node 提供方

kubemark项目编译及镜像制作

# 下载指定版本源码
git clone -b v1.18.10 https://github.com/kubernetes/kubernetes.git
cd kubernetes/./hack/build-go.sh cmd/kubemark/
cp _output/bin/kubemark cluster/images/kubemark/
cd cluster/images/kubemark/
# 修改 Dockerfile 中镜像为 centos:7
make build
# 改镜像仓库,改tag,push,方便其他节点使用
docker tag staging-k8s.gcr.io/kubemark:latest wangzhichidocker/kubemark:0.1
docker push wangzhichidocker/kubemark:0.1# test master 操作
kubectl create ns kubemark
kubectl create configmap node-configmap -n kubemark --from-literal=content.type="test-cluster"
# 将 work 环境master 节点的 /root/.kube/config 拷贝过来
kubectl create secret generic kubeconfig --type=Opaque --namespace=kubemark --from-file=kubelet.kubeconfig=config --from-file=kubeproxy.kubeconfig=config# 打标签
kubectl  label node $NodeName name=hollow-node# NodeName  修改maxPods值 2000
kubectl  apply -f deploy.yaml
# deploy.yaml 内容如下
 

kubemark 虚化建立 100 个 node

apiVersion: apps/v1
kind: Deployment
metadata:name: hollow-nodenamespace: kubemarklabels:name: hollow-node
spec:replicas: 100       ###启动的虚拟节点的数量selector: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: wangzhichidocker/kubemark:0.1imagePullPolicy: 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 $(CONTENT_TYPE) --alsologtostderr --v=2volumeMounts:- name: kubeconfig-volumemountPath: /kubeconfigreadOnly: truesecurityContext:privileged: true- name: hollow-proxyimage: wangzhichidocker/kubemark:0.1imagePullPolicy: 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 $(CONTENT_TYPE) --alsologtostderr --v=2volumeMounts:- name: kubeconfig-volumemountPath: /kubeconfigreadOnly: truetolerations:- operator: "Exists"affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:  # 硬策略nodeSelectorTerms:- matchExpressions:- key: nameoperator: Invalues:- hollow-node
 

使用 Clusterloader2 进行性能测试

cd /root/go/src/k8s.io
git clone -b release-1.18  https://github.com/kubernetes/perf-tests.git --depth 1
cd perf-tests/clusterloader2/
go env -w GO111MODULE=off
go build -o clusterloader './cmd/'# 找到测试目录
cd testing/density/
cp config.yaml config.yaml.bak
# 修改 config.yaml 中的变量
NODES_PER_NAMESPACE 改为 10
# pkg/execservice/manifest/exec_deployment.yaml 和 testing/density/deployment.yaml 镜像地址# 安装配置 Prometheus 抓取指标
git clone https://github.com/prometheus-operator/kube-prometheus.git --depth 1
kubectl create -f manifests/setup
kubectl create -f manifests/
# 删除 Prometheus 的网络策略 和不必要的 target
# 否则网络不通,同时创建性能测试时会卡住
kubectl -n monitoring delete  networkpolicies.networking.k8s.io prometheus-k8s
kubectl -n monitoring delete networkpolicies.networking.k8s.io grafana
kubectl -n monitoring delete servicemonitors.monitoring.coreos.com  kubelet
kubectl -n monitoring delete servicemonitors.monitoring.coreos.com node-exporter
kubectl -n monitoring  delete daemonsets.apps node-exporter
# 导入 SLO dashboard(pkg/prometheus/manifests/dashboards/slo.json),更改规则,record metric
kubectl apply -f pkg/prometheus/manifests/prometheus-rules.yaml
# 配置全局的变量
cp /root/.ssh/id_rsa /root/.ssh/google_compute_engine # benchmark 需要
cd ../..
KUBE_CONFIG=${HOME}/.kube/config
PROVIDER='kubemark'
MASTER_SSH_IP=$MASTER_SSH_IP
KUBE_SSH_KEY_PATH=$HOME/.ssh/id_rsa
MASTER_SSH_USER_NAME=root
TEST_CONFIG='./testing/density/config.yaml'
./clusterloader --kubeconfig=$KUBE_CONFIG --provider=$PROVIDER --masterip=$MASTER_SSH_IP --testconfig=$TEST_CONFIG --report-dir="./reports" --alsologtostderr --enable-prometheus-server=true --tear-down-prometheus-server=false --kubemark-root-kubeconfig=$KUBE_CONFIG  2>&1 | tee test.log# 此工具会先启动三个名为exec-pod的pod,之后通过配置的depolyment启动pod
 

分析报告

# APIResponsivenessPrometheus

cat APIResponsivenessPrometheus_density_2023-06-25T15\:25\:39+08\:00.json  | grep Perc99 | grep  -v '"Perc99": 0'
# 找到耗时较高的数值进行分析, Pod List 和 Node List 耗时较高{"data": {"Perc50": 34.481725,"Perc90": 95.6625,"Perc99": 14323},"unit": "ms","labels": {"Count": "1493","Resource": "pods","Scope": "cluster","SlowCount": "1490","Subresource": "","Verb": "LIST"}},{"data": {"Perc50": 35.494424,"Perc90": 1844.541666,"Perc99": 4349},"unit": "ms","labels": {"Count": "4634","Resource": "nodes","Scope": "cluster","SlowCount": "4629","Subresource": "","Verb": "LIST"}},
# vim PodStartupLatency_SaturationPodStartupLatency_density_2023-06-21T18\:01\:47+08\:00.json
# 分析调度延迟
{"version": "1.0","dataItems": [{"data": {"Perc50": 0,"Perc90": 0,"Perc99": 1000},"unit": "ms","labels": {"Metric": "create_to_schedule"}},{"data": {"Perc50": 0,"Perc90": 1000,"Perc99": 3000},"unit": "ms","labels": {"Metric": "schedule_to_run"}},{"data": {"Perc50": 212966.461221,"Perc90": 396976.212344,"Perc99": 445981.781733},"unit": "ms","labels": {"Metric": "run_to_watch"}},{"data": {"Perc50": 212973.348171,"Perc90": 396985.062556,"Perc99": 446977.294416},"unit": "ms","labels": {"Metric": "schedule_to_watch"}},{"data": {"Perc50": 212975.328713,"Perc90": 396985.234373,"Perc99": 446979.922275},"unit": "ms","labels": {"Metric": "pod_startup"}}]
}
 

image-20230625174155318

参考链接:

Kubernetes 官方 slosopen in new window

clusterloader2 测试使用文档open in new window

kubemark 设置文档open in new window

性能测试简介open in new window

运行density测试

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

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

相关文章

硬核案例分享,一文带你拆解PHP语言体系下的容器化改造

本文介绍了PHP语言体系应用现代化案例,实现了许多与业务无关的通用性应用改造方案,如PHP应用容器化架构方案、基于Prometheus的弹性伸缩方案等等,为此类型客户提供了一个可参考的案例。本文分享自华为云社区《PHP语言体系下的容器化改造,助力夺冠集团应用现代化》,作者: …

CoreDNS 概述及运维实践

概述 什么是 DNS ? 域名系统(英语:Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用TCP和UDP端口53。 DNS 不仅方便了人们访问不同的互联网服务,更为很多应用提供了,动态服务发…

从0开始装一套 KubeVirt 1.2.1

KubeVirt 架构 架构virt-api : 负责提供一些 KubeVirt 特有的 api,像是 console, vnc, startvm, stopvm 等。 virt-controller : 管理和监控 VMI 对象及其关联的 Pod,对其状态进行更新。 virt-hander : 以 DaemonSet 运行在每一个节点上,监听 VMI 的状态向上汇报,管理 VMI …

夏日狂欢,铁威马众多惊喜福利来袭,这很city!

随着618的尾声悄然落下 你是否还在为错失的优惠而扼腕叹息? 但请放下遗憾,精彩从未真正落幕。 铁威马夏日狂欢季 正是为你量身打造的专属福利时刻 众多优惠活动接踵而至 往下看⬇ 惊喜福利层出不穷 快来参与吧~ 以旧换新,焕新升级 想要换新机的朋友们,铁威马夏日狂欢季为你…

manim边学边做--Paragraph

对于长篇大段的文本显示,manim中专门提供了一个Paragraph类。使用Paragraph,就不需要用拼接Text的方式来显示大段的文本。Paragraph在manim各个模块中的位置大致如上图中所示。 1. 主要参数 Paragraph可以看作是基于Text的扩展,当你需要显示多行文本的时候,用Paragraph更加…

【免费】可视化工具如何重塑教育资源的呈现方式

相比于其他的付费软件,山海鲸可视化软件内提供了海量模板,而且可以直接下载使用,无需具备专业的编程知识即可快速上手,大大节省了学校制作数据可视化大屏的时间和精力。传统教育模式下,教育资源的分配、学生的学习进度、教师的教学质量等关键信息往往隐藏在海量的数据之中…

什么?这动物图片可以上国家地理?

众所周知,能上国家地理的照片肯定是好照片,那么我们能不能用SD做出类似国家地理地理风格图片呢?一起来看看吧stable difussion中大部分的模型都是关于人的,今天交给大家一些不一样的:如何生成动物图片。在这篇文章中我们将会学到如何生成逼真的动物,可爱的动物,还有幻想中的…

飞书集成平台写入多维表格报错2

报错详情 原因多维表格中缺少审批名称字段解决办法增加这个字段,即可。

飞书集成平台写入多维表格报错

报错信息如下 原因入参中传递对应的字段中是字符串,多维表格中是超链接类型。解决办法修改多维表格的字段类型为文本类型,即可。

7 Jenkins Job迁移

在工作中可能会遇到这样的场景,即需要把一个Jenkins Master上的job迁移到另外一台Jenkins Master上,那怎么做比较好呢? 如果只是单独的一个job且这个job的设置很简单,这种情况下当然可以直接在新的Jenkins Master上直接创建job然后从旧的job拷贝下配置即可。但如果job很多,…

DeepViT:字节提出深层ViT的训练策略 | 2021 arxiv

作者发现深层ViT出现的注意力崩溃问题,提出了新颖的Re-attention机制来解决,计算量和内存开销都很少,在增加ViT深度时能够保持性能不断提高 来源:晓飞的算法工程笔记 公众号论文: DeepViT: Towards Deeper Vision Transformer论文地址:https://arxiv.org/abs/2103.11886 论…

4.7 在 VS Code 中校验 Jenkinsfile

在日常工作中,我经常需要创建或修改很多 Jenkinsfile,有时还会发生错误。这是一个非常繁琐的流程——修改 Jenkinsfile,提交、推送,然后等 Jenkins 提醒你少加了一个括号。 Command-line Pipeline Linter(https://jenkins.io/doc/book/pipeline/development/) 可以有效地减…