kubernetes e2e test
一 背景描述
线上最大的集群增长即将达到社区的最大节点数,团队比较关注, 按照当前线上的使用方式单个集群能支撑到多大规模, 因此安排了这次测试。
二 测试版本及配置信息
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
测试集群搭建
略