K8S性能测试(一)--kubemark介绍及集群手动搭建

什么是kubemark kubemark是K8S官方给出的性能测试工具,能够利用相当小的资源,模拟出一个大规模K8S集群。其主要架构如图所示:需要一个外部 K8S集群(external cluster,需要带有worker节点)以及一套完整的kubemark master控制面(可以是单节点也可以是多节点),即另外一个 K8S集群(kubemark集群),但是该只有master节点,没有worker节点。我们需要在external cluster中部署运行hollow pod,这些pod会主动向kubemark集群中的master注册,成为kubemark集群中的 hollow node(虚拟节点)。然后我们就可以在kubemark集群中进行性能测试。虽然与真实集群的稍微有点误差,不过可以代表真实集群的数据。
K8S性能测试(一)--kubemark介绍及集群手动搭建
文章图片

kubemark包括两个部分:
一个真实的kubemark master控制面,可以是单节点也可以是多节点。
一组注册到kubemark集群中的Hollow node,通常是由另一个k8s集群中的Pod模拟,该pod ip即为kubemark集群中对应Hollow node的IP。
通常来说的kubernetes节点与master通信有两类组件:kubelet,kubeproxy,而在Hollow node中:
kubeproxy:使用HollowProxy代替,模拟无效的kukeproxy相关能力
kubelet:使用HollowKubelet代替,模拟无效的kubelet相关功能,同时暴漏cadvisor端口供heapster抓取数据
因此,Hollow nodes模拟了真实node上kubelet和kubeproxy的行为,可以对master组件做出正确响应,但是不会实际创建对应的pod等资源。
总结:在external kubernetes中创建hollow node,自动注册到kubemark kubernetes中作为fake node,然后在kubemark kubernetes中进行测试,从而测试k8s的管理面(Master)性能。
kubemark项目编译及镜像制作 kubemark源码位于kubernetes项目中,编辑及制作kubemark镜像是搭建kubemark集群的第一步。
准备好go语言版本1.17以上的环境,环境中需要安装docker,如果使用国内网络请自行配置goproxy及docker镜像加速源,然后执行命令:

mkdir -p $GOPATH/src/k8s.io/ cd $GOPATH/src/k8s.io/ git clone https://github.com/kubernetes/kubernetes.git cd kubernetes git checkout v1.20.10# 此处为kubemark k8s对应的版本 ./hack/build-go.sh cmd/kubemark/ cp $GOPATH/src/k8s.io/kubernetes/_output/bin/kubemark $GOPATH/src/k8s.io/kubernetes/cluster/images/kubemark/ cd $GOPATH/src/k8s.io/kubernetes/cluster/images/kubemark/ make build

制作出的容器镜像为 staging-k8s.gcr.io/kubemark,可以通过docker image ls命令看到:
K8S性能测试(一)--kubemark介绍及集群手动搭建
文章图片

此镜像后续需要在external k8s的worker节点中导入。
kubemark集群搭建实战 如果是自己从头开始搭建,需要搭建两套K8S集群,一套为external k8s,需要搭建master+worker;另一套为kubemark k8s,只需要master即可。可以使用kubespray搭建,或者使用kubeadm搭建,在本文中不赘述。
为方便演示,本次测试使用国内某云厂商提供的容器服务,创建两套K8S集群,配置如下:
external k8s:3节点Master(2核4G云主机+50G数据盘) + 2节点Worker(4核8G云主机+50G数据盘)
kubemark k8s:3节点Master(2核4G云主机+50G数据盘)
K8S性能测试(一)--kubemark介绍及集群手动搭建
文章图片

将之前制作好的kubemark镜像导入external k8s的worker节点上,登录任意external k8s的master节点,执行以下操作:
1.将kubemark k8s的config文件(任意kubemark k8s主节点的/root/.kube/config)拷贝到当前路径
2.执行以下命令在external k8s中创建ns及secret
kubectl create ns kubemark kubectl create secret generic kubeconfig --type=Opaque --namespace=kubemark --from-file=kubelet.kubeconfig=config --from-file=kubeproxy.kubeconfig=config

3.使用以下yaml创建资源
apiVersion: v1 kind: ReplicationController metadata: name: hollow-node namespace: kubemark labels: name: hollow-node spec: replicas: 3 selector: name: hollow-node template: metadata: labels: name: hollow-node spec: initContainers: - name: init-inotify-limit image: busybox:1.32 imagePullPolicy: IfNotPresent command: ['sysctl', '-w', 'fs.inotify.max_user_instances=1000'] securityContext: privileged: true volumes: - name: kubeconfig-volume secret: secretName: kubeconfig - name: logs-volume hostPath: path: /var/log - name: no-serviceaccount-access-to-real-master emptyDir: {} containers: - name: hollow-kubelet image: staging-k8s.gcr.io/kubemark:v1.20.10 imagePullPolicy: IfNotPresent ports: - containerPort: 4194 - containerPort: 10250 - containerPort: 10255 env: - name: NODE_NAME valueFrom: fieldRef: fieldPath: metadata.name command: [ "/kubemark", "--morph=kubelet", "--name=$(NODE_NAME)", "--kubeconfig=/kubeconfig/kubelet.kubeconfig", "--log-file=/var/log/kubelet-$(NODE_NAME).log", "--logtostderr=false" ] volumeMounts: - name: kubeconfig-volume mountPath: /kubeconfig readOnly: true - name: logs-volume mountPath: /var/log resources: requests: cpu: 50m memory: 100M securityContext: privileged: true - name: hollow-proxy image: staging-k8s.gcr.io/kubemark:v1.20.10 imagePullPolicy: IfNotPresent env: - name: NODE_NAME valueFrom: fieldRef: fieldPath: metadata.name command: [ "/kubemark", "--morph=proxy", "--name=$(NODE_NAME)", "--kubeconfig=/kubeconfig/kubeproxy.kubeconfig", "--log-file=/var/log/kubeproxy-$(NODE_NAME).log", "--logtostderr=false" ] volumeMounts: - name: kubeconfig-volume mountPath: /kubeconfig readOnly: true - name: logs-volume mountPath: /var/log resources: requests: cpu: 50m memory: 100M

等待hollow pod状态变为running即可
K8S性能测试(一)--kubemark介绍及集群手动搭建
文章图片

到kubemark k8s中,确认hollow pod已经作为hollow node被注册到集群中:
K8S性能测试(一)--kubemark介绍及集群手动搭建
文章图片

至此,kubemark集群搭建完毕。若想调整hollow node的数量,可以通过scale external k8s上hollow pod的rc资源replicas的方式进行。
【K8S性能测试(一)--kubemark介绍及集群手动搭建】我会在后面的文章中使用此集群及kbench工具,讲解如何对k8s控制面进行性能测试。

    推荐阅读