模拟 worker 节点的魔法师

Kubemark是K8s官方提供的一个对K8s集群进行性能测试的工具。它可以模拟出一个K8s 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 集群依赖比较多且不是特别符合我们的场景,所以以下针对金上云的集群环境搭建测试集群。

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

4、当hollow pod ready 后,进入 kubemark 集群可以看到有对应的node注册成功。