原文链接:kubemark 搭建测试集群
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的测试数据,虽然与真实集群的稍微有点误差,不过可以代表真实集群的数据。因此,可以借用Kubermark,直接在真实集群上跑E2E测试,从而对我们真实集群进行性能测试。
kubemark 架构
kubemark cluster 包括两部分: 一个真实的master集群和一系列 “hollow” node, "hollow node" 只是模拟了kubelet的行为,并不是真正的node,不会启动任何的pod和挂载卷。
一般搭建kubemark 测试集群需要一个真实的集群(external cluster)和一个 kubemark master。hollowNode 以pod的形式运行在 external cluster 中,并连接 kubemark master 将自己注册为kubemark master 的 node。
kubemark master 结构图:
搭建 kubemark 流程
搭建详细流程参考k8s 官方文档
由于官方搭建的 kubemark 集群依赖比较多且不是特别符合我们的场景,所以以下针对金上云的集群环境搭建测试集群。
先使用金山云平台搭建两个真实的集群。集群规格是 3 master(2c4g), 2 node(32c64g),一个作为 kubemark 集群, 另一个用来部署 hollow-node pod,称为 support 集群。
配置本地 kubectl 连接到support集群。
-
在support集群创建如下资源
# 创建 kubemark namespace kubectl create ns kubemark # 创建 node-configmap kubectl create configmap node-configmap -n kubemark --from-literal=content.type="test-cluster"
获取 kubemark 集群的kubeconfig,创建secret
# 创建 secret kubeconfig kubectl create secret generic kubeconfig --type=Opaque --namespace=kubemark --from-file=kubelet.kubeconfig={kubeconfig_file_path} --from-file=kubeproxy.kubeconfig={{kubeconfig_file_path}}
创建 hollow pod, 该pod运行 kubelet 和 kubeproxy 服务,且配置连接到 kubemark 集群。
kubectl apply -f hollow-node.yaml -n kubemark
hollow-node.yaml 示例内容:
apiVersion: v1 kind: ReplicationController metadata: name: hollow-node 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 command: ['sysctl', '-w', 'fs.inotify.max_user_instances=200'] securityContext: privileged: true volumes: - name: kubeconfig-volume secret: secretName: kubeconfig containers: - name: hollow-kubelet image: hsxue/kubemark:v1.10.5 ports: - containerPort: 4194 - containerPort: 10250 - containerPort: 10255 env: - name: CONTENT_TYPE valueFrom: configMapKeyRef: name: node-configmap key: content.type - name: NODE_NAME valueFrom: fieldRef: fieldPath: metadata.name command: - /bin/sh - -c - /kubemark --morph=kubelet --name=$(NODE_NAME) --kubeconfig=/kubeconfig/kubelet.kubeconfig $(CONTENT_TYPE) --alsologtostderr --v=2 volumeMounts: - name: kubeconfig-volume mountPath: /kubeconfig readOnly: true securityContext: privileged: true - name: hollow-proxy image: hsxue/kubemark:v1.10.5 env: - name: CONTENT_TYPE valueFrom: configMapKeyRef: name: node-configmap key: content.type - name: NODE_NAME valueFrom: fieldRef: fieldPath: metadata.name command: - /bin/sh - -c - /kubemark --morph=proxy --name=$(NODE_NAME) --use-real-proxier=false --kubeconfig=/kubeconfig/kubeproxy.kubeconfig $(CONTENT_TYPE) --alsologtostderr --v=2 volumeMounts: - name: kubeconfig-volume mountPath: /kubeconfig readOnly: true
当hollow pod ready 后,进入 kubemark 集群可以看到有对应的node注册成功。