searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

k8s性能测试(一)--kubemark测试环境搭建

2023-06-28 00:50:42
442
0

一、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文件 是否和被测试环境一致。

0条评论
0 / 1000
陆****林
2文章数
0粉丝数
陆****林
2 文章 | 0 粉丝
陆****林
2文章数
0粉丝数
陆****林
2 文章 | 0 粉丝
原创

k8s性能测试(一)--kubemark测试环境搭建

2023-06-28 00:50:42
442
0

一、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文件 是否和被测试环境一致。

文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
0
0