什么是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集群中进行性能测试。尽管与实在集群的略微有点误差,不过能够代表实在集群的数据。

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.gitcd kubernetesgit 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命令看到:

此镜像后续须要在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数据盘)

将之前制作好的kubemark镜像导入external k8s的worker节点上,登录任意external k8s的master节点,执行以下操作:
1.将kubemark k8s的config文件(任意kubemark k8s主节点的/root/.kube/config)拷贝到以后门路
2.执行以下命令在external k8s中创立ns及secret

kubectl create ns kubemarkkubectl create secret generic kubeconfig --type=Opaque --namespace=kubemark --from-file=kubelet.kubeconfig=config --from-file=kubeproxy.kubeconfig=config

3.应用以下yaml创立资源

apiVersion: v1kind: ReplicationControllermetadata:  name: hollow-node  namespace: kubemark  labels:    name: hollow-nodespec:  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即可

到kubemark k8s中,确认hollow pod曾经作为hollow node被注册到集群中:

至此,kubemark集群搭建结束。若想调整hollow node的数量,能够通过scale external k8s上hollow pod的rc资源replicas的形式进行。

我会在前面的文章中应用此集群及kbench工具,解说如何对k8s管制面进行性能测试。