you are better than you think

kubernetes e2e test

· by thur · Read in about 2 min · (422 Words)
kubernetes e2e statefulset

一 背景描述

线上最大的集群增长即将达到社区的最大节点数,团队比较关注, 按照当前线上的使用方式单个集群能支撑到多大规模, 因此安排了这次测试。

二 测试版本及配置信息

kubernetes 1.12.4

硬件配置:

cpu mem disk
2*Intel-E5-2670v3 8*16G 12*300G

集群由294台M10构成, 单位:台

集群 etcd台数 master台数 node数
挂载集群 3 2 283
测试集群 3 3 8k(hollow-node)

三 模型简述:

1 社区认为每个node上30个pod是正常负载,因此饱和性测试最终生成8k*30=24w 个pod。 记录24w pod生成时间,计算出调度的吞吐量。这个过程主要是用用于模拟集群大面积故障 ,恢复全部服务的时间。 =》 Scheduling throughput

2 在饱和性测试基础上,额外生成8k pod,记录pod各个阶段所需耗时 => pod startup latancy

3 记录测试过程中GET LIST DELETE WATCH 资源的响应时间 => api responsiveness

四 测试结果

API Responsiveness

描述:记录测试过程中 LIST WATCH GET DELETE资源所需要的时间

结果:

Scheduling throughput

描述:饱和性测试,模拟启动 8K*30 =24w pod 所需要的时间

PodStartupLatancy

描述:饱和性测试后,额外生成8k pod ,通过pod/event时间戳 记录pod 各阶段耗时

指标 50 95 99 100
create_to_schedule(ms) - - - -
schedule_to_run(ms) - - - -
run_to_watch (ms) - - - -
schedule_to_watch (ms) - - - -
pod_startup (ms) - - - -

指标说明

create: pod的creationTimestamp

schedule: event中item的firsttime run: pod中所有running容器中最后一个容器的启动时间 watch:informer 发现pod处于running状态的时间

startup: watch.Time.Sub(create.Time)

五 测试问题记录

1 默认的namespace会携带uuid ,当前ipam不好提前录入

ns 命名规则

e2e-tests-density-{每个节点上的pod数30/50/95/100}-{0~79}-uuid(5位)

sts 命名规则

density-节点数*每个节点上pod数-{0~79}- 

2 hollow node 出现not ready问题

调整node-monitor-grace-period 或 临时delete node

3 实际使用率数据没有

全部放开node使用率,或者关闭使用率调度,建议前者

4 pod创建到running比较慢

ipam在裁撤机器上,重试次数和重试间隔较长,重新迁移后恢复

10s 平均 running 50个pod,24w pod粗略计算需要13小时

5 too many open files

容器创建到23.6w ,报错 too many files

1) 调大 LimitNOFILE=10000000 ,重启kube-apiserver

2) 测试使用vip ,分单测试压力,修改 hack/ginkgo-e2e.sh kube-master为–kube-master=«http://{vip}:{vport}»

六 测试脚本

 0# cm.yaml
 1apiVersion: v1
 2data:
 3  info: '{"capacity":{"milli_cpu":96000,"memory":403972714496,"ephemeral_storage":0,"allowed_pod_number":0,"scalar_resources":{"abc.com/volume":3574},"milli_cpu_online":0,"memory_online":0},"used":null,"max_used":{"milli_cpu":0,"memory":0,"ephemeral_storage":0,"allowed_pod_number":0,"scalar_resources":{"abc.com/volume":0},"milli_cpu_online":0,"memory_online":0},"pods":null}'
 4  interference: '{"exter":1.671202136871507,"inner":0,"throttle":0}'
 5  kubelet-upgrade-time: 2020-07-17
 6kind: ConfigMap
 7metadata:
 8  name: node-10.86.110.65
 9  namespace: default
10
11# test.sh
12# 注意替换 etcd的IP 测试会获取etcd db size 。不改会有warning
13
14export KUBE_ETCD_METRICS_CMD="curl  --cacert /etc/kubernetes/ssl/ca.pem --cert /etc/kubernetes/ssl/etcd-client.pem  --key /etc/kubernetes/ssl/etcd-client-key.pem  -L  https://100.69.112.54:2379/metrics"
15export GOPATH=/home/work/go
16export GOROOT=/home/work/local/go
17PATH=$GOPATH/bin:$GOROOT/bin:$PATH
18export PATH
19export GO111MODULE=off
20
21function usage(){
22    echo "$0 init|create_cm|build|run|clean"
23}
24
25function init() {
26    kubectl create ns kubemark
27    kubectl create configmap node-configmap -n kubemark --from-literal=content.type="test-cluster"
28    kubectl create configmap node-configmap -n kubemark --from-literal=content.type="test-cluster"
29    kubectl create secret generic kubeconfig --type=Opaque --namespace=kubemark --from-file=kubelet.kubeconfig=/etc/kubernetes/kubeconfig/kube-proxy.kubeconfig --from-file=kubeproxy.kubeconfig=/etc/kubernetes/kubeconfig/kube-proxy.kubeconfig
30}
31
32function build(){
33    make WHAT='test/e2e/e2e.test'
34    KUBE_GIT_VERSION_FILE=/home/work/go/src/k8s.io/kubernetes/VERSION make WAHT=cmd/kubectl
35    make WHAT=vendor/github.com/onsi/ginkgo/ginkgo
36}
37
38function create_cm() {
39    kubectl get node  --no-headers | awk '{print $1}'  |while read node
40do
41    sed  "s/10.86.110.65/$node/g"  cm.yaml | kubectl apply -f -
42done
43    #   for((i=0;i<8000;i++)); do sed "s/10.86.110.65/hollow-node-$i/g" cm.yaml  | kubectl apply -f - ; done
44}
45
46
47function run(){
48export KUBERNETES_CONFORMANCE_TEST=y
49export KUBERNETES_PROVIDER=local
50export KUBE_ROOT=/home/work/go/src/k8s.io/kubernetes
51KUBERNETES_PROVIDER=local go run hack/e2e.go --get=false --old=867400h0m0s --   --provider=local --test --test_args="--host=http://127.0.0.1:8080 --ginkgo.focus=\[Feature:Performance\]"
52}
53
54function clean(){
55kubectl get ns |grep "e2e-test" | awk '{print $1}' | xargs -n1 kubectl delete ns #--force --grace-period=0
56}
57
58action=$1
59case $action in
60    "init" )
61        init
62        ;;
63    "create_cm" )
64        create_cm
65        ;;
66    "build" )
67        build
68        ;;
69    "run" )
70       run
71        ;;
72    "clean" )
73        clean
74        ;;
75    * )
76        usage
77        ;;
78esac

测试集群搭建

版权所有,转载请注明作者和出处

Comments