共计 3856 个字符,预计需要花费 10 分钟才能阅读完成。
什么是 kubemark
kubemark 是 K8S 官网给出的性能测试工具,可能利用相当小的资源,模拟出一个大规模 K8S 集群。其次要架构如图所示:须要一个内部 K8S 集群 (external cluster,须要带有 worker 节点) 以及一套残缺的 kubemark master 管制面(能够是单节点也能够是多节点),即另外一个 K8S 集群(kubemark 集群),然而该只有 master 节点,没有 worker 节点。咱们须要在 external cluster 中部署运行 hollow pod,这些 pod 会被动向 kubemark 集群中的 master 注册,成为 kubemark 集群中的 hollow node(虚构节点)。而后咱们就能够在 kubemark 集群中进行性能测试。尽管与实在集群的略微有点误差,不过能够代表实在集群的数据。
kubemark 包含两个局部:
一个实在的 kubemark master 管制面,能够是单节点也能够是多节点。
一组注册到 kubemark 集群中的 Hollow node,通常是由另一个 k8s 集群中的 Pod 模仿,该 pod ip 即为 kubemark 集群中对应 Hollow node 的 IP。
通常来说的 kubernetes 节点与 master 通信有两类组件:kubelet,kubeproxy,而在 Hollow node 中:
kubeproxy:应用 HollowProxy 代替,模仿有效的 kukeproxy 相干能力
kubelet:应用 HollowKubelet 代替,模仿有效的 kubelet 相干性能,同时暴漏 cadvisor 端口供 heapster 抓取数据
因而,Hollow nodes 模仿了实在 node 上 kubelet 和 kubeproxy 的行为,能够对 master 组件做出正确响应,然而不会理论创立对应的 pod 等资源。
总结:在 external kubernetes 中创立 hollow node,主动注册到 kubemark kubernetes 中作为 fake node,而后在 kubemark kubernetes 中进行测试,从而测试 k8s 的治理面 (Master) 性能。
kubemark 我的项目编译及镜像制作
kubemark 源码位于 kubernetes 我的项目中,编辑及制作 kubemark 镜像是搭建 kubemark 集群的第一步。
筹备好 go 语言版本 1.17 以上的环境,环境中须要装置 docker,如果应用国内网络请自行配置 goproxy 及 docker 镜像减速源,而后执行命令:
mkdir -p $GOPATH/src/k8s.io/
cd $GOPATH/src/k8s.io/
git clone https://github.com/kubernetes/kubernetes.git
cd kubernetes
git checkout v1.20.10 # 此处为 kubemark k8s 对应的版本
./hack/build-go.sh cmd/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 命令看到:
此镜像后续须要在 external k8s 的 worker 节点中导入。
kubemark 集群搭建实战
如果是本人从头开始搭建,须要搭建两套 K8S 集群,一套为 external k8s,须要搭建 master+worker;另一套为 kubemark k8s,只须要 master 即可。能够应用 kubespray 搭建,或者应用 kubeadm 搭建,在本文中不赘述。
为不便演示,本次测试应用国内某云厂商提供的容器服务,创立两套 K8S 集群,配置如下:
external k8s:3 节点 Master(2 核 4G 云主机 +50G 数据盘) + 2 节点 Worker(4 核 8G 云主机 +50G 数据盘)
kubemark k8s:3 节点 Master(2 核 4G 云主机 +50G 数据盘)
将之前制作好的 kubemark 镜像导入 external k8s 的 worker 节点上,登录任意 external k8s 的 master 节点,执行以下操作:
1. 将 kubemark k8s 的 config 文件 (任意 kubemark k8s 主节点的 /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
3. 应用以下 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
期待 hollow pod 状态变为 running 即可
到 kubemark k8s 中,确认 hollow pod 曾经作为 hollow node 被注册到集群中:
至此,kubemark 集群搭建结束。若想调整 hollow node 的数量,能够通过 scale external k8s 上 hollow pod 的 rc 资源 replicas 的形式进行。
我会在前面的文章中应用此集群及 kbench 工具,解说如何对 k8s 管制面进行性能测试。