一、kubemark 工具介绍
在 K8s 的使用中,我们经常会遇到这样一个场景:需要测试大规模集群的性能表现,而现有的物理资源不足。kubemark是K8S官方给出的性能测试工具,能够利用相当小的资源,模拟出一个大规模K8S集群。其主要架构如图所示:
需要一个外部 K8S集群(external cluster),需要带有worker节点,用来承载hollow pod. 一套完整的kubemark master控制面(kubemark集群)--即被测试环境。我们需要在external cluster中部署运行hollow pod,这些pod会主动向kubemark集群中的master注册,成为kubemark集群中的 hollow node(虚拟节点)。然后我们就可以在kubemark集群中进行性能测试。虽然与真实集群的稍微有点误差,不过可以代表真实集群的数据。
二、搭建测试环境
2.1 构建 kubemark 镜像
首先准备一个 linux 操作系统环境, 安装好golang 和docker。注意golang版本需要1.8及以上, 以防编译kubemark时出错。
goproxy 配置成国内代理, 这样方便拉取第三方库。 配置方法如下
$ go env -w GO111MODULE=on
$ go env -w GOPROXY=https://goproxy.cn,direct
在gopath 目录下新建src/k8s.io目录, 然后从github上下载kubernetetes 源码 :
mkdir -p $GOPATH/src/k8s.io/
cd $GOPATH/src/k8s.io/
git clone https://github.com/kubernetes/kubernetes.git
下载完成后,根据被测试环境的k8s版本,切换到对应的分支。先编译kubemark 二进制文件。编译出的二进制存储在 _output
目录下
cd kubernetes
git checkout v1.20.10 # 此处为kubemark k8s对应的版本
./hack/build-go.sh cmd/kubemark/
然后制作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命令看到。可以用docker tag 命令给镜像打一个新的标签。
比如k8s.gcr.io/kubemark:v1.23.1 便于区分不同版本镜像。
2.2 搭建hollow node 集群
首先,准备好一个k8s集群 作为 external cluster。此处可以用kubeadmin工具快速部署,方法略过,可参考文档kubeadm 安装 · Kubernetes 中文文档 (zhaowenyu.com)。
将上一步中制作的kubemark镜像上传到改集群中。登录任意external cluster的master节点,执行以下操作:
1.将被测试k8s集群的config文件(主节点的/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
使用以下yaml创建资源。 该yaml 文件在k8s源码中有一个模板hollow-node_template.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
刚开始可将replicas 值设置为1, 这样可快速测试hollow pod能否正常运行并注册成功。
等待hollow pod状态变为running后, 到被测试 k8s集群中中,确认hollow pod已经作为hollow node被注册到集群中。
三、常见的问题
1. hollow pod 不能正常运行
这种情况常常是由于在制作镜像的过程中缺少了相关库或依赖导致,根据错误提示安装对应的依赖即可解决。
比如编译kubemark过程中依赖glibc,如果系统glibc版本过低,会导致hollow pod 运行失败。
2、hollow pod 运行正常,但是在被测环境上注册失败。
这种情况可检查下kubemark版本和被测试环境是否一致。或者确认 创建hollow pod负载时使用的config文件 是否和被测试环境一致。