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

搭建 kubemark 流程

搭建详细流程参考k8s 官方文档

由于官方搭建的 kubemark 集群依赖比较多且不是特别符合我们的场景,所以以下针对金上云的集群环境搭建测试集群。

  1. 先使用金山云平台搭建两个真实的集群。集群规格是 3 master(2c4g), 2 node(32c64g),一个作为 kubemark 集群, 另一个用来部署 hollow-node pod,称为 support 集群。
  2. 配置本地 kubectl 连接到support集群。
  3. 在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
  1. 当hollow pod ready 后,进入 kubemark 集群可以看到有对应的node注册成功。

seamounts
26 声望2 粉丝

docker、k8s 开发